0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LINUX_KLIST_H
0011 #define _LINUX_KLIST_H
0012
0013 #include <linux/spinlock.h>
0014 #include <linux/kref.h>
0015 #include <linux/list.h>
0016
0017 struct klist_node;
0018 struct klist {
0019 spinlock_t k_lock;
0020 struct list_head k_list;
0021 void (*get)(struct klist_node *);
0022 void (*put)(struct klist_node *);
0023 } __attribute__ ((aligned (sizeof(void *))));
0024
0025 #define KLIST_INIT(_name, _get, _put) \
0026 { .k_lock = __SPIN_LOCK_UNLOCKED(_name.k_lock), \
0027 .k_list = LIST_HEAD_INIT(_name.k_list), \
0028 .get = _get, \
0029 .put = _put, }
0030
0031 #define DEFINE_KLIST(_name, _get, _put) \
0032 struct klist _name = KLIST_INIT(_name, _get, _put)
0033
0034 extern void klist_init(struct klist *k, void (*get)(struct klist_node *),
0035 void (*put)(struct klist_node *));
0036
0037 struct klist_node {
0038 void *n_klist;
0039 struct list_head n_node;
0040 struct kref n_ref;
0041 };
0042
0043 extern void klist_add_tail(struct klist_node *n, struct klist *k);
0044 extern void klist_add_head(struct klist_node *n, struct klist *k);
0045 extern void klist_add_behind(struct klist_node *n, struct klist_node *pos);
0046 extern void klist_add_before(struct klist_node *n, struct klist_node *pos);
0047
0048 extern void klist_del(struct klist_node *n);
0049 extern void klist_remove(struct klist_node *n);
0050
0051 extern int klist_node_attached(struct klist_node *n);
0052
0053
0054 struct klist_iter {
0055 struct klist *i_klist;
0056 struct klist_node *i_cur;
0057 };
0058
0059
0060 extern void klist_iter_init(struct klist *k, struct klist_iter *i);
0061 extern void klist_iter_init_node(struct klist *k, struct klist_iter *i,
0062 struct klist_node *n);
0063 extern void klist_iter_exit(struct klist_iter *i);
0064 extern struct klist_node *klist_prev(struct klist_iter *i);
0065 extern struct klist_node *klist_next(struct klist_iter *i);
0066
0067 #endif