public inbox for [email protected]
 help / color / mirror / Atom feed
* [PATCH v3 0/2] io_uring/zcrx: recvzc read limit
@ 2025-02-24  4:13 David Wei
  2025-02-24  4:13 ` [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests David Wei
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: David Wei @ 2025-02-24  4:13 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, Pavel Begunkov, lizetao

Currently multishot recvzc requests have no read limit and will remain
active so as long as the socket remains open. But, there are sometimes a
need to do a fixed length read e.g. peeking at some data in the socket.

Add a length limit to recvzc requests `len`. A value of 0 means no limit
which is the previous behaviour. A positive value N specifies how many
bytes to read from the socket.

Also add a new selftest case.

Changes in v3:
--------------
* Remove all references to 'singleshot'
* Use 0 to mean no limit
* Remove unused var `limit`
* Complete recvzc req early when len == 0
* Revert return codes in io_zcrx_tcp_recvmsg()
* Check explicitly that ret > 0

Changes in v2:
--------------
* Consistently use u32/unsigned int for len
* Remove nowait semantics, request will not complete until requested len
  has been received
* Always set REQ_F_APOLL_MULTISHOT
* Fix return codes from io_recvzc request
* Fix changing len if set to UINT_MAX in io_zcrx_recv_skb()
* Use read_desc->count

David Wei (2):
  io_uring/zcrx: add a read limit to recvzc requests
  io_uring/zcrx: add selftest case for recvzc with read limit

 io_uring/net.c                                | 16 +++++--
 io_uring/zcrx.c                               | 13 ++++--
 io_uring/zcrx.h                               |  2 +-
 .../selftests/drivers/net/hw/iou-zcrx.c       | 43 ++++++++++++++++---
 .../selftests/drivers/net/hw/iou-zcrx.py      | 27 +++++++++++-
 5 files changed, 85 insertions(+), 16 deletions(-)

-- 
2.43.5


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests
  2025-02-24  4:13 [PATCH v3 0/2] io_uring/zcrx: recvzc read limit David Wei
@ 2025-02-24  4:13 ` David Wei
  2025-02-24 13:11   ` Pavel Begunkov
  2025-02-24  4:13 ` [PATCH v3 2/2] io_uring/zcrx: add selftest case for recvzc with read limit David Wei
  2025-02-24 14:35 ` [PATCH v3 0/2] io_uring/zcrx: recvzc " Jens Axboe
  2 siblings, 1 reply; 9+ messages in thread
From: David Wei @ 2025-02-24  4:13 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, Pavel Begunkov, lizetao

Currently multishot recvzc requests have no read limit and will remain
active so as long as the socket remains open. But, there are sometimes a
need to do a fixed length read e.g. peeking at some data in the socket.

Add a length limit to recvzc requests `len`. A value of 0 means no limit
which is the previous behaviour. A positive value N specifies how many
bytes to read from the socket.

Data will still be posted in aux completions, as before. This could be
split across multiple frags. But the primary recvzc request will now
complete once N bytes have been read. The completion of the recvzc
request will have res and cflags both set to 0.

Signed-off-by: David Wei <[email protected]>
---
 io_uring/net.c  | 16 +++++++++++++---
 io_uring/zcrx.c | 13 +++++++++----
 io_uring/zcrx.h |  2 +-
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/io_uring/net.c b/io_uring/net.c
index 000dc70d08d0..4850d4d898f9 100644
--- a/io_uring/net.c
+++ b/io_uring/net.c
@@ -94,6 +94,7 @@ struct io_recvzc {
 	struct file			*file;
 	unsigned			msg_flags;
 	u16				flags;
+	u32				len;
 	struct io_zcrx_ifq		*ifq;
 };
 
@@ -1241,7 +1242,7 @@ int io_recvzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 	unsigned ifq_idx;
 
 	if (unlikely(sqe->file_index || sqe->addr2 || sqe->addr ||
-		     sqe->len || sqe->addr3))
+		     sqe->addr3))
 		return -EINVAL;
 
 	ifq_idx = READ_ONCE(sqe->zcrx_ifq_idx);
@@ -1250,7 +1251,7 @@ int io_recvzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 	zc->ifq = req->ctx->ifq;
 	if (!zc->ifq)
 		return -EINVAL;
-
+	zc->len = READ_ONCE(sqe->len);
 	zc->flags = READ_ONCE(sqe->ioprio);
 	zc->msg_flags = READ_ONCE(sqe->msg_flags);
 	if (zc->msg_flags)
@@ -1270,6 +1271,7 @@ int io_recvzc(struct io_kiocb *req, unsigned int issue_flags)
 {
 	struct io_recvzc *zc = io_kiocb_to_cmd(req, struct io_recvzc);
 	struct socket *sock;
+	unsigned int len;
 	int ret;
 
 	if (!(req->flags & REQ_F_POLLED) &&
@@ -1280,8 +1282,16 @@ int io_recvzc(struct io_kiocb *req, unsigned int issue_flags)
 	if (unlikely(!sock))
 		return -ENOTSOCK;
 
+	len = zc->len;
 	ret = io_zcrx_recv(req, zc->ifq, sock, zc->msg_flags | MSG_DONTWAIT,
-			   issue_flags);
+			   issue_flags, &zc->len);
+	if (len && zc->len == 0) {
+		io_req_set_res(req, 0, 0);
+
+		if (issue_flags & IO_URING_F_MULTISHOT)
+			return IOU_STOP_MULTISHOT;
+		return IOU_OK;
+	}
 	if (unlikely(ret <= 0) && ret != -EAGAIN) {
 		if (ret == -ERESTARTSYS)
 			ret = -EINTR;
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index f2d326e18e67..9c95b5b6ec4e 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -817,6 +817,7 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb,
 	int i, copy, end, off;
 	int ret = 0;
 
+	len = min_t(size_t, len, desc->count);
 	if (unlikely(args->nr_skbs++ > IO_SKBS_PER_CALL_LIMIT))
 		return -EAGAIN;
 
@@ -894,26 +895,30 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb,
 out:
 	if (offset == start_off)
 		return ret;
+	desc->count -= (offset - start_off);
 	return offset - start_off;
 }
 
 static int io_zcrx_tcp_recvmsg(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
 				struct sock *sk, int flags,
-				unsigned issue_flags)
+				unsigned issue_flags, unsigned int *outlen)
 {
+	unsigned int len = *outlen;
 	struct io_zcrx_args args = {
 		.req = req,
 		.ifq = ifq,
 		.sock = sk->sk_socket,
 	};
 	read_descriptor_t rd_desc = {
-		.count = 1,
+		.count = len ? len : UINT_MAX,
 		.arg.data = &args,
 	};
 	int ret;
 
 	lock_sock(sk);
 	ret = tcp_read_sock(sk, &rd_desc, io_zcrx_recv_skb);
+	if (len && ret > 0)
+		*outlen = len - ret;
 	if (ret <= 0) {
 		if (ret < 0 || sock_flag(sk, SOCK_DONE))
 			goto out;
@@ -942,7 +947,7 @@ static int io_zcrx_tcp_recvmsg(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
 
 int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
 		 struct socket *sock, unsigned int flags,
-		 unsigned issue_flags)
+		 unsigned issue_flags, unsigned int *len)
 {
 	struct sock *sk = sock->sk;
 	const struct proto *prot = READ_ONCE(sk->sk_prot);
@@ -951,5 +956,5 @@ int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
 		return -EPROTONOSUPPORT;
 
 	sock_rps_record_flow(sk);
-	return io_zcrx_tcp_recvmsg(req, ifq, sk, flags, issue_flags);
+	return io_zcrx_tcp_recvmsg(req, ifq, sk, flags, issue_flags, len);
 }
diff --git a/io_uring/zcrx.h b/io_uring/zcrx.h
index a16bdd921f03..1b4042dc48e2 100644
--- a/io_uring/zcrx.h
+++ b/io_uring/zcrx.h
@@ -46,7 +46,7 @@ void io_unregister_zcrx_ifqs(struct io_ring_ctx *ctx);
 void io_shutdown_zcrx_ifqs(struct io_ring_ctx *ctx);
 int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
 		 struct socket *sock, unsigned int flags,
-		 unsigned issue_flags);
+		 unsigned issue_flags, unsigned int *len);
 #else
 static inline int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
 					struct io_uring_zcrx_ifq_reg __user *arg)
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v3 2/2] io_uring/zcrx: add selftest case for recvzc with read limit
  2025-02-24  4:13 [PATCH v3 0/2] io_uring/zcrx: recvzc read limit David Wei
  2025-02-24  4:13 ` [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests David Wei
@ 2025-02-24  4:13 ` David Wei
  2025-02-24 14:35 ` [PATCH v3 0/2] io_uring/zcrx: recvzc " Jens Axboe
  2 siblings, 0 replies; 9+ messages in thread
From: David Wei @ 2025-02-24  4:13 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, Pavel Begunkov, lizetao

Add a selftest case to iou-zcrx where the sender sends 4x4K = 16K and
the receiver does 4x4K recvzc requests. Validate that the requests
complete successfully and that the data is not corrupted.

Signed-off-by: David Wei <[email protected]>
---
 .../selftests/drivers/net/hw/iou-zcrx.c       | 43 ++++++++++++++++---
 .../selftests/drivers/net/hw/iou-zcrx.py      | 27 +++++++++++-
 2 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/drivers/net/hw/iou-zcrx.c b/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
index 5d04dd55ae55..c26b4180eddd 100644
--- a/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
+++ b/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
@@ -61,6 +61,9 @@ static int cfg_port = 8000;
 static int cfg_payload_len;
 static const char *cfg_ifname;
 static int cfg_queue_id = -1;
+static bool cfg_oneshot;
+static int cfg_oneshot_recvs;
+static int cfg_send_size = SEND_SIZE;
 static struct sockaddr_in6 cfg_addr;
 
 static char payload[SEND_SIZE] __attribute__((aligned(PAGE_SIZE)));
@@ -196,6 +199,17 @@ static void add_recvzc(struct io_uring *ring, int sockfd)
 	sqe->user_data = 2;
 }
 
+static void add_recvzc_oneshot(struct io_uring *ring, int sockfd, size_t len)
+{
+	struct io_uring_sqe *sqe;
+
+	sqe = io_uring_get_sqe(ring);
+
+	io_uring_prep_rw(IORING_OP_RECV_ZC, sqe, sockfd, NULL, len, 0);
+	sqe->ioprio |= IORING_RECV_MULTISHOT;
+	sqe->user_data = 2;
+}
+
 static void process_accept(struct io_uring *ring, struct io_uring_cqe *cqe)
 {
 	if (cqe->res < 0)
@@ -204,7 +218,10 @@ static void process_accept(struct io_uring *ring, struct io_uring_cqe *cqe)
 		error(1, 0, "Unexpected second connection");
 
 	connfd = cqe->res;
-	add_recvzc(ring, connfd);
+	if (cfg_oneshot)
+		add_recvzc_oneshot(ring, connfd, PAGE_SIZE);
+	else
+		add_recvzc(ring, connfd);
 }
 
 static void process_recvzc(struct io_uring *ring, struct io_uring_cqe *cqe)
@@ -218,7 +235,7 @@ static void process_recvzc(struct io_uring *ring, struct io_uring_cqe *cqe)
 	ssize_t n;
 	int i;
 
-	if (cqe->res == 0 && cqe->flags == 0) {
+	if (cqe->res == 0 && cqe->flags == 0 && cfg_oneshot_recvs == 0) {
 		stop = true;
 		return;
 	}
@@ -226,8 +243,14 @@ static void process_recvzc(struct io_uring *ring, struct io_uring_cqe *cqe)
 	if (cqe->res < 0)
 		error(1, 0, "recvzc(): %d", cqe->res);
 
-	if (!(cqe->flags & IORING_CQE_F_MORE))
+	if (cfg_oneshot) {
+		if (cqe->res == 0 && cqe->flags == 0 && cfg_oneshot_recvs) {
+			add_recvzc_oneshot(ring, connfd, PAGE_SIZE);
+			cfg_oneshot_recvs--;
+		}
+	} else if (!(cqe->flags & IORING_CQE_F_MORE)) {
 		add_recvzc(ring, connfd);
+	}
 
 	rcqe = (struct io_uring_zcrx_cqe *)(cqe + 1);
 
@@ -237,7 +260,7 @@ static void process_recvzc(struct io_uring *ring, struct io_uring_cqe *cqe)
 
 	for (i = 0; i < n; i++) {
 		if (*(data + i) != payload[(received + i)])
-			error(1, 0, "payload mismatch");
+			error(1, 0, "payload mismatch at ", i);
 	}
 	received += n;
 
@@ -313,7 +336,7 @@ static void run_server(void)
 
 static void run_client(void)
 {
-	ssize_t to_send = SEND_SIZE;
+	ssize_t to_send = cfg_send_size;
 	ssize_t sent = 0;
 	ssize_t chunk, res;
 	int fd;
@@ -360,7 +383,7 @@ static void parse_opts(int argc, char **argv)
 		usage(argv[0]);
 	cfg_payload_len = max_payload_len;
 
-	while ((c = getopt(argc, argv, "46sch:p:l:i:q:")) != -1) {
+	while ((c = getopt(argc, argv, "sch:p:l:i:q:o:z:")) != -1) {
 		switch (c) {
 		case 's':
 			if (cfg_client)
@@ -387,6 +410,14 @@ static void parse_opts(int argc, char **argv)
 		case 'q':
 			cfg_queue_id = strtoul(optarg, NULL, 0);
 			break;
+		case 'o': {
+			cfg_oneshot = true;
+			cfg_oneshot_recvs = strtoul(optarg, NULL, 0);
+			break;
+		}
+		case 'z':
+			cfg_send_size = strtoul(optarg, NULL, 0);
+			break;
 		}
 	}
 
diff --git a/tools/testing/selftests/drivers/net/hw/iou-zcrx.py b/tools/testing/selftests/drivers/net/hw/iou-zcrx.py
index ea0a346c3eff..d301d9b356f7 100755
--- a/tools/testing/selftests/drivers/net/hw/iou-zcrx.py
+++ b/tools/testing/selftests/drivers/net/hw/iou-zcrx.py
@@ -34,14 +34,37 @@ def test_zcrx(cfg) -> None:
         raise KsftSkipEx('at least 2 combined channels required')
     rx_ring = _get_rx_ring_entries(cfg)
 
-    rx_cmd = f"{cfg.bin_remote} -s -p 9999 -i {cfg.ifname} -q {combined_chans - 1}"
-    tx_cmd = f"{cfg.bin_local} -c -h {cfg.remote_v6} -p 9999 -l 12840"
+    try:
+        ethtool(f"-G {cfg.ifname} rx 64", host=cfg.remote)
+        ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}", host=cfg.remote)
+        flow_rule_id = _set_flow_rule(cfg, combined_chans - 1)
+
+        rx_cmd = f"{cfg.bin_remote} -s -p 9999 -i {cfg.ifname} -q {combined_chans - 1}"
+        tx_cmd = f"{cfg.bin_local} -c -h {cfg.remote_v6} -p 9999 -l 12840"
+        with bkg(rx_cmd, host=cfg.remote, exit_wait=True):
+            wait_port_listen(9999, proto="tcp", host=cfg.remote)
+            cmd(tx_cmd)
+    finally:
+        ethtool(f"-N {cfg.ifname} delete {flow_rule_id}", host=cfg.remote)
+        ethtool(f"-X {cfg.ifname} default", host=cfg.remote)
+        ethtool(f"-G {cfg.ifname} rx {rx_ring}", host=cfg.remote)
+
+
+def test_zcrx_oneshot(cfg) -> None:
+    cfg.require_v6()
+
+    combined_chans = _get_combined_channels(cfg)
+    if combined_chans < 2:
+        raise KsftSkipEx('at least 2 combined channels required')
+    rx_ring = _get_rx_ring_entries(cfg)
 
     try:
         ethtool(f"-G {cfg.ifname} rx 64", host=cfg.remote)
         ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}", host=cfg.remote)
         flow_rule_id = _set_flow_rule(cfg, combined_chans - 1)
 
+        rx_cmd = f"{cfg.bin_remote} -s -p 9999 -i {cfg.ifname} -q {combined_chans - 1} -o 4"
+        tx_cmd = f"{cfg.bin_local} -c -h {cfg.remote_v6} -p 9999 -l 4096 -z 16384"
         with bkg(rx_cmd, host=cfg.remote, exit_wait=True):
             wait_port_listen(9999, proto="tcp", host=cfg.remote)
             cmd(tx_cmd)
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests
  2025-02-24  4:13 ` [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests David Wei
@ 2025-02-24 13:11   ` Pavel Begunkov
  2025-02-24 15:46     ` David Wei
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Begunkov @ 2025-02-24 13:11 UTC (permalink / raw)
  To: David Wei, io-uring; +Cc: Jens Axboe, lizetao

On 2/24/25 04:13, David Wei wrote:
> Currently multishot recvzc requests have no read limit and will remain
> active so as long as the socket remains open. But, there are sometimes a
> need to do a fixed length read e.g. peeking at some data in the socket.
> 
> Add a length limit to recvzc requests `len`. A value of 0 means no limit
> which is the previous behaviour. A positive value N specifies how many
> bytes to read from the socket.
> 
> Data will still be posted in aux completions, as before. This could be
> split across multiple frags. But the primary recvzc request will now
> complete once N bytes have been read. The completion of the recvzc
> request will have res and cflags both set to 0.

Looks fine, can be improved later.

Reviewed-by: Pavel Begunkov <[email protected]>


> Signed-off-by: David Wei <[email protected]>
> ---
>   io_uring/net.c  | 16 +++++++++++++---
>   io_uring/zcrx.c | 13 +++++++++----
>   io_uring/zcrx.h |  2 +-
>   3 files changed, 23 insertions(+), 8 deletions(-)
...
> diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
> index f2d326e18e67..9c95b5b6ec4e 100644
> --- a/io_uring/zcrx.c
> +++ b/io_uring/zcrx.c
> @@ -817,6 +817,7 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb,
...
>   static int io_zcrx_tcp_recvmsg(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
>   				struct sock *sk, int flags,
> -				unsigned issue_flags)
> +				unsigned issue_flags, unsigned int *outlen)
>   {
> +	unsigned int len = *outlen;
>   	struct io_zcrx_args args = {
>   		.req = req,
>   		.ifq = ifq,
>   		.sock = sk->sk_socket,
>   	};
>   	read_descriptor_t rd_desc = {
> -		.count = 1,
> +		.count = len ? len : UINT_MAX,

typedef struct {
	...
	size_t count;
} read_descriptor_t;

Should be SIZE_MAX, but it's not worth of respinning.

-- 
Pavel Begunkov


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 0/2] io_uring/zcrx: recvzc read limit
  2025-02-24  4:13 [PATCH v3 0/2] io_uring/zcrx: recvzc read limit David Wei
  2025-02-24  4:13 ` [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests David Wei
  2025-02-24  4:13 ` [PATCH v3 2/2] io_uring/zcrx: add selftest case for recvzc with read limit David Wei
@ 2025-02-24 14:35 ` Jens Axboe
  2025-02-24 19:56   ` Jens Axboe
  2 siblings, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2025-02-24 14:35 UTC (permalink / raw)
  To: io-uring, David Wei; +Cc: Pavel Begunkov, lizetao


On Sun, 23 Feb 2025 20:13:17 -0800, David Wei wrote:
> Currently multishot recvzc requests have no read limit and will remain
> active so as long as the socket remains open. But, there are sometimes a
> need to do a fixed length read e.g. peeking at some data in the socket.
> 
> Add a length limit to recvzc requests `len`. A value of 0 means no limit
> which is the previous behaviour. A positive value N specifies how many
> bytes to read from the socket.
> 
> [...]

Applied, thanks!

[1/2] io_uring/zcrx: add a read limit to recvzc requests
      commit: 9a53ea6aa5c87fe4c49297158e7982dbe4f96227
[2/2] io_uring/zcrx: add selftest case for recvzc with read limit
      commit: f4b4948fb824a9fbaff906d96f6d575305842efc

Best regards,
-- 
Jens Axboe




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests
  2025-02-24 13:11   ` Pavel Begunkov
@ 2025-02-24 15:46     ` David Wei
  0 siblings, 0 replies; 9+ messages in thread
From: David Wei @ 2025-02-24 15:46 UTC (permalink / raw)
  To: Pavel Begunkov, io-uring; +Cc: Jens Axboe, lizetao

On 2025-02-24 05:11, Pavel Begunkov wrote:
> On 2/24/25 04:13, David Wei wrote:
>> Currently multishot recvzc requests have no read limit and will remain
>> active so as long as the socket remains open. But, there are sometimes a
>> need to do a fixed length read e.g. peeking at some data in the socket.
>>
>> Add a length limit to recvzc requests `len`. A value of 0 means no limit
>> which is the previous behaviour. A positive value N specifies how many
>> bytes to read from the socket.
>>
>> Data will still be posted in aux completions, as before. This could be
>> split across multiple frags. But the primary recvzc request will now
>> complete once N bytes have been read. The completion of the recvzc
>> request will have res and cflags both set to 0.
> 
> Looks fine, can be improved later.
> 
> Reviewed-by: Pavel Begunkov <[email protected]>
> 
> 
>> Signed-off-by: David Wei <[email protected]>
>> ---
>>   io_uring/net.c  | 16 +++++++++++++---
>>   io_uring/zcrx.c | 13 +++++++++----
>>   io_uring/zcrx.h |  2 +-
>>   3 files changed, 23 insertions(+), 8 deletions(-)
> ...
>> diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
>> index f2d326e18e67..9c95b5b6ec4e 100644
>> --- a/io_uring/zcrx.c
>> +++ b/io_uring/zcrx.c
>> @@ -817,6 +817,7 @@ io_zcrx_recv_skb(read_descriptor_t *desc, struct sk_buff *skb,
> ...
>>   static int io_zcrx_tcp_recvmsg(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
>>                   struct sock *sk, int flags,
>> -                unsigned issue_flags)
>> +                unsigned issue_flags, unsigned int *outlen)
>>   {
>> +    unsigned int len = *outlen;
>>       struct io_zcrx_args args = {
>>           .req = req,
>>           .ifq = ifq,
>>           .sock = sk->sk_socket,
>>       };
>>       read_descriptor_t rd_desc = {
>> -        .count = 1,
>> +        .count = len ? len : UINT_MAX,
> 
> typedef struct {
>     ...
>     size_t count;
> } read_descriptor_t;
> 
> Should be SIZE_MAX, but it's not worth of respinning.

I'll send a follow up.

> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 0/2] io_uring/zcrx: recvzc read limit
  2025-02-24 14:35 ` [PATCH v3 0/2] io_uring/zcrx: recvzc " Jens Axboe
@ 2025-02-24 19:56   ` Jens Axboe
  2025-02-24 20:33     ` David Wei
  0 siblings, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2025-02-24 19:56 UTC (permalink / raw)
  To: io-uring, David Wei; +Cc: Pavel Begunkov, lizetao

On 2/24/25 7:35 AM, Jens Axboe wrote:
> 
> On Sun, 23 Feb 2025 20:13:17 -0800, David Wei wrote:
>> Currently multishot recvzc requests have no read limit and will remain
>> active so as long as the socket remains open. But, there are sometimes a
>> need to do a fixed length read e.g. peeking at some data in the socket.
>>
>> Add a length limit to recvzc requests `len`. A value of 0 means no limit
>> which is the previous behaviour. A positive value N specifies how many
>> bytes to read from the socket.
>>
>> [...]
> 
> Applied, thanks!
> 
> [1/2] io_uring/zcrx: add a read limit to recvzc requests
>       commit: 9a53ea6aa5c87fe4c49297158e7982dbe4f96227
> [2/2] io_uring/zcrx: add selftest case for recvzc with read limit
>       commit: f4b4948fb824a9fbaff906d96f6d575305842efc

Fixed up 1/2 for !CONFIG_NET, fwiw.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 0/2] io_uring/zcrx: recvzc read limit
  2025-02-24 19:56   ` Jens Axboe
@ 2025-02-24 20:33     ` David Wei
  2025-02-24 22:38       ` Jens Axboe
  0 siblings, 1 reply; 9+ messages in thread
From: David Wei @ 2025-02-24 20:33 UTC (permalink / raw)
  To: Jens Axboe, io-uring; +Cc: Pavel Begunkov, lizetao

On 2025-02-24 11:56, Jens Axboe wrote:
> On 2/24/25 7:35 AM, Jens Axboe wrote:
>>
>> On Sun, 23 Feb 2025 20:13:17 -0800, David Wei wrote:
>>> Currently multishot recvzc requests have no read limit and will remain
>>> active so as long as the socket remains open. But, there are sometimes a
>>> need to do a fixed length read e.g. peeking at some data in the socket.
>>>
>>> Add a length limit to recvzc requests `len`. A value of 0 means no limit
>>> which is the previous behaviour. A positive value N specifies how many
>>> bytes to read from the socket.
>>>
>>> [...]
>>
>> Applied, thanks!
>>
>> [1/2] io_uring/zcrx: add a read limit to recvzc requests
>>       commit: 9a53ea6aa5c87fe4c49297158e7982dbe4f96227
>> [2/2] io_uring/zcrx: add selftest case for recvzc with read limit
>>       commit: f4b4948fb824a9fbaff906d96f6d575305842efc
> 
> Fixed up 1/2 for !CONFIG_NET, fwiw.
> 

Thanks, and sorry for the noise. I'll be sure to compile check
!CONFIG_NET next time.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v3 0/2] io_uring/zcrx: recvzc read limit
  2025-02-24 20:33     ` David Wei
@ 2025-02-24 22:38       ` Jens Axboe
  0 siblings, 0 replies; 9+ messages in thread
From: Jens Axboe @ 2025-02-24 22:38 UTC (permalink / raw)
  To: David Wei, io-uring; +Cc: Pavel Begunkov, lizetao

On 2/24/25 1:33 PM, David Wei wrote:
> On 2025-02-24 11:56, Jens Axboe wrote:
>> On 2/24/25 7:35 AM, Jens Axboe wrote:
>>>
>>> On Sun, 23 Feb 2025 20:13:17 -0800, David Wei wrote:
>>>> Currently multishot recvzc requests have no read limit and will remain
>>>> active so as long as the socket remains open. But, there are sometimes a
>>>> need to do a fixed length read e.g. peeking at some data in the socket.
>>>>
>>>> Add a length limit to recvzc requests `len`. A value of 0 means no limit
>>>> which is the previous behaviour. A positive value N specifies how many
>>>> bytes to read from the socket.
>>>>
>>>> [...]
>>>
>>> Applied, thanks!
>>>
>>> [1/2] io_uring/zcrx: add a read limit to recvzc requests
>>>       commit: 9a53ea6aa5c87fe4c49297158e7982dbe4f96227
>>> [2/2] io_uring/zcrx: add selftest case for recvzc with read limit
>>>       commit: f4b4948fb824a9fbaff906d96f6d575305842efc
>>
>> Fixed up 1/2 for !CONFIG_NET, fwiw.
>>
> 
> Thanks, and sorry for the noise. I'll be sure to compile check
> !CONFIG_NET next time.

Easy to miss, and the kernel test bot always finds them. So not a huge
deal.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-02-24 22:38 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-24  4:13 [PATCH v3 0/2] io_uring/zcrx: recvzc read limit David Wei
2025-02-24  4:13 ` [PATCH v3 1/2] io_uring/zcrx: add a read limit to recvzc requests David Wei
2025-02-24 13:11   ` Pavel Begunkov
2025-02-24 15:46     ` David Wei
2025-02-24  4:13 ` [PATCH v3 2/2] io_uring/zcrx: add selftest case for recvzc with read limit David Wei
2025-02-24 14:35 ` [PATCH v3 0/2] io_uring/zcrx: recvzc " Jens Axboe
2025-02-24 19:56   ` Jens Axboe
2025-02-24 20:33     ` David Wei
2025-02-24 22:38       ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox