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: James Bottomley <James.Bottomley@suse.de> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
This commit is contained in:
parent
c125e96f04
commit
12e4d0cc2e
|
@ -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)
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue