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) | ||||
| 		__io_uring_free(tsk); | ||||
| } | ||||
| int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags); | ||||
| #else | ||||
| static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, | ||||
| 			      struct iov_iter *iter, void *ioucmd) | ||||
|  | @ -116,6 +117,11 @@ static inline const char *io_uring_get_opcode(u8 opcode) | |||
| { | ||||
| 	return ""; | ||||
| } | ||||
| static inline int io_uring_cmd_sock(struct io_uring_cmd *cmd, | ||||
| 				    unsigned int issue_flags) | ||||
| { | ||||
| 	return -EOPNOTSUPP; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -723,6 +723,14 @@ struct io_uring_recvmsg_out { | |||
| 	__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 | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| #include <linux/nospec.h> | ||||
| 
 | ||||
| #include <uapi/linux/io_uring.h> | ||||
| #include <uapi/asm-generic/ioctls.h> | ||||
| 
 | ||||
| #include "io_uring.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); | ||||
| } | ||||
| 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/nospec.h> | ||||
| #include <linux/indirect_call_wrapper.h> | ||||
| #include <linux/io_uring.h> | ||||
| 
 | ||||
| #include <linux/uaccess.h> | ||||
| #include <asm/unistd.h> | ||||
|  | @ -159,6 +160,7 @@ static const struct file_operations socket_file_ops = { | |||
| #ifdef CONFIG_COMPAT | ||||
| 	.compat_ioctl = compat_sock_ioctl, | ||||
| #endif | ||||
| 	.uring_cmd =    io_uring_cmd_sock, | ||||
| 	.mmap =		sock_mmap, | ||||
| 	.release =	sock_close, | ||||
| 	.fasync =	sock_fasync, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Breno Leitao
						Breno Leitao