]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/zcrx: notify user on frag copy fallback
authorClément Léger <cleger@meta.com>
Tue, 19 May 2026 11:44:33 +0000 (12:44 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 26 May 2026 16:42:01 +0000 (10:42 -0600)
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 <cleger@meta.com>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://patch.msgid.link/3d54bcd8bf10b3a1e88beb0cd39c40c3937bea4f.1779189667.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/uapi/linux/io_uring/zcrx.h
io_uring/zcrx.c
io_uring/zcrx.h

index 67185566ad3cbfad0657d0cade6975f664f4f031..3f7b72b098783a088b1e37a2042a71bc17f4ede9 100644 (file)
@@ -70,6 +70,7 @@ enum zcrx_features {
 
 enum zcrx_notification_type {
        ZCRX_NOTIF_NO_BUFFERS,
+       ZCRX_NOTIF_COPY,
 
        __ZCRX_NOTIF_TYPE_LAST,
 };
index 2bca9a58dcf69c12c7c0d8c699839ebd46dc0cf5..404f9e7574a27404f2401d80161e594b48a1c7ec 100644 (file)
@@ -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,
index e8b7717d6adf044a72a2b988a8f8778019d786e5..54d91b580eaf2a4376f003fbbe8bd5affcf51e57 100644 (file)
@@ -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;