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 17311ad..7bac9fc 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 210fc3b..6cd2e76 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 96300cd..82af388 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;