mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-18 22:14:16 +00:00 
			
		
		
		
	io_uring: move list helpers to a separate file
It's annoying to have io-wq.h as a dependency every time we want some of struct io_wq_work_list helpers, move them into a separate file. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/c1d891ce12b30767d1d2a3b7db2ca3abc1ecc4a2.1655802465.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									625d38b3fd
								
							
						
					
					
						commit
						a6b21fbb4c
					
				
					 4 changed files with 140 additions and 131 deletions
				
			
		|  | @ -18,6 +18,7 @@ | |||
| #include <uapi/linux/io_uring.h> | ||||
| 
 | ||||
| #include "io-wq.h" | ||||
| #include "slist.h" | ||||
| 
 | ||||
| #define WORKER_IDLE_TIMEOUT	(5 * HZ) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										131
									
								
								io_uring/io-wq.h
									
										
									
									
									
								
							
							
						
						
									
										131
									
								
								io_uring/io-wq.h
									
										
									
									
									
								
							|  | @ -21,137 +21,6 @@ enum io_wq_cancel { | |||
| 	IO_WQ_CANCEL_NOTFOUND,	/* work not found */ | ||||
| }; | ||||
| 
 | ||||
| #define wq_list_for_each(pos, prv, head)			\ | ||||
| 	for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next) | ||||
| 
 | ||||
| #define wq_list_for_each_resume(pos, prv)			\ | ||||
| 	for (; pos; prv = pos, pos = (pos)->next) | ||||
| 
 | ||||
| #define wq_list_empty(list)	(READ_ONCE((list)->first) == NULL) | ||||
| #define INIT_WQ_LIST(list)	do {				\ | ||||
| 	(list)->first = NULL;					\ | ||||
| } while (0) | ||||
| 
 | ||||
| static inline void wq_list_add_after(struct io_wq_work_node *node, | ||||
| 				     struct io_wq_work_node *pos, | ||||
| 				     struct io_wq_work_list *list) | ||||
| { | ||||
| 	struct io_wq_work_node *next = pos->next; | ||||
| 
 | ||||
| 	pos->next = node; | ||||
| 	node->next = next; | ||||
| 	if (!next) | ||||
| 		list->last = node; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * wq_list_merge - merge the second list to the first one. | ||||
|  * @list0: the first list | ||||
|  * @list1: the second list | ||||
|  * Return the first node after mergence. | ||||
|  */ | ||||
| static inline struct io_wq_work_node *wq_list_merge(struct io_wq_work_list *list0, | ||||
| 						    struct io_wq_work_list *list1) | ||||
| { | ||||
| 	struct io_wq_work_node *ret; | ||||
| 
 | ||||
| 	if (!list0->first) { | ||||
| 		ret = list1->first; | ||||
| 	} else { | ||||
| 		ret = list0->first; | ||||
| 		list0->last->next = list1->first; | ||||
| 	} | ||||
| 	INIT_WQ_LIST(list0); | ||||
| 	INIT_WQ_LIST(list1); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_add_tail(struct io_wq_work_node *node, | ||||
| 				    struct io_wq_work_list *list) | ||||
| { | ||||
| 	node->next = NULL; | ||||
| 	if (!list->first) { | ||||
| 		list->last = node; | ||||
| 		WRITE_ONCE(list->first, node); | ||||
| 	} else { | ||||
| 		list->last->next = node; | ||||
| 		list->last = node; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_add_head(struct io_wq_work_node *node, | ||||
| 				    struct io_wq_work_list *list) | ||||
| { | ||||
| 	node->next = list->first; | ||||
| 	if (!node->next) | ||||
| 		list->last = node; | ||||
| 	WRITE_ONCE(list->first, node); | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_cut(struct io_wq_work_list *list, | ||||
| 			       struct io_wq_work_node *last, | ||||
| 			       struct io_wq_work_node *prev) | ||||
| { | ||||
| 	/* first in the list, if prev==NULL */ | ||||
| 	if (!prev) | ||||
| 		WRITE_ONCE(list->first, last->next); | ||||
| 	else | ||||
| 		prev->next = last->next; | ||||
| 
 | ||||
| 	if (last == list->last) | ||||
| 		list->last = prev; | ||||
| 	last->next = NULL; | ||||
| } | ||||
| 
 | ||||
| static inline void __wq_list_splice(struct io_wq_work_list *list, | ||||
| 				    struct io_wq_work_node *to) | ||||
| { | ||||
| 	list->last->next = to->next; | ||||
| 	to->next = list->first; | ||||
| 	INIT_WQ_LIST(list); | ||||
| } | ||||
| 
 | ||||
| static inline bool wq_list_splice(struct io_wq_work_list *list, | ||||
| 				  struct io_wq_work_node *to) | ||||
| { | ||||
| 	if (!wq_list_empty(list)) { | ||||
| 		__wq_list_splice(list, to); | ||||
| 		return true; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| static inline void wq_stack_add_head(struct io_wq_work_node *node, | ||||
| 				     struct io_wq_work_node *stack) | ||||
| { | ||||
| 	node->next = stack->next; | ||||
| 	stack->next = node; | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_del(struct io_wq_work_list *list, | ||||
| 			       struct io_wq_work_node *node, | ||||
| 			       struct io_wq_work_node *prev) | ||||
| { | ||||
| 	wq_list_cut(list, node, prev); | ||||
| } | ||||
| 
 | ||||
| static inline | ||||
| struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack) | ||||
| { | ||||
| 	struct io_wq_work_node *node = stack->next; | ||||
| 
 | ||||
| 	stack->next = node->next; | ||||
| 	return node; | ||||
| } | ||||
| 
 | ||||
| static inline struct io_wq_work *wq_next_work(struct io_wq_work *work) | ||||
| { | ||||
| 	if (!work->list.next) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	return container_of(work->list.next, struct io_wq_work, list); | ||||
| } | ||||
| 
 | ||||
| typedef struct io_wq_work *(free_work_fn)(struct io_wq_work *); | ||||
| typedef void (io_wq_work_fn)(struct io_wq_work *); | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| #include <linux/lockdep.h> | ||||
| #include <linux/io_uring_types.h> | ||||
| #include "io-wq.h" | ||||
| #include "slist.h" | ||||
| #include "filetable.h" | ||||
| 
 | ||||
| #ifndef CREATE_TRACE_POINTS | ||||
|  |  | |||
							
								
								
									
										138
									
								
								io_uring/slist.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								io_uring/slist.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,138 @@ | |||
| #ifndef INTERNAL_IO_SLIST_H | ||||
| #define INTERNAL_IO_SLIST_H | ||||
| 
 | ||||
| #include <linux/io_uring_types.h> | ||||
| 
 | ||||
| #define wq_list_for_each(pos, prv, head)			\ | ||||
| 	for (pos = (head)->first, prv = NULL; pos; prv = pos, pos = (pos)->next) | ||||
| 
 | ||||
| #define wq_list_for_each_resume(pos, prv)			\ | ||||
| 	for (; pos; prv = pos, pos = (pos)->next) | ||||
| 
 | ||||
| #define wq_list_empty(list)	(READ_ONCE((list)->first) == NULL) | ||||
| 
 | ||||
| #define INIT_WQ_LIST(list)	do {				\ | ||||
| 	(list)->first = NULL;					\ | ||||
| } while (0) | ||||
| 
 | ||||
| static inline void wq_list_add_after(struct io_wq_work_node *node, | ||||
| 				     struct io_wq_work_node *pos, | ||||
| 				     struct io_wq_work_list *list) | ||||
| { | ||||
| 	struct io_wq_work_node *next = pos->next; | ||||
| 
 | ||||
| 	pos->next = node; | ||||
| 	node->next = next; | ||||
| 	if (!next) | ||||
| 		list->last = node; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * wq_list_merge - merge the second list to the first one. | ||||
|  * @list0: the first list | ||||
|  * @list1: the second list | ||||
|  * Return the first node after mergence. | ||||
|  */ | ||||
| static inline struct io_wq_work_node *wq_list_merge(struct io_wq_work_list *list0, | ||||
| 						    struct io_wq_work_list *list1) | ||||
| { | ||||
| 	struct io_wq_work_node *ret; | ||||
| 
 | ||||
| 	if (!list0->first) { | ||||
| 		ret = list1->first; | ||||
| 	} else { | ||||
| 		ret = list0->first; | ||||
| 		list0->last->next = list1->first; | ||||
| 	} | ||||
| 	INIT_WQ_LIST(list0); | ||||
| 	INIT_WQ_LIST(list1); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_add_tail(struct io_wq_work_node *node, | ||||
| 				    struct io_wq_work_list *list) | ||||
| { | ||||
| 	node->next = NULL; | ||||
| 	if (!list->first) { | ||||
| 		list->last = node; | ||||
| 		WRITE_ONCE(list->first, node); | ||||
| 	} else { | ||||
| 		list->last->next = node; | ||||
| 		list->last = node; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_add_head(struct io_wq_work_node *node, | ||||
| 				    struct io_wq_work_list *list) | ||||
| { | ||||
| 	node->next = list->first; | ||||
| 	if (!node->next) | ||||
| 		list->last = node; | ||||
| 	WRITE_ONCE(list->first, node); | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_cut(struct io_wq_work_list *list, | ||||
| 			       struct io_wq_work_node *last, | ||||
| 			       struct io_wq_work_node *prev) | ||||
| { | ||||
| 	/* first in the list, if prev==NULL */ | ||||
| 	if (!prev) | ||||
| 		WRITE_ONCE(list->first, last->next); | ||||
| 	else | ||||
| 		prev->next = last->next; | ||||
| 
 | ||||
| 	if (last == list->last) | ||||
| 		list->last = prev; | ||||
| 	last->next = NULL; | ||||
| } | ||||
| 
 | ||||
| static inline void __wq_list_splice(struct io_wq_work_list *list, | ||||
| 				    struct io_wq_work_node *to) | ||||
| { | ||||
| 	list->last->next = to->next; | ||||
| 	to->next = list->first; | ||||
| 	INIT_WQ_LIST(list); | ||||
| } | ||||
| 
 | ||||
| static inline bool wq_list_splice(struct io_wq_work_list *list, | ||||
| 				  struct io_wq_work_node *to) | ||||
| { | ||||
| 	if (!wq_list_empty(list)) { | ||||
| 		__wq_list_splice(list, to); | ||||
| 		return true; | ||||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| static inline void wq_stack_add_head(struct io_wq_work_node *node, | ||||
| 				     struct io_wq_work_node *stack) | ||||
| { | ||||
| 	node->next = stack->next; | ||||
| 	stack->next = node; | ||||
| } | ||||
| 
 | ||||
| static inline void wq_list_del(struct io_wq_work_list *list, | ||||
| 			       struct io_wq_work_node *node, | ||||
| 			       struct io_wq_work_node *prev) | ||||
| { | ||||
| 	wq_list_cut(list, node, prev); | ||||
| } | ||||
| 
 | ||||
| static inline | ||||
| struct io_wq_work_node *wq_stack_extract(struct io_wq_work_node *stack) | ||||
| { | ||||
| 	struct io_wq_work_node *node = stack->next; | ||||
| 
 | ||||
| 	stack->next = node->next; | ||||
| 	return node; | ||||
| } | ||||
| 
 | ||||
| static inline struct io_wq_work *wq_next_work(struct io_wq_work *work) | ||||
| { | ||||
| 	if (!work->list.next) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	return container_of(work->list.next, struct io_wq_work, list); | ||||
| } | ||||
| 
 | ||||
| #endif // INTERNAL_IO_SLIST_H
 | ||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Pavel Begunkov
						Pavel Begunkov