[RFC 01/10] net: pass ubuf to custom sg_from_iter callbacks
From: Pavel Begunkov <asml.silence@gmail.com>
Date: 2026-07-11 10:49:08
Also in:
io-uring
Subsystem:
io_uring, networking [general], networking [sockets], the rest · Maintainers:
Jens Axboe, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Kuniyuki Iwashima, Willem de Bruijn, Linus Torvalds
ubuf_info and callbacks for chunking zerocopy iterators into skbs comes in pairs in msghdr, and in the future the callback will need to know which ubuf_info it was called with. We can't derive it from the skb as some paths set it after the call, so pass it in. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- include/linux/socket.h | 2 +- io_uring/net.c | 8 ++++---- net/core/datagram.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/include/linux/socket.h b/include/linux/socket.h
index 2a8d7b14f1d1..5ae24847f5c4 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h@@ -90,7 +90,7 @@ struct msghdr { unsigned int msg_flags; /* flags on received message */ __kernel_size_t msg_controllen; /* ancillary data buffer length */ struct ubuf_info *msg_ubuf; - int (*sg_from_iter)(struct sk_buff *skb, + int (*sg_from_iter)(struct sk_buff *skb, struct ubuf_info *ubuf, struct iov_iter *from, size_t length); };
diff --git a/io_uring/net.c b/io_uring/net.c
index 00a7df803b99..cf273d6f02b1 100644
--- a/io_uring/net.c
+++ b/io_uring/net.c@@ -116,9 +116,9 @@ struct io_recvzc { struct io_zcrx_ifq *ifq; }; -static int io_sg_from_iter_iovec(struct sk_buff *skb, +static int io_sg_from_iter_iovec(struct sk_buff *skb, struct ubuf_info *ubuf, struct iov_iter *from, size_t length); -static int io_sg_from_iter(struct sk_buff *skb, +static int io_sg_from_iter(struct sk_buff *skb, struct ubuf_info *ubuf, struct iov_iter *from, size_t length); int io_shutdown_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
@@ -1447,14 +1447,14 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) return 0; } -static int io_sg_from_iter_iovec(struct sk_buff *skb, +static int io_sg_from_iter_iovec(struct sk_buff *skb, struct ubuf_info *ubuf, struct iov_iter *from, size_t length) { skb_zcopy_downgrade_managed(skb); return zerocopy_fill_skb_from_iter(skb, from, length); } -static int io_sg_from_iter(struct sk_buff *skb, +static int io_sg_from_iter(struct sk_buff *skb, struct ubuf_info *ubuf, struct iov_iter *from, size_t length) { struct skb_shared_info *shinfo = skb_shinfo(skb);
diff --git a/net/core/datagram.c b/net/core/datagram.c
index c285c6465923..f15886f40efc 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c@@ -753,7 +753,7 @@ int __zerocopy_sg_from_iter(struct msghdr *msg, struct sock *sk, int ret; if (msg && msg->msg_ubuf && msg->sg_from_iter) - ret = msg->sg_from_iter(skb, from, length); + ret = msg->sg_from_iter(skb, msg->msg_ubuf, from, length); else if (binding) ret = zerocopy_fill_skb_from_devmem(skb, from, length, binding); else
--
2.54.0