1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Descending-priority-sorted double-linked list
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (C) 2002-2003 Intel Corp
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>.
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 2001-2005 (c) MontaVista Software, Inc.
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Daniel Walker <dwalker@mvista.com>
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (C) 2005 Thomas Gleixner <tglx@linutronix.de>
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Simplifications of the original code by
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Oleg Nesterov <oleg@tv-sign.ru>
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Licensed under the FSF's GNU Public License v2 or later.
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Based on simple lists (include/linux/list.h).
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is a priority-sorted list of nodes; each node has a
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * priority from INT_MIN (highest) to INT_MAX (lowest).
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Addition is O(K), removal is O(1), change of priority of a node is
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * O(K) and K is the number of RT priority levels used in the system.
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (1 <= K <= 99)
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This list is really a list of lists:
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  - The tier 1 list is the prio_list, different priority nodes.
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *  - The tier 2 list is the node_list, serialized nodes.
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Simple ASCII art explanation:
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |HEAD          |
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |              |
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |prio_list.prev|<------------------------------------|
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |prio_list.next|<->|pl|<->|pl|<--------------->|pl|<-|
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |10            |   |10|   |21|   |21|   |21|   |40|   (prio)
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |              |   |  |   |  |   |  |   |  |   |  |
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |              |   |  |   |  |   |  |   |  |   |  |
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |node_list.next|<->|nl|<->|nl|<->|nl|<->|nl|<->|nl|<-|
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * |node_list.prev|<------------------------------------|
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The nodes on the prio_list list are sorted by priority to simplify
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the insertion of new nodes. There are no nodes with duplicate
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * priorites on the list.
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The nodes on the node_list is ordered by priority and can contain
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * entries which have the same priority. Those entries are ordered
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * FIFO
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Addition means: look for the prio_list node in the prio_list
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * for the priority of the node and insert it before the node_list
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * entry of the next prio_list node. If it is the first node of
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * that priority, add it to the prio_list in the right position and
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * insert it into the serialized node_list list
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Removal means remove it from the node_list and remove it from
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the prio_list if the node_list list_head is non empty. In case
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * of removal from the prio_list it must be checked whether other
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * entries of the same priority are on the list or not. If there
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is another entry of the same priority then this entry has to
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * replace the removed entry on the prio_list. If the entry which
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is removed is the only entry of this priority then a simple
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * remove from both list is sufficient.
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * INT_MIN is the highest priority, 0 is the medium highest, INT_MAX
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is lowest priority.
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * No locking is done, up to the caller.
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_PLIST_H_
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_PLIST_H_
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/kernel.h>
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h>
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/spinlock_types.h>
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct plist_head {
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head prio_list;
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head node_list;
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_PI_LIST
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	spinlock_t *lock;
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct plist_node {
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int			prio;
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct plist_head	plist;
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_PI_LIST
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define PLIST_HEAD_LOCK_INIT(_lock)	.lock = _lock
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define PLIST_HEAD_LOCK_INIT(_lock)
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * #PLIST_HEAD_INIT - static struct plist_head initializer
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	struct plist_head variable name
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PLIST_HEAD_INIT(head, _lock)			\
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{							\
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.prio_list = LIST_HEAD_INIT((head).prio_list),	\
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.node_list = LIST_HEAD_INIT((head).node_list),	\
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	PLIST_HEAD_LOCK_INIT(&(_lock))			\
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * #PLIST_NODE_INIT - static struct plist_node initializer
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @node:	struct plist_node variable name
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @__prio:	initial node priority
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PLIST_NODE_INIT(node, __prio)			\
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{							\
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.prio  = (__prio),				\
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.plist = PLIST_HEAD_INIT((node).plist, NULL),	\
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_head_init - dynamic struct plist_head initializer
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	&struct plist_head pointer
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruplist_head_init(struct plist_head *head, spinlock_t *lock)
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	INIT_LIST_HEAD(&head->prio_list);
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	INIT_LIST_HEAD(&head->node_list);
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_PI_LIST
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	head->lock = lock;
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_node_init - Dynamic struct plist_node initializer
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @node:	&struct plist_node pointer
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @prio:	initial node priority
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void plist_node_init(struct plist_node *node, int prio)
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	node->prio = prio;
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	plist_head_init(&node->plist, NULL);
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void plist_add(struct plist_node *node, struct plist_head *head);
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void plist_del(struct plist_node *node, struct plist_head *head);
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_for_each - iterate over the plist
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @pos1:	the type * to use as a loop counter.
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	the head for your list.
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define plist_for_each(pos, head)	\
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 list_for_each_entry(pos, &(head)->node_list, plist.node_list)
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_for_each_entry_safe - iterate over a plist of given type safe
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * against removal of list entry
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @pos1:	the type * to use as a loop counter.
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @n1:	another type * to use as temporary storage
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	the head for your list.
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define plist_for_each_safe(pos, n, head)	\
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 list_for_each_entry_safe(pos, n, &(head)->node_list, plist.node_list)
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_for_each_entry	- iterate over list of given type
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @pos:	the type * to use as a loop counter.
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	the head for your list.
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @member:	the name of the list_struct within the struct.
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define plist_for_each_entry(pos, head, mem)	\
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	 list_for_each_entry(pos, &(head)->node_list, mem.plist.node_list)
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_for_each_entry_safe - iterate over list of given type safe against
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * removal of list entry
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @pos:	the type * to use as a loop counter.
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @n:		another type * to use as temporary storage
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	the head for your list.
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @m:		the name of the list_struct within the struct.
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define plist_for_each_entry_safe(pos, n, head, m)	\
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	list_for_each_entry_safe(pos, n, &(head)->node_list, m.plist.node_list)
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_head_empty - return !0 if a plist_head is empty
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	&struct plist_head pointer
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int plist_head_empty(const struct plist_head *head)
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return list_empty(&head->node_list);
203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_node_empty - return !0 if plist_node is not on a list
207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @node:	&struct plist_node pointer
209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int plist_node_empty(const struct plist_node *node)
211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return plist_head_empty(&node->plist);
213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* All functions below assume the plist_head is not empty. */
216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_first_entry - get the struct for the first entry
219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ptr:	the &struct plist_head pointer.
221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @type:	the type of the struct this is embedded in.
222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @member:	the name of the list_struct within the struct.
223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_DEBUG_PI_LIST
225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define plist_first_entry(head, type, member)	\
226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru({ \
227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	WARN_ON(plist_head_empty(head)); \
228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	container_of(plist_first(head), type, member); \
229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru})
230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define plist_first_entry(head, type, member)	\
232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	container_of(plist_first(head), type, member)
233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/**
236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * plist_first - return the first node (and thus, highest priority)
237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @head:	the &struct plist_head pointer
239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Assumes the plist is _not_ empty.
241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct plist_node* plist_first(const struct plist_head *head)
243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return list_entry(head->node_list.next,
245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			  struct plist_node, plist.node_list);
246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
249