skbuff: carry external ubuf_info in msghdr
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 12 Jul 2022 20:52:29 +0000 (21:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 19 Jul 2022 21:20:42 +0000 (14:20 -0700)
Make possible for network in-kernel callers like io_uring to pass in a
custom ubuf_info by setting it in a new field of struct msghdr.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/socket.h
net/compat.c
net/socket.c

index 17311ad9f9af247967d0704aef7f84fd2bce1a07..7bac9fc1cee0b42b8eb4c814a4564c8d000f53be 100644 (file)
@@ -69,6 +69,7 @@ struct msghdr {
        unsigned int    msg_flags;      /* flags on received message */
        __kernel_size_t msg_controllen; /* ancillary data buffer length */
        struct kiocb    *msg_iocb;      /* ptr to iocb for async requests */
+       struct ubuf_info *msg_ubuf;
 };
 
 struct user_msghdr {
index 210fc3b4d0d833a1360c76fb455effda93864320..6cd2e7683dd06be7cd67ce377ab30c8486482cb5 100644 (file)
@@ -80,6 +80,7 @@ int __get_compat_msghdr(struct msghdr *kmsg,
                return -EMSGSIZE;
 
        kmsg->msg_iocb = NULL;
+       kmsg->msg_ubuf = NULL;
        *ptr = msg.msg_iov;
        *len = msg.msg_iovlen;
        return 0;
index 96300cdc06251fd654bce6277c54677f686079f8..82af3882b8767cd1a142729e28ceb68af950677c 100644 (file)
@@ -2106,6 +2106,7 @@ int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
        msg.msg_namelen = 0;
+       msg.msg_ubuf = NULL;
        if (addr) {
                err = move_addr_to_kernel(addr, addr_len, &address);
                if (err < 0)
@@ -2405,6 +2406,7 @@ int __copy_msghdr_from_user(struct msghdr *kmsg,
                return -EMSGSIZE;
 
        kmsg->msg_iocb = NULL;
+       kmsg->msg_ubuf = NULL;
        *uiov = msg.msg_iov;
        *nsegs = msg.msg_iovlen;
        return 0;