mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	io_uring: Add io_uring command support for sockets
Enable io_uring commands on network sockets. Create two new SOCKET_URING_OP commands that will operate on sockets. In order to call ioctl on sockets, use the file_operations->io_uring_cmd callbacks, and map it to a uring socket function, which handles the SOCKET_URING_OP accordingly, and calls socket ioctls. This patches was tested by creating a new test case in liburing. Link: https://github.com/leitao/liburing/tree/io_uring_cmd Signed-off-by: Breno Leitao <leitao@debian.org> Acked-by: Jakub Kicinski <kuba@kernel.org> Link: https://lore.kernel.org/r/20230627134424.2784797-1-leitao@debian.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
		
							parent
							
								
									f77569d22a
								
							
						
					
					
						commit
						8e9fad0e70
					
				
					 4 changed files with 44 additions and 0 deletions
				
			
		|  | @ -81,6 +81,7 @@ static inline void io_uring_free(struct task_struct *tsk) | ||||||
| 	if (tsk->io_uring) | 	if (tsk->io_uring) | ||||||
| 		__io_uring_free(tsk); | 		__io_uring_free(tsk); | ||||||
| } | } | ||||||
|  | int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags); | ||||||
| #else | #else | ||||||
| static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, | static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, | ||||||
| 			      struct iov_iter *iter, void *ioucmd) | 			      struct iov_iter *iter, void *ioucmd) | ||||||
|  | @ -116,6 +117,11 @@ static inline const char *io_uring_get_opcode(u8 opcode) | ||||||
| { | { | ||||||
| 	return ""; | 	return ""; | ||||||
| } | } | ||||||
|  | static inline int io_uring_cmd_sock(struct io_uring_cmd *cmd, | ||||||
|  | 				    unsigned int issue_flags) | ||||||
|  | { | ||||||
|  | 	return -EOPNOTSUPP; | ||||||
|  | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -723,6 +723,14 @@ struct io_uring_recvmsg_out { | ||||||
| 	__u32 flags; | 	__u32 flags; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Argument for IORING_OP_URING_CMD when file is a socket | ||||||
|  |  */ | ||||||
|  | enum { | ||||||
|  | 	SOCKET_URING_OP_SIOCINQ		= 0, | ||||||
|  | 	SOCKET_URING_OP_SIOCOUTQ, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ | ||||||
| #include <linux/nospec.h> | #include <linux/nospec.h> | ||||||
| 
 | 
 | ||||||
| #include <uapi/linux/io_uring.h> | #include <uapi/linux/io_uring.h> | ||||||
|  | #include <uapi/asm-generic/ioctls.h> | ||||||
| 
 | 
 | ||||||
| #include "io_uring.h" | #include "io_uring.h" | ||||||
| #include "rsrc.h" | #include "rsrc.h" | ||||||
|  | @ -164,3 +165,30 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, | ||||||
| 	return io_import_fixed(rw, iter, req->imu, ubuf, len); | 	return io_import_fixed(rw, iter, req->imu, ubuf, len); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed); | EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed); | ||||||
|  | 
 | ||||||
|  | int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) | ||||||
|  | { | ||||||
|  | 	struct socket *sock = cmd->file->private_data; | ||||||
|  | 	struct sock *sk = sock->sk; | ||||||
|  | 	struct proto *prot = READ_ONCE(sk->sk_prot); | ||||||
|  | 	int ret, arg = 0; | ||||||
|  | 
 | ||||||
|  | 	if (!prot || !prot->ioctl) | ||||||
|  | 		return -EOPNOTSUPP; | ||||||
|  | 
 | ||||||
|  | 	switch (cmd->sqe->cmd_op) { | ||||||
|  | 	case SOCKET_URING_OP_SIOCINQ: | ||||||
|  | 		ret = prot->ioctl(sk, SIOCINQ, &arg); | ||||||
|  | 		if (ret) | ||||||
|  | 			return ret; | ||||||
|  | 		return arg; | ||||||
|  | 	case SOCKET_URING_OP_SIOCOUTQ: | ||||||
|  | 		ret = prot->ioctl(sk, SIOCOUTQ, &arg); | ||||||
|  | 		if (ret) | ||||||
|  | 			return ret; | ||||||
|  | 		return arg; | ||||||
|  | 	default: | ||||||
|  | 		return -EOPNOTSUPP; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(io_uring_cmd_sock); | ||||||
|  |  | ||||||
|  | @ -88,6 +88,7 @@ | ||||||
| #include <linux/xattr.h> | #include <linux/xattr.h> | ||||||
| #include <linux/nospec.h> | #include <linux/nospec.h> | ||||||
| #include <linux/indirect_call_wrapper.h> | #include <linux/indirect_call_wrapper.h> | ||||||
|  | #include <linux/io_uring.h> | ||||||
| 
 | 
 | ||||||
| #include <linux/uaccess.h> | #include <linux/uaccess.h> | ||||||
| #include <asm/unistd.h> | #include <asm/unistd.h> | ||||||
|  | @ -159,6 +160,7 @@ static const struct file_operations socket_file_ops = { | ||||||
| #ifdef CONFIG_COMPAT | #ifdef CONFIG_COMPAT | ||||||
| 	.compat_ioctl = compat_sock_ioctl, | 	.compat_ioctl = compat_sock_ioctl, | ||||||
| #endif | #endif | ||||||
|  | 	.uring_cmd =    io_uring_cmd_sock, | ||||||
| 	.mmap =		sock_mmap, | 	.mmap =		sock_mmap, | ||||||
| 	.release =	sock_close, | 	.release =	sock_close, | ||||||
| 	.fasync =	sock_fasync, | 	.fasync =	sock_fasync, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Breno Leitao
						Breno Leitao