Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd16618e authored by Dan Streetman's avatar Dan Streetman Committed by Linus Torvalds
Browse files

lib/plist: add helper functions



Add PLIST_HEAD() to plist.h, equivalent to LIST_HEAD() from list.h, to
define and initialize a struct plist_head.

Add plist_for_each_continue() and plist_for_each_entry_continue(),
equivalent to list_for_each_continue() and list_for_each_entry_continue(),
to iterate over a plist continuing after the current position.

Add plist_prev() and plist_next(), equivalent to (struct list_head*)->prev
and ->next, implemented by list_prev_entry() and list_next_entry(), to
access the prev/next struct plist_node entry.  These are needed because
unlike struct list_head, direct access of the prev/next struct plist_node
isn't possible; the list must be navigated via the contained struct
list_head.  e.g.  instead of accessing the prev by list_prev_entry(node,
node_list) it can be accessed by plist_prev(node).

Signed-off-by: default avatarDan Streetman <ddstreet@ieee.org>
Acked-by: default avatarMel Gorman <mgorman@suse.de>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Shaohua Li <shli@fusionio.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Dan Streetman <ddstreet@ieee.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
Cc: Weijie Yang <weijieut@gmail.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Bob Liu <bob.liu@oracle.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent adfab836
Loading
Loading
Loading
Loading
+43 −0
Original line number Original line Diff line number Diff line
@@ -97,6 +97,13 @@ struct plist_node {
	.node_list = LIST_HEAD_INIT((head).node_list)	\
	.node_list = LIST_HEAD_INIT((head).node_list)	\
}
}


/**
 * PLIST_HEAD - declare and init plist_head
 * @head:	name for struct plist_head variable
 */
#define PLIST_HEAD(head) \
	struct plist_head head = PLIST_HEAD_INIT(head)

/**
/**
 * PLIST_NODE_INIT - static struct plist_node initializer
 * PLIST_NODE_INIT - static struct plist_node initializer
 * @node:	struct plist_node variable name
 * @node:	struct plist_node variable name
@@ -142,6 +149,16 @@ extern void plist_del(struct plist_node *node, struct plist_head *head);
#define plist_for_each(pos, head)	\
#define plist_for_each(pos, head)	\
	 list_for_each_entry(pos, &(head)->node_list, node_list)
	 list_for_each_entry(pos, &(head)->node_list, node_list)


/**
 * plist_for_each_continue - continue iteration over the plist
 * @pos:	the type * to use as a loop cursor
 * @head:	the head for your list
 *
 * Continue to iterate over plist, continuing after the current position.
 */
#define plist_for_each_continue(pos, head)	\
	 list_for_each_entry_continue(pos, &(head)->node_list, node_list)

/**
/**
 * plist_for_each_safe - iterate safely over a plist of given type
 * plist_for_each_safe - iterate safely over a plist of given type
 * @pos:	the type * to use as a loop counter
 * @pos:	the type * to use as a loop counter
@@ -162,6 +179,18 @@ extern void plist_del(struct plist_node *node, struct plist_head *head);
#define plist_for_each_entry(pos, head, mem)	\
#define plist_for_each_entry(pos, head, mem)	\
	 list_for_each_entry(pos, &(head)->node_list, mem.node_list)
	 list_for_each_entry(pos, &(head)->node_list, mem.node_list)


/**
 * plist_for_each_entry_continue - continue iteration over list of given type
 * @pos:	the type * to use as a loop cursor
 * @head:	the head for your list
 * @m:		the name of the list_struct within the struct
 *
 * Continue to iterate over list of given type, continuing after
 * the current position.
 */
#define plist_for_each_entry_continue(pos, head, m)	\
	list_for_each_entry_continue(pos, &(head)->node_list, m.node_list)

/**
/**
 * plist_for_each_entry_safe - iterate safely over list of given type
 * plist_for_each_entry_safe - iterate safely over list of given type
 * @pos:	the type * to use as a loop counter
 * @pos:	the type * to use as a loop counter
@@ -228,6 +257,20 @@ static inline int plist_node_empty(const struct plist_node *node)
	container_of(plist_last(head), type, member)
	container_of(plist_last(head), type, member)
#endif
#endif


/**
 * plist_next - get the next entry in list
 * @pos:	the type * to cursor
 */
#define plist_next(pos) \
	list_next_entry(pos, node_list)

/**
 * plist_prev - get the prev entry in list
 * @pos:	the type * to cursor
 */
#define plist_prev(pos) \
	list_prev_entry(pos, node_list)

/**
/**
 * plist_first - return the first node (and thus, highest priority)
 * plist_first - return the first node (and thus, highest priority)
 * @head:	the &struct plist_head pointer
 * @head:	the &struct plist_head pointer