File Index
Files and directories
Sign in
FILE

slist.h

File preview with syntax highlighting.

linux-6.19.14/io_uring/slist.h C
  1#ifndef INTERNAL_IO_SLIST_H
  2#define INTERNAL_IO_SLIST_H
  3
  4#include <linux/io_uring_types.h>
  5
  6#define __wq_list_for_each(pos, head)				\
  7	for (pos = (head)->first; pos; pos = (pos)->next)
  8
  9#define wq_list_for_each(pos, prv, head)			\
 10	for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next)
 11
 12#define wq_list_for_each_resume(pos, prv)			\
 13	for (; pos; prv = pos, pos = (pos)->next)
 14
 15#define wq_list_empty(list)	(READ_ONCE((list)->first) == NULL)
 16
 17#define INIT_WQ_LIST(list)	do {				\
 18	(list)->first = NULL;					\
 19} while (0)
 20
 21static inline void wq_list_add_after(struct io_wq_work_node *node,
 22				     struct io_wq_work_node *pos,
 23				     struct io_wq_work_list *list)
 24{
 25	struct io_wq_work_node *next = pos->next;
 26
 27	pos->next = node;
 28	node->next = next;
 29	if (!next)
 30		list->last = node;
 31}
 32
 33static inline void wq_list_add_tail(struct io_wq_work_node *node,
 34				    struct io_wq_work_list *list)
 35{
 36	node->next = NULL;
 37	if (!list->first) {
 38		list->last = node;
 39		WRITE_ONCE(list->first, node);
 40	} else {
 41		list->last->next = node;
 42		list->last = node;
 43	}
 44}
 45
 46static inline void wq_list_add_head(struct io_wq_work_node *node,
 47				    struct io_wq_work_list *list)
 48{
 49	node->next = list->first;
 50	if (!node->next)
 51		list->last = node;
 52	WRITE_ONCE(list->first, node);
 53}
 54
 55static inline void wq_list_cut(struct io_wq_work_list *list,
 56			       struct io_wq_work_node *last,
 57			       struct io_wq_work_node *prev)
 58{
 59	/* first in the list, if prev==NULL */
 60	if (!prev)
 61		WRITE_ONCE(list->first, last->next);
 62	else
 63		prev->next = last->next;
 64
 65	if (last == list->last)
 66		list->last = prev;
 67	last->next = NULL;
 68}
 69
 70static inline void wq_stack_add_head(struct io_wq_work_node *node,
 71				     struct io_wq_work_node *stack)
 72{
 73	node->next = stack->next;
 74	stack->next = node;
 75}
 76
 77static inline void wq_list_del(struct io_wq_work_list *list,
 78			       struct io_wq_work_node *node,
 79			       struct io_wq_work_node *prev)
 80{
 81	wq_list_cut(list, node, prev);
 82}
 83
 84static inline
 85struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack)
 86{
 87	struct io_wq_work_node *node = stack->next;
 88
 89	stack->next = node->next;
 90	return node;
 91}
 92
 93static inline struct io_wq_work *wq_next_work(struct io_wq_work *work)
 94{
 95	if (!work->list.next)
 96		return NULL;
 97
 98	return container_of(work->list.next, struct io_wq_work, list);
 99}
100
101#endif // INTERNAL_IO_SLIST_H
~/ Read-only file preview.