plist: Add plist_last
authorJames Bottomley <James.Bottomley@suse.de>
Thu, 1 Jul 2010 19:46:36 +0000 (21:46 +0200)
committerRafael J. Wysocki <rjw@sisk.pl>
Sun, 18 Jul 2010 23:58:48 +0000 (01:58 +0200)
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>
include/linux/plist.h

index 6898985e7b387b6d9175827641be6ad82e51f409..7254eda078e5ad33231e5284ecb9d893d452631a 100644 (file)
@@ -259,6 +259,23 @@ static inline int plist_node_empty(const struct plist_node *node)
        container_of(plist_first(head), type, member)
 #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)
  * @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);
 }
 
+/**
+ * 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