Lines Matching +full:re +full:-
1 // SPDX-License-Identifier: GPL-2.0-only
3 * klist.c - Routines for manipulating klists.
20 * It works using a 3rd object type - struct klist_iter - that is declared
50 ((unsigned long)knode->n_klist & KNODE_KLIST_MASK); in knode_klist()
55 return (unsigned long)knode->n_klist & KNODE_DEAD; in knode_dead()
60 knode->n_klist = klist; in knode_set_klist()
67 /* and no knode should die twice ever either, see we're very humane */ in knode_kill()
69 *(unsigned long *)&knode->n_klist |= KNODE_DEAD; in knode_kill()
73 * klist_init - Initialize a klist structure.
74 * @k: The klist we're initializing.
87 INIT_LIST_HEAD(&k->k_list); in klist_init()
88 spin_lock_init(&k->k_lock); in klist_init()
89 k->get = get; in klist_init()
90 k->put = put; in klist_init()
96 spin_lock(&k->k_lock); in add_head()
97 list_add(&n->n_node, &k->k_list); in add_head()
98 spin_unlock(&k->k_lock); in add_head()
103 spin_lock(&k->k_lock); in add_tail()
104 list_add_tail(&n->n_node, &k->k_list); in add_tail()
105 spin_unlock(&k->k_lock); in add_tail()
110 INIT_LIST_HEAD(&n->n_node); in klist_node_init()
111 kref_init(&n->n_ref); in klist_node_init()
113 if (k->get) in klist_node_init()
114 k->get(n); in klist_node_init()
118 * klist_add_head - Initialize a klist_node and add it to front.
119 * @n: node we're adding.
130 * klist_add_tail - Initialize a klist_node and add it to back.
131 * @n: node we're adding.
142 * klist_add_behind - Init a klist_node and add it after an existing node
143 * @n: node we're adding.
151 spin_lock(&k->k_lock); in klist_add_behind()
152 list_add(&n->n_node, &pos->n_node); in klist_add_behind()
153 spin_unlock(&k->k_lock); in klist_add_behind()
158 * klist_add_before - Init a klist_node and add it before an existing node
159 * @n: node we're adding.
167 spin_lock(&k->k_lock); in klist_add_before()
168 list_add_tail(&n->n_node, &pos->n_node); in klist_add_before()
169 spin_unlock(&k->k_lock); in klist_add_before()
189 list_del(&n->n_node); in klist_release()
192 if (waiter->node != n) in klist_release()
195 list_del(&waiter->list); in klist_release()
196 waiter->woken = 1; in klist_release()
198 wake_up_process(waiter->process); in klist_release()
206 return kref_put(&n->n_ref, klist_release); in klist_dec_and_del()
212 void (*put)(struct klist_node *) = k->put; in klist_put()
214 spin_lock(&k->k_lock); in klist_put()
219 spin_unlock(&k->k_lock); in klist_put()
225 * klist_del - Decrement the reference count of node and try to remove.
226 * @n: node we're deleting.
235 * klist_remove - Decrement the refcount of node and wait for it to go away.
236 * @n: node we're removing.
262 * klist_node_attached - Say whether a node is bound to a list or not.
263 * @n: Node that we're testing.
267 return (n->n_klist != NULL); in klist_node_attached()
272 * klist_iter_init_node - Initialize a klist_iter structure.
273 * @k: klist we're iterating.
274 * @i: klist_iter we're filling.
283 i->i_klist = k; in klist_iter_init_node()
284 i->i_cur = NULL; in klist_iter_init_node()
285 if (n && kref_get_unless_zero(&n->n_ref)) in klist_iter_init_node()
286 i->i_cur = n; in klist_iter_init_node()
291 * klist_iter_init - Iniitalize a klist_iter structure.
292 * @k: klist we're iterating.
293 * @i: klist_iter structure we're filling.
304 * klist_iter_exit - Finish a list iteration.
313 if (i->i_cur) { in klist_iter_exit()
314 klist_put(i->i_cur, false); in klist_iter_exit()
315 i->i_cur = NULL; in klist_iter_exit()
326 * klist_prev - Ante up prev node in list.
335 void (*put)(struct klist_node *) = i->i_klist->put; in klist_prev()
336 struct klist_node *last = i->i_cur; in klist_prev()
340 spin_lock_irqsave(&i->i_klist->k_lock, flags); in klist_prev()
343 prev = to_klist_node(last->n_node.prev); in klist_prev()
347 prev = to_klist_node(i->i_klist->k_list.prev); in klist_prev()
349 i->i_cur = NULL; in klist_prev()
350 while (prev != to_klist_node(&i->i_klist->k_list)) { in klist_prev()
352 kref_get(&prev->n_ref); in klist_prev()
353 i->i_cur = prev; in klist_prev()
356 prev = to_klist_node(prev->n_node.prev); in klist_prev()
359 spin_unlock_irqrestore(&i->i_klist->k_lock, flags); in klist_prev()
363 return i->i_cur; in klist_prev()
368 * klist_next - Ante up next node in list.
377 void (*put)(struct klist_node *) = i->i_klist->put; in klist_next()
378 struct klist_node *last = i->i_cur; in klist_next()
382 spin_lock_irqsave(&i->i_klist->k_lock, flags); in klist_next()
385 next = to_klist_node(last->n_node.next); in klist_next()
389 next = to_klist_node(i->i_klist->k_list.next); in klist_next()
391 i->i_cur = NULL; in klist_next()
392 while (next != to_klist_node(&i->i_klist->k_list)) { in klist_next()
394 kref_get(&next->n_ref); in klist_next()
395 i->i_cur = next; in klist_next()
398 next = to_klist_node(next->n_node.next); in klist_next()
401 spin_unlock_irqrestore(&i->i_klist->k_lock, flags); in klist_next()
405 return i->i_cur; in klist_next()