Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

io_uring/cmd: move net cmd into a separate file

We keep socket io_uring command implementation in io_uring/uring_cmd.c.
Separate it from generic command code into a separate file.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/747d0519a2255bd055ae76b691d38d2b4c311001.1745843119.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Pavel Begunkov and committed by
Jens Axboe
91db6edc 27d2fed7

+84 -83
+1
io_uring/Makefile
··· 19 19 obj-$(CONFIG_FUTEX) += futex.o 20 20 obj-$(CONFIG_EPOLL) += epoll.o 21 21 obj-$(CONFIG_NET_RX_BUSY_POLL) += napi.o 22 + obj-$(CONFIG_NET) += cmd_net.o
+83
io_uring/cmd_net.c
··· 1 + #include <asm/ioctls.h> 2 + #include <linux/io_uring/net.h> 3 + #include <net/sock.h> 4 + 5 + #include "uring_cmd.h" 6 + 7 + static inline int io_uring_cmd_getsockopt(struct socket *sock, 8 + struct io_uring_cmd *cmd, 9 + unsigned int issue_flags) 10 + { 11 + const struct io_uring_sqe *sqe = cmd->sqe; 12 + bool compat = !!(issue_flags & IO_URING_F_COMPAT); 13 + int optlen, optname, level, err; 14 + void __user *optval; 15 + 16 + level = READ_ONCE(sqe->level); 17 + if (level != SOL_SOCKET) 18 + return -EOPNOTSUPP; 19 + 20 + optval = u64_to_user_ptr(READ_ONCE(sqe->optval)); 21 + optname = READ_ONCE(sqe->optname); 22 + optlen = READ_ONCE(sqe->optlen); 23 + 24 + err = do_sock_getsockopt(sock, compat, level, optname, 25 + USER_SOCKPTR(optval), 26 + KERNEL_SOCKPTR(&optlen)); 27 + if (err) 28 + return err; 29 + 30 + /* On success, return optlen */ 31 + return optlen; 32 + } 33 + 34 + static inline int io_uring_cmd_setsockopt(struct socket *sock, 35 + struct io_uring_cmd *cmd, 36 + unsigned int issue_flags) 37 + { 38 + const struct io_uring_sqe *sqe = cmd->sqe; 39 + bool compat = !!(issue_flags & IO_URING_F_COMPAT); 40 + int optname, optlen, level; 41 + void __user *optval; 42 + sockptr_t optval_s; 43 + 44 + optval = u64_to_user_ptr(READ_ONCE(sqe->optval)); 45 + optname = READ_ONCE(sqe->optname); 46 + optlen = READ_ONCE(sqe->optlen); 47 + level = READ_ONCE(sqe->level); 48 + optval_s = USER_SOCKPTR(optval); 49 + 50 + return do_sock_setsockopt(sock, compat, level, optname, optval_s, 51 + optlen); 52 + } 53 + 54 + int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) 55 + { 56 + struct socket *sock = cmd->file->private_data; 57 + struct sock *sk = sock->sk; 58 + struct proto *prot = READ_ONCE(sk->sk_prot); 59 + int ret, arg = 0; 60 + 61 + if (!prot || !prot->ioctl) 62 + return -EOPNOTSUPP; 63 + 64 + switch (cmd->cmd_op) { 65 + case SOCKET_URING_OP_SIOCINQ: 66 + ret = prot->ioctl(sk, SIOCINQ, &arg); 67 + if (ret) 68 + return ret; 69 + return arg; 70 + case SOCKET_URING_OP_SIOCOUTQ: 71 + ret = prot->ioctl(sk, SIOCOUTQ, &arg); 72 + if (ret) 73 + return ret; 74 + return arg; 75 + case SOCKET_URING_OP_GETSOCKOPT: 76 + return io_uring_cmd_getsockopt(sock, cmd, issue_flags); 77 + case SOCKET_URING_OP_SETSOCKOPT: 78 + return io_uring_cmd_setsockopt(sock, cmd, issue_flags); 79 + default: 80 + return -EOPNOTSUPP; 81 + } 82 + } 83 + EXPORT_SYMBOL_GPL(io_uring_cmd_sock);
-83
io_uring/uring_cmd.c
··· 3 3 #include <linux/errno.h> 4 4 #include <linux/file.h> 5 5 #include <linux/io_uring/cmd.h> 6 - #include <linux/io_uring/net.h> 7 6 #include <linux/security.h> 8 7 #include <linux/nospec.h> 9 - #include <net/sock.h> 10 8 11 9 #include <uapi/linux/io_uring.h> 12 - #include <asm/ioctls.h> 13 10 14 11 #include "io_uring.h" 15 12 #include "alloc_cache.h" ··· 299 302 300 303 io_req_queue_iowq(req); 301 304 } 302 - 303 - static inline int io_uring_cmd_getsockopt(struct socket *sock, 304 - struct io_uring_cmd *cmd, 305 - unsigned int issue_flags) 306 - { 307 - const struct io_uring_sqe *sqe = cmd->sqe; 308 - bool compat = !!(issue_flags & IO_URING_F_COMPAT); 309 - int optlen, optname, level, err; 310 - void __user *optval; 311 - 312 - level = READ_ONCE(sqe->level); 313 - if (level != SOL_SOCKET) 314 - return -EOPNOTSUPP; 315 - 316 - optval = u64_to_user_ptr(READ_ONCE(sqe->optval)); 317 - optname = READ_ONCE(sqe->optname); 318 - optlen = READ_ONCE(sqe->optlen); 319 - 320 - err = do_sock_getsockopt(sock, compat, level, optname, 321 - USER_SOCKPTR(optval), 322 - KERNEL_SOCKPTR(&optlen)); 323 - if (err) 324 - return err; 325 - 326 - /* On success, return optlen */ 327 - return optlen; 328 - } 329 - 330 - static inline int io_uring_cmd_setsockopt(struct socket *sock, 331 - struct io_uring_cmd *cmd, 332 - unsigned int issue_flags) 333 - { 334 - const struct io_uring_sqe *sqe = cmd->sqe; 335 - bool compat = !!(issue_flags & IO_URING_F_COMPAT); 336 - int optname, optlen, level; 337 - void __user *optval; 338 - sockptr_t optval_s; 339 - 340 - optval = u64_to_user_ptr(READ_ONCE(sqe->optval)); 341 - optname = READ_ONCE(sqe->optname); 342 - optlen = READ_ONCE(sqe->optlen); 343 - level = READ_ONCE(sqe->level); 344 - optval_s = USER_SOCKPTR(optval); 345 - 346 - return do_sock_setsockopt(sock, compat, level, optname, optval_s, 347 - optlen); 348 - } 349 - 350 - #if defined(CONFIG_NET) 351 - int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags) 352 - { 353 - struct socket *sock = cmd->file->private_data; 354 - struct sock *sk = sock->sk; 355 - struct proto *prot = READ_ONCE(sk->sk_prot); 356 - int ret, arg = 0; 357 - 358 - if (!prot || !prot->ioctl) 359 - return -EOPNOTSUPP; 360 - 361 - switch (cmd->cmd_op) { 362 - case SOCKET_URING_OP_SIOCINQ: 363 - ret = prot->ioctl(sk, SIOCINQ, &arg); 364 - if (ret) 365 - return ret; 366 - return arg; 367 - case SOCKET_URING_OP_SIOCOUTQ: 368 - ret = prot->ioctl(sk, SIOCOUTQ, &arg); 369 - if (ret) 370 - return ret; 371 - return arg; 372 - case SOCKET_URING_OP_GETSOCKOPT: 373 - return io_uring_cmd_getsockopt(sock, cmd, issue_flags); 374 - case SOCKET_URING_OP_SETSOCKOPT: 375 - return io_uring_cmd_setsockopt(sock, cmd, issue_flags); 376 - default: 377 - return -EOPNOTSUPP; 378 - } 379 - } 380 - EXPORT_SYMBOL_GPL(io_uring_cmd_sock); 381 - #endif