On Fri, 28 Jun 2024 00:32:39 +0000 Mina Almasry wrote: > 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: Stanislav Fomichev <sdf@xxxxxxxxxx> > Signed-off-by: Mina Almasry <almasrymina@xxxxxxxxxx> > diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml > index 959755be4d7f9..899ac0882a098 100644 > --- a/Documentation/netlink/specs/netdev.yaml > +++ b/Documentation/netlink/specs/netdev.yaml > @@ -268,6 +268,45 @@ attribute-sets: > name: napi-id > doc: ID of the NAPI instance which services this queue. > type: u32 > + - > + name: queue-dmabuf > + attributes: > + - > + name: type > + doc: rx or tx queue > + type: u8 > + enum: queue-type > + - > + name: idx > + doc: queue index > + type: u32 u8 is a waste of space, since attrs are rounded up to 4B and we don't use "idx" How about we use a subset of queue attrs? name: queue-id subset-of: queue attributes: - name: id - name: type > + - > + name: bind-dmabuf The naming is a bit too command specific, how about pp-buf ? Or just dmabuf ? > + attributes: > + - > + name: ifindex > + doc: netdev ifindex to bind the dma-buf to. > + type: u32 > + checks: > + min: 1 > + - > + name: queues > + doc: receive queues to bind the dma-buf to. > + type: nest > + nested-attributes: queue-dmabuf > + multi-attr: true > + - > + name: dmabuf-fd > + doc: dmabuf file descriptor to bind. > + type: u32 > + - > + name: dmabuf-id > + doc: id of the dmabuf binding > + type: u32 > + checks: > + min: 1 > + We need some form of introspection. Can we add both in the queue dump and page pool dump some info (dmabuf-id?) to indicate there is a DMABUF bound to the queue / page pool? > - > name: qstats > @@ -579,6 +618,20 @@ operations: > attributes: > - ifindex > reply: *queue-get-op > + - > + name: bind-rx > + doc: Bind dmabuf to netdev > + attribute-set: bind-dmabuf > + flags: [ admin-perm ] > + do: > + request: > + attributes: > + - ifindex > + - dmabuf-fd > + - queues > + reply: > + attributes: > + - dmabuf-id The ops end up getting rendered as an enum, so the ordering matters. You can't insert in the middle without breaking uAPI. For attribute sets (which you also added before qstat) it technically doesn't matter but would be good to have them in order to match ops. > diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h > index 43742ac5b00da..190a504a62358 100644 > --- a/include/uapi/linux/netdev.h > +++ b/include/uapi/linux/netdev.h > @@ -136,6 +136,24 @@ enum { > NETDEV_A_QUEUE_MAX = (__NETDEV_A_QUEUE_MAX - 1) > }; > > +enum { > + NETDEV_A_QUEUE_DMABUF_TYPE = 1, > + NETDEV_A_QUEUE_DMABUF_IDX, > + > + __NETDEV_A_QUEUE_DMABUF_MAX, > + NETDEV_A_QUEUE_DMABUF_MAX = (__NETDEV_A_QUEUE_DMABUF_MAX - 1) > +}; > + > +enum { > + NETDEV_A_BIND_DMABUF_IFINDEX = 1, > + NETDEV_A_BIND_DMABUF_QUEUES, > + NETDEV_A_BIND_DMABUF_DMABUF_FD, > + NETDEV_A_BIND_DMABUF_DMABUF_ID, This does look kinda repetitive, maybe let's drop the dmabuf from attr names? > + __NETDEV_A_BIND_DMABUF_MAX, > + NETDEV_A_BIND_DMABUF_MAX = (__NETDEV_A_BIND_DMABUF_MAX - 1) > +};