Commit 3efd7ab4 authored by Mina Almasry's avatar Mina Almasry Committed by Jakub Kicinski
Browse files

net: netdev netlink api to bind dma-buf to a net device



API takes the dma-buf fd as input, and binds it to the netdevice. The
user can specify the rx queues to bind the dma-buf to.

Suggested-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Signed-off-by: default avatarMina Almasry <almasrymina@google.com>
Reviewed-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20240910171458.219195-3-almasrymina@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 7c88f865
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -457,6 +457,39 @@ attribute-sets:
          Number of times driver re-started accepting send
          requests to this queue from the stack.
        type: uint
  -
    name: queue-id
    subset-of: queue
    attributes:
      -
        name: id
      -
        name: type
  -
    name: dmabuf
    attributes:
      -
        name: ifindex
        doc: netdev ifindex to bind the dmabuf to.
        type: u32
        checks:
          min: 1
      -
        name: queues
        doc: receive queues to bind the dmabuf to.
        type: nest
        nested-attributes: queue-id
        multi-attr: true
      -
        name: fd
        doc: dmabuf file descriptor to bind.
        type: u32
      -
        name: id
        doc: id of the dmabuf binding
        type: u32
        checks:
          min: 1

operations:
  list:
@@ -619,6 +652,20 @@ operations:
            - rx-bytes
            - tx-packets
            - tx-bytes
    -
      name: bind-rx
      doc: Bind dmabuf to netdev
      attribute-set: dmabuf
      flags: [ admin-perm ]
      do:
        request:
          attributes:
            - ifindex
            - fd
            - queues
        reply:
          attributes:
            - id

mcast-groups:
  list:
+11 −0
Original line number Diff line number Diff line
@@ -173,6 +173,16 @@ enum {
	NETDEV_A_QSTATS_MAX = (__NETDEV_A_QSTATS_MAX - 1)
};

enum {
	NETDEV_A_DMABUF_IFINDEX = 1,
	NETDEV_A_DMABUF_QUEUES,
	NETDEV_A_DMABUF_FD,
	NETDEV_A_DMABUF_ID,

	__NETDEV_A_DMABUF_MAX,
	NETDEV_A_DMABUF_MAX = (__NETDEV_A_DMABUF_MAX - 1)
};

enum {
	NETDEV_CMD_DEV_GET = 1,
	NETDEV_CMD_DEV_ADD_NTF,
@@ -186,6 +196,7 @@ enum {
	NETDEV_CMD_QUEUE_GET,
	NETDEV_CMD_NAPI_GET,
	NETDEV_CMD_QSTATS_GET,
	NETDEV_CMD_BIND_RX,

	__NETDEV_CMD_MAX,
	NETDEV_CMD_MAX = (__NETDEV_CMD_MAX - 1)
+19 −0
Original line number Diff line number Diff line
@@ -27,6 +27,11 @@ const struct nla_policy netdev_page_pool_info_nl_policy[NETDEV_A_PAGE_POOL_IFIND
	[NETDEV_A_PAGE_POOL_IFINDEX] = NLA_POLICY_FULL_RANGE(NLA_U32, &netdev_a_page_pool_ifindex_range),
};

const struct nla_policy netdev_queue_id_nl_policy[NETDEV_A_QUEUE_TYPE + 1] = {
	[NETDEV_A_QUEUE_ID] = { .type = NLA_U32, },
	[NETDEV_A_QUEUE_TYPE] = NLA_POLICY_MAX(NLA_U32, 1),
};

/* NETDEV_CMD_DEV_GET - do */
static const struct nla_policy netdev_dev_get_nl_policy[NETDEV_A_DEV_IFINDEX + 1] = {
	[NETDEV_A_DEV_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
@@ -74,6 +79,13 @@ static const struct nla_policy netdev_qstats_get_nl_policy[NETDEV_A_QSTATS_SCOPE
	[NETDEV_A_QSTATS_SCOPE] = NLA_POLICY_MASK(NLA_UINT, 0x1),
};

/* NETDEV_CMD_BIND_RX - do */
static const struct nla_policy netdev_bind_rx_nl_policy[NETDEV_A_DMABUF_FD + 1] = {
	[NETDEV_A_DMABUF_IFINDEX] = NLA_POLICY_MIN(NLA_U32, 1),
	[NETDEV_A_DMABUF_FD] = { .type = NLA_U32, },
	[NETDEV_A_DMABUF_QUEUES] = NLA_POLICY_NESTED(netdev_queue_id_nl_policy),
};

/* Ops table for netdev */
static const struct genl_split_ops netdev_nl_ops[] = {
	{
@@ -151,6 +163,13 @@ static const struct genl_split_ops netdev_nl_ops[] = {
		.maxattr	= NETDEV_A_QSTATS_SCOPE,
		.flags		= GENL_CMD_CAP_DUMP,
	},
	{
		.cmd		= NETDEV_CMD_BIND_RX,
		.doit		= netdev_nl_bind_rx_doit,
		.policy		= netdev_bind_rx_nl_policy,
		.maxattr	= NETDEV_A_DMABUF_FD,
		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
	},
};

static const struct genl_multicast_group netdev_nl_mcgrps[] = {
+2 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@

/* Common nested types */
extern const struct nla_policy netdev_page_pool_info_nl_policy[NETDEV_A_PAGE_POOL_IFINDEX + 1];
extern const struct nla_policy netdev_queue_id_nl_policy[NETDEV_A_QUEUE_TYPE + 1];

int netdev_nl_dev_get_doit(struct sk_buff *skb, struct genl_info *info);
int netdev_nl_dev_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
@@ -30,6 +31,7 @@ int netdev_nl_napi_get_doit(struct sk_buff *skb, struct genl_info *info);
int netdev_nl_napi_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
int netdev_nl_qstats_get_dumpit(struct sk_buff *skb,
				struct netlink_callback *cb);
int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info);

enum {
	NETDEV_NLGRP_MGMT,
+6 −0
Original line number Diff line number Diff line
@@ -723,6 +723,12 @@ int netdev_nl_qstats_get_dumpit(struct sk_buff *skb,
	return err;
}

/* Stub */
int netdev_nl_bind_rx_doit(struct sk_buff *skb, struct genl_info *info)
{
	return 0;
}

static int netdev_genl_netdevice_event(struct notifier_block *nb,
				       unsigned long event, void *ptr)
{
Loading