From: Stanislav Fomichev <stfomichev@gmail.com>
To: Daniel Borkmann <daniel@iogearbox.net>
Cc: netdev@vger.kernel.org, bpf@vger.kernel.org, kuba@kernel.org,
davem@davemloft.net, razor@blackwall.org, pabeni@redhat.com,
willemb@google.com, sdf@fomichev.me, john.fastabend@gmail.com,
martin.lau@kernel.org, jordan@jrife.io,
maciej.fijalkowski@intel.com, magnus.karlsson@intel.com,
David Wei <dw@davidwei.uk>
Subject: Re: [PATCH net-next 01/20] net, ynl: Add bind-queue operation
Date: Mon, 22 Sep 2025 09:04:13 -0700 [thread overview]
Message-ID: <aNFzfbIFkOY1f2bL@mini-arch> (raw)
In-Reply-To: <20250919213153.103606-2-daniel@iogearbox.net>
On 09/19, Daniel Borkmann wrote:
> From: David Wei <dw@davidwei.uk>
>
> Add a ynl netdev family operation called bind-queue that _binds_ an
> rxq from a real netdev to a virtual netdev i.e. netkit or veth. This
> bound or _mapped_ rxq in the virtual netdev acts as a proxy for the
> parent real rxq, and can be used by processes running in a container
> to use memory providers (io_uring zero-copy rx or devmem) or AF_XDP.
> An early implementation had only driver-specific integration [0],
> but in order for other virtual devices to reuse, it makes sense to
> have this as a generic API.
>
> src-ifindex and src-queue-id is the real netdev and rxq respectively.
> dst-ifindex is the virtual netdev. Note that this op doesn't take
> dst-queue-id, because the expectation is that the op will _create_ a
> new rxq in the virtual netdev. The virtual netdev must have
> real_num_rx_queues less than num_rx_queues at the time of calling
> bind-queue.
>
> Signed-off-by: David Wei <dw@davidwei.uk>
> Co-developed-by: Daniel Borkmann <daniel@iogearbox.net>
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> Link: https://bpfconf.ebpf.io/bpfconf2025/bpfconf2025_material/lsfmmbpf_2025_netkit_borkmann.pdf [0]
> ---
> Documentation/netlink/specs/netdev.yaml | 37 +++++++++++++++++++++++++
> include/uapi/linux/netdev.h | 11 ++++++++
> net/core/netdev-genl-gen.c | 14 ++++++++++
> net/core/netdev-genl-gen.h | 1 +
> net/core/netdev-genl.c | 4 +++
> tools/include/uapi/linux/netdev.h | 11 ++++++++
> 6 files changed, 78 insertions(+)
>
> diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml
> index e00d3fa1c152..99a430ea8a9a 100644
> --- a/Documentation/netlink/specs/netdev.yaml
> +++ b/Documentation/netlink/specs/netdev.yaml
> @@ -561,6 +561,29 @@ attribute-sets:
> type: u32
> checks:
> min: 1
> + -
> + name: queue-pair
> + attributes:
> + -
> + name: src-ifindex
> + doc: netdev ifindex of the physical device
> + type: u32
> + checks:
> + min: 1
> + -
> + name: src-queue-id
> + doc: netdev queue id of the physical device
> + type: u32
> + -
> + name: dst-ifindex
> + doc: netdev ifindex of the virtual device
> + type: u32
> + checks:
> + min: 1
> + -
> + name: dst-queue-id
> + doc: netdev queue id of the virtual device
> + type: u32
>
> operations:
> list:
> @@ -772,6 +795,20 @@ operations:
> attributes:
> - id
>
> + -
> + name: bind-queue
> + doc: Bind a physical netdev queue to a virtual one
> + attribute-set: queue-pair
> + do:
> + request:
> + attributes:
> + - src-ifindex
> + - src-queue-id
> + - dst-ifindex
> + reply:
> + attributes:
> + - dst-queue-id
> +
> kernel-family:
> headers: ["net/netdev_netlink.h"]
> sock-priv: struct netdev_nl_sock
> diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h
> index 48eb49aa03d4..05e17765a39d 100644
> --- a/include/uapi/linux/netdev.h
> +++ b/include/uapi/linux/netdev.h
> @@ -210,6 +210,16 @@ enum {
> NETDEV_A_DMABUF_MAX = (__NETDEV_A_DMABUF_MAX - 1)
> };
>
> +enum {
> + NETDEV_A_QUEUE_PAIR_SRC_IFINDEX = 1,
> + NETDEV_A_QUEUE_PAIR_SRC_QUEUE_ID,
> + NETDEV_A_QUEUE_PAIR_DST_IFINDEX,
> + NETDEV_A_QUEUE_PAIR_DST_QUEUE_ID,
> +
> + __NETDEV_A_QUEUE_PAIR_MAX,
> + NETDEV_A_QUEUE_PAIR_MAX = (__NETDEV_A_QUEUE_PAIR_MAX - 1)
> +};
> +
> enum {
> NETDEV_CMD_DEV_GET = 1,
> NETDEV_CMD_DEV_ADD_NTF,
> @@ -226,6 +236,7 @@ enum {
> NETDEV_CMD_BIND_RX,
> NETDEV_CMD_NAPI_SET,
> NETDEV_CMD_BIND_TX,
> + NETDEV_CMD_BIND_QUEUE,
>
> __NETDEV_CMD_MAX,
> NETDEV_CMD_MAX = (__NETDEV_CMD_MAX - 1)
> diff --git a/net/core/netdev-genl-gen.c b/net/core/netdev-genl-gen.c
> index e9a2a6f26cb7..10b2ab4dd500 100644
> --- a/net/core/netdev-genl-gen.c
> +++ b/net/core/netdev-genl-gen.c
> @@ -106,6 +106,13 @@ static const struct nla_policy netdev_bind_tx_nl_policy[NETDEV_A_DMABUF_FD + 1]
> [NETDEV_A_DMABUF_FD] = { .type = NLA_U32, },
> };
>
> +/* NETDEV_CMD_BIND_QUEUE - do */
> +static const struct nla_policy netdev_bind_queue_nl_policy[NETDEV_A_QUEUE_PAIR_DST_IFINDEX + 1] = {
> + [NETDEV_A_QUEUE_PAIR_SRC_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
> + [NETDEV_A_QUEUE_PAIR_SRC_QUEUE_ID] = { .type = NLA_U32, },
> + [NETDEV_A_QUEUE_PAIR_DST_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
> +};
> +
> /* Ops table for netdev */
> static const struct genl_split_ops netdev_nl_ops[] = {
> {
> @@ -204,6 +211,13 @@ static const struct genl_split_ops netdev_nl_ops[] = {
> .maxattr = NETDEV_A_DMABUF_FD,
> .flags = GENL_CMD_CAP_DO,
> },
> + {
> + .cmd = NETDEV_CMD_BIND_QUEUE,
> + .doit = netdev_nl_bind_queue_doit,
> + .policy = netdev_bind_queue_nl_policy,
> + .maxattr = NETDEV_A_QUEUE_PAIR_DST_IFINDEX,
> + .flags = GENL_CMD_CAP_DO,
> + },
> };
>
> static const struct genl_multicast_group netdev_nl_mcgrps[] = {
> diff --git a/net/core/netdev-genl-gen.h b/net/core/netdev-genl-gen.h
> index cf3fad74511f..309248fe2b9e 100644
> --- a/net/core/netdev-genl-gen.h
> +++ b/net/core/netdev-genl-gen.h
> @@ -35,6 +35,7 @@ int netdev_nl_qstats_get_dumpit(struct sk_buff *skb,
> int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info);
> int netdev_nl_napi_set_doit(struct sk_buff *skb, struct genl_info *info);
> int netdev_nl_bind_tx_doit(struct sk_buff *skb, struct genl_info *info);
> +int netdev_nl_bind_queue_doit(struct sk_buff *skb, struct genl_info *info);
>
> enum {
> NETDEV_NLGRP_MGMT,
> diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c
> index 470fabbeacd9..b0aea27bf84e 100644
> --- a/net/core/netdev-genl.c
> +++ b/net/core/netdev-genl.c
> @@ -1120,6 +1120,10 @@ int netdev_nl_bind_tx_doit(struct sk_buff *skb, struct genl_info *info)
> return err;
> }
>
> +int netdev_nl_bind_queue_doit(struct sk_buff *skb, struct genl_info *info)
> +{
nit: return 'not supported' for now or something similar?
next prev parent reply other threads:[~2025-09-22 16:04 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-19 21:31 [PATCH net-next 00/20] netkit: Support for io_uring zero-copy and AF_XDP Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 01/20] net, ynl: Add bind-queue operation Daniel Borkmann
2025-09-22 16:04 ` Stanislav Fomichev [this message]
2025-09-22 16:13 ` Daniel Borkmann
2025-09-23 1:17 ` Jakub Kicinski
2025-09-23 16:13 ` David Wei
2025-09-19 21:31 ` [PATCH net-next 02/20] net: Add peer to netdev_rx_queue Daniel Borkmann
2025-09-23 1:22 ` Jakub Kicinski
2025-09-23 15:56 ` David Wei
2025-09-19 21:31 ` [PATCH net-next 03/20] net: Add ndo_queue_create callback Daniel Borkmann
2025-09-22 16:04 ` Stanislav Fomichev
2025-09-22 16:14 ` Daniel Borkmann
2025-09-23 15:58 ` David Wei
2025-09-23 1:22 ` Jakub Kicinski
2025-09-23 15:58 ` David Wei
2025-09-19 21:31 ` [PATCH net-next 04/20] net: Add ndo_{peer,unpeer}_queues callback Daniel Borkmann
2025-09-23 1:23 ` Jakub Kicinski
2025-09-23 16:06 ` David Wei
2025-09-23 16:26 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 05/20] net, ynl: Implement netdev_nl_bind_queue_doit Daniel Borkmann
2025-09-22 16:06 ` Stanislav Fomichev
2025-09-23 1:26 ` Jakub Kicinski
2025-09-23 16:06 ` David Wei
2025-09-19 21:31 ` [PATCH net-next 06/20] net, ynl: Add peer info to queue-get response Daniel Borkmann
2025-09-23 1:32 ` Jakub Kicinski
2025-09-23 16:08 ` David Wei
2025-09-19 21:31 ` [PATCH net-next 07/20] net, ethtool: Disallow mapped real rxqs to be resized Daniel Borkmann
2025-09-23 1:34 ` Jakub Kicinski
2025-09-23 1:38 ` Jakub Kicinski
2025-09-23 16:08 ` David Wei
2025-09-19 21:31 ` [PATCH net-next 08/20] net: Proxy net_mp_{open,close}_rxq for mapped queues Daniel Borkmann
2025-09-22 16:35 ` Stanislav Fomichev
2025-09-19 21:31 ` [PATCH net-next 09/20] xsk: Move NETDEV_XDP_ACT_ZC into generic header Daniel Borkmann
2025-09-22 15:59 ` Maciej Fijalkowski
2025-09-19 21:31 ` [PATCH net-next 10/20] xsk: Move pool registration into single function Daniel Borkmann
2025-09-22 16:01 ` Maciej Fijalkowski
2025-09-22 16:15 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 11/20] xsk: Add small helper xp_pool_bindable Daniel Borkmann
2025-09-22 16:03 ` Maciej Fijalkowski
2025-09-22 16:17 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 12/20] xsk: Change xsk_rcv_check to check netdev/queue_id from pool Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 13/20] xsk: Proxy pool management for mapped queues Daniel Borkmann
2025-09-22 16:48 ` Stanislav Fomichev
2025-09-22 17:01 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 14/20] netkit: Add single device mode for netkit Daniel Borkmann
2025-09-27 1:10 ` Jordan Rife
2025-09-29 7:55 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 15/20] netkit: Document fast vs slowpath members via macros Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 16/20] netkit: Implement rtnl_link_ops->alloc Daniel Borkmann
2025-09-27 1:17 ` Jordan Rife
2025-09-29 7:50 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 17/20] netkit: Implement ndo_queue_create Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 18/20] netkit: Add io_uring zero-copy support for TCP Daniel Borkmann
2025-09-22 3:17 ` zf
2025-09-22 16:23 ` Daniel Borkmann
2025-09-19 21:31 ` [PATCH net-next 19/20] netkit: Add xsk support for af_xdp applications Daniel Borkmann
2025-09-23 11:42 ` Toke Høiland-Jørgensen
2025-09-24 10:41 ` Daniel Borkmann
2025-09-26 8:55 ` Toke Høiland-Jørgensen
2025-09-19 21:31 ` [PATCH net-next 20/20] tools, ynl: Add queue binding ynl sample application Daniel Borkmann
2025-09-22 17:09 ` Stanislav Fomichev
2025-09-23 16:12 ` David Wei
2025-09-22 12:05 ` [PATCH net-next 00/20] netkit: Support for io_uring zero-copy and AF_XDP Nikolay Aleksandrov
2025-09-23 1:59 ` Jakub Kicinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aNFzfbIFkOY1f2bL@mini-arch \
--to=stfomichev@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=dw@davidwei.uk \
--cc=john.fastabend@gmail.com \
--cc=jordan@jrife.io \
--cc=kuba@kernel.org \
--cc=maciej.fijalkowski@intel.com \
--cc=magnus.karlsson@intel.com \
--cc=martin.lau@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=razor@blackwall.org \
--cc=sdf@fomichev.me \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.