[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20231107214045.2172393-5-dw@davidwei.uk>
Date: Tue, 7 Nov 2023 13:40:29 -0800
From: David Wei <dw@...idwei.uk>
To: io-uring@...r.kernel.org,
netdev@...r.kernel.org
Cc: Jens Axboe <axboe@...nel.dk>,
Pavel Begunkov <asml.silence@...il.com>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jesper Dangaard Brouer <hawk@...nel.org>,
David Ahern <dsahern@...nel.org>,
Mina Almasry <almasrymina@...gle.com>,
Willem de Bruijn <willemdebruijn.kernel@...il.com>,
Dragos Tatulea <dtatulea@...dia.com>
Subject: [PATCH 04/20] io_uring: setup ZC for an Rx queue when registering an ifq
This patch sets up ZC for an Rx queue in a net device when an ifq is
registered with io_uring. The Rx queue is specified in the registration
struct. The XDP command added in the previous patch is used to enable or
disable ZC Rx.
For now since there is only one ifq, its destruction is implicit during
io_uring cleanup.
Co-developed-by: Pavel Begunkov <asml.silence@...il.com>
Signed-off-by: Pavel Begunkov <asml.silence@...il.com>
Signed-off-by: David Wei <dw@...idwei.uk>
---
io_uring/zc_rx.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/io_uring/zc_rx.c b/io_uring/zc_rx.c
index a3a54845c712..85180c3044d8 100644
--- a/io_uring/zc_rx.c
+++ b/io_uring/zc_rx.c
@@ -4,6 +4,7 @@
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/io_uring.h>
+#include <linux/netdevice.h>
#include <uapi/linux/io_uring.h>
@@ -11,6 +12,35 @@
#include "kbuf.h"
#include "zc_rx.h"
+typedef int (*bpf_op_t)(struct net_device *dev, struct netdev_bpf *bpf);
+
+static int __io_queue_mgmt(struct net_device *dev, struct io_zc_rx_ifq *ifq,
+ u16 queue_id)
+{
+ struct netdev_bpf cmd;
+ bpf_op_t ndo_bpf;
+
+ ndo_bpf = dev->netdev_ops->ndo_bpf;
+ if (!ndo_bpf)
+ return -EINVAL;
+
+ cmd.command = XDP_SETUP_ZC_RX;
+ cmd.zc_rx.ifq = ifq;
+ cmd.zc_rx.queue_id = queue_id;
+
+ return ndo_bpf(dev, &cmd);
+}
+
+static int io_open_zc_rxq(struct io_zc_rx_ifq *ifq)
+{
+ return __io_queue_mgmt(ifq->dev, ifq, ifq->if_rxq_id);
+}
+
+static int io_close_zc_rxq(struct io_zc_rx_ifq *ifq)
+{
+ return __io_queue_mgmt(ifq->dev, NULL, ifq->if_rxq_id);
+}
+
static struct io_zc_rx_ifq *io_zc_rx_ifq_alloc(struct io_ring_ctx *ctx)
{
struct io_zc_rx_ifq *ifq;
@@ -20,12 +50,17 @@ static struct io_zc_rx_ifq *io_zc_rx_ifq_alloc(struct io_ring_ctx *ctx)
return NULL;
ifq->ctx = ctx;
+ ifq->if_rxq_id = -1;
return ifq;
}
static void io_zc_rx_ifq_free(struct io_zc_rx_ifq *ifq)
{
+ if (ifq->if_rxq_id != -1)
+ io_close_zc_rxq(ifq);
+ if (ifq->dev)
+ dev_put(ifq->dev);
io_free_rbuf_ring(ifq);
kfree(ifq);
}
@@ -42,17 +77,22 @@ int io_register_zc_rx_ifq(struct io_ring_ctx *ctx,
return -EFAULT;
if (ctx->ifq)
return -EBUSY;
+ if (reg.if_rxq_id == -1)
+ return -EINVAL;
ifq = io_zc_rx_ifq_alloc(ctx);
if (!ifq)
return -ENOMEM;
- /* TODO: initialise network interface */
-
ret = io_allocate_rbuf_ring(ifq, ®);
if (ret)
goto err;
+ ret = -ENODEV;
+ ifq->dev = dev_get_by_index(current->nsproxy->net_ns, reg.if_idx);
+ if (!ifq->dev)
+ goto err;
+
/* TODO: map zc region and initialise zc pool */
ifq->rq_entries = reg.rq_entries;
@@ -60,6 +100,10 @@ int io_register_zc_rx_ifq(struct io_ring_ctx *ctx,
ifq->if_rxq_id = reg.if_rxq_id;
ctx->ifq = ifq;
+ ret = io_open_zc_rxq(ifq);
+ if (ret)
+ goto err;
+
ring_sz = sizeof(struct io_rbuf_ring);
rqes_sz = sizeof(struct io_uring_rbuf_rqe) * ifq->rq_entries;
cqes_sz = sizeof(struct io_uring_rbuf_cqe) * ifq->cq_entries;
--
2.39.3
Powered by blists - more mailing lists