xref: /OK3568_Linux_fs/kernel/include/linux/klist.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *	klist.h - Some generic list helpers, extending struct list_head a bit.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *	Implementations are found in lib/klist.c
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *	Copyright (C) 2005 Patrick Mochel
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef _LINUX_KLIST_H
11*4882a593Smuzhiyun #define _LINUX_KLIST_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/spinlock.h>
14*4882a593Smuzhiyun #include <linux/kref.h>
15*4882a593Smuzhiyun #include <linux/list.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct klist_node;
18*4882a593Smuzhiyun struct klist {
19*4882a593Smuzhiyun 	spinlock_t		k_lock;
20*4882a593Smuzhiyun 	struct list_head	k_list;
21*4882a593Smuzhiyun 	void			(*get)(struct klist_node *);
22*4882a593Smuzhiyun 	void			(*put)(struct klist_node *);
23*4882a593Smuzhiyun } __attribute__ ((aligned (sizeof(void *))));
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define KLIST_INIT(_name, _get, _put)					\
26*4882a593Smuzhiyun 	{ .k_lock	= __SPIN_LOCK_UNLOCKED(_name.k_lock),		\
27*4882a593Smuzhiyun 	  .k_list	= LIST_HEAD_INIT(_name.k_list),			\
28*4882a593Smuzhiyun 	  .get		= _get,						\
29*4882a593Smuzhiyun 	  .put		= _put, }
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define DEFINE_KLIST(_name, _get, _put)					\
32*4882a593Smuzhiyun 	struct klist _name = KLIST_INIT(_name, _get, _put)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun extern void klist_init(struct klist *k, void (*get)(struct klist_node *),
35*4882a593Smuzhiyun 		       void (*put)(struct klist_node *));
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct klist_node {
38*4882a593Smuzhiyun 	void			*n_klist;	/* never access directly */
39*4882a593Smuzhiyun 	struct list_head	n_node;
40*4882a593Smuzhiyun 	struct kref		n_ref;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun extern void klist_add_tail(struct klist_node *n, struct klist *k);
44*4882a593Smuzhiyun extern void klist_add_head(struct klist_node *n, struct klist *k);
45*4882a593Smuzhiyun extern void klist_add_behind(struct klist_node *n, struct klist_node *pos);
46*4882a593Smuzhiyun extern void klist_add_before(struct klist_node *n, struct klist_node *pos);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun extern void klist_del(struct klist_node *n);
49*4882a593Smuzhiyun extern void klist_remove(struct klist_node *n);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun extern int klist_node_attached(struct klist_node *n);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct klist_iter {
55*4882a593Smuzhiyun 	struct klist		*i_klist;
56*4882a593Smuzhiyun 	struct klist_node	*i_cur;
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun extern void klist_iter_init(struct klist *k, struct klist_iter *i);
61*4882a593Smuzhiyun extern void klist_iter_init_node(struct klist *k, struct klist_iter *i,
62*4882a593Smuzhiyun 				 struct klist_node *n);
63*4882a593Smuzhiyun extern void klist_iter_exit(struct klist_iter *i);
64*4882a593Smuzhiyun extern struct klist_node *klist_prev(struct klist_iter *i);
65*4882a593Smuzhiyun extern struct klist_node *klist_next(struct klist_iter *i);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #endif
68