[RFC 01/10] net: pass ubuf to custom sg_from_iter callbacks
Pavel Begunkov <[email protected]> Sat, 11 Jul 2026 11:48:30 +0100
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.netdev |
|---|---|
| Message-ID | <58db782214b7169988fe4981771d3f0a12de4529.1783614400.git.asml.silence@gmail.com> |
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 <[email protected]> --- 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