Commit 12e4d0cc authored by James Bottomley's avatar James Bottomley Committed by Rafael J. Wysocki

plist: Add plist_last

plist is currently used by the scheduler, which only needs to know the
highest item in the list.  This adds plist_last which allows you to
find the lowest.  This is necessary for using plists to implement a
fast search of dynamic ranges in pm_qos which can have both highest
and lowest criteria.
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent c125e96f
...@@ -259,6 +259,23 @@ static inline int plist_node_empty(const struct plist_node *node) ...@@ -259,6 +259,23 @@ static inline int plist_node_empty(const struct plist_node *node)
container_of(plist_first(head), type, member) container_of(plist_first(head), type, member)
#endif #endif
/**
* plist_last_entry - get the struct for the last entry
* @head: the &struct plist_head pointer
* @type: the type of the struct this is embedded in
* @member: the name of the list_struct within the struct
*/
#ifdef CONFIG_DEBUG_PI_LIST
# define plist_last_entry(head, type, member) \
({ \
WARN_ON(plist_head_empty(head)); \
container_of(plist_last(head), type, member); \
})
#else
# define plist_last_entry(head, type, member) \
container_of(plist_last(head), type, member)
#endif
/** /**
* 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
...@@ -271,4 +288,16 @@ static inline struct plist_node *plist_first(const struct plist_head *head) ...@@ -271,4 +288,16 @@ static inline struct plist_node *plist_first(const struct plist_head *head)
struct plist_node, plist.node_list); struct plist_node, plist.node_list);
} }
/**
* plist_last - return the last node (and thus, lowest priority)
* @head: the &struct plist_head pointer
*
* Assumes the plist is _not_ empty.
*/
static inline struct plist_node *plist_last(const struct plist_head *head)
{
return list_entry(head->node_list.prev,
struct plist_node, plist.node_list);
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment