From: Clément Léger Date: Tue, 19 May 2026 11:44:33 +0000 (+0100) Subject: io_uring/zcrx: notify user on frag copy fallback X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=255180f7034f48aa5b0c8df70228307394bddbb9;p=thirdparty%2Fkernel%2Flinux.git io_uring/zcrx: notify user on frag copy fallback Add a ZCRX_NOTIF_COPY notification type to signal userspace when a received fragment could not be delivered using zero-copy and was instead copied into a buffer. Signed-off-by: Clément Léger Signed-off-by: Pavel Begunkov Link: https://patch.msgid.link/3d54bcd8bf10b3a1e88beb0cd39c40c3937bea4f.1779189667.git.asml.silence@gmail.com Signed-off-by: Jens Axboe --- diff --git a/include/uapi/linux/io_uring/zcrx.h b/include/uapi/linux/io_uring/zcrx.h index 67185566ad3cb..3f7b72b098783 100644 --- a/include/uapi/linux/io_uring/zcrx.h +++ b/include/uapi/linux/io_uring/zcrx.h @@ -70,6 +70,7 @@ enum zcrx_features { enum zcrx_notification_type { ZCRX_NOTIF_NO_BUFFERS, + ZCRX_NOTIF_COPY, __ZCRX_NOTIF_TYPE_LAST, }; diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 2bca9a58dcf69..404f9e7574a27 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -1532,8 +1532,13 @@ static int io_zcrx_copy_frag(struct io_kiocb *req, struct io_zcrx_ifq *ifq, const skb_frag_t *frag, int off, int len) { struct page *page = skb_frag_page(frag); + int ret; + + ret = io_zcrx_copy_chunk(req, ifq, page, off + skb_frag_off(frag), len); + if (ret > 0) + zcrx_send_notif(ifq, ZCRX_NOTIF_COPY); - return io_zcrx_copy_chunk(req, ifq, page, off + skb_frag_off(frag), len); + return ret; } static int io_zcrx_recv_frag(struct io_kiocb *req, struct io_zcrx_ifq *ifq, diff --git a/io_uring/zcrx.h b/io_uring/zcrx.h index e8b7717d6adf0..54d91b580eaf2 100644 --- a/io_uring/zcrx.h +++ b/io_uring/zcrx.h @@ -11,7 +11,7 @@ #define ZCRX_SUPPORTED_REG_FLAGS (ZCRX_REG_IMPORT | ZCRX_REG_NODEV) #define ZCRX_FEATURES (ZCRX_FEATURE_RX_PAGE_SIZE |\ ZCRX_FEATURE_NOTIFICATION) -#define ZCRX_NOTIF_TYPE_MASK (1U << ZCRX_NOTIF_NO_BUFFERS) +#define ZCRX_NOTIF_TYPE_MASK ((1U << ZCRX_NOTIF_NO_BUFFERS) | (1U << ZCRX_NOTIF_COPY)) struct io_zcrx_mem { unsigned long size;