mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +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