All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Mina Almasry <almasrymina@google.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-doc@vger.kernel.org, linux-alpha@vger.kernel.org,
	linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org,
	sparclinux@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-kselftest@vger.kernel.org,
	bpf@vger.kernel.org, linux-media@vger.kernel.org,
	dri-devel@lists.freedesktop.org,
	"Donald Hunter" <donald.hunter@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	"Eric Dumazet" <edumazet@google.com>,
	"Paolo Abeni" <pabeni@redhat.com>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Ivan Kokshaysky" <ink@jurassic.park.msu.ru>,
	"Matt Turner" <mattst88@gmail.com>,
	"Thomas Bogendoerfer" <tsbogend@alpha.franken.de>,
	"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>,
	"Helge Deller" <deller@gmx.de>,
	"Andreas Larsson" <andreas@gaisler.com>,
	"Jesper Dangaard Brouer" <hawk@kernel.org>,
	"Ilias Apalodimas" <ilias.apalodimas@linaro.org>,
	"Steven Rostedt" <rostedt@goodmis.org>,
	"Masami Hiramatsu" <mhiramat@kernel.org>,
	"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Steffen Klassert" <steffen.klassert@secunet.com>,
	"Herbert Xu" <herbert@gondor.apana.org.au>,
	"David Ahern" <dsahern@kernel.org>,
	"Willem de Bruijn" <willemdebruijn.kernel@gmail.com>,
	"Shuah Khan" <shuah@kernel.org>,
	"Sumit Semwal" <sumit.semwal@linaro.org>,
	"Christian König" <christian.koenig@amd.com>,
	"Bagas Sanjaya" <bagasdotme@gmail.com>,
	"Christoph Hellwig" <hch@infradead.org>,
	"Nikolay Aleksandrov" <razor@blackwall.org>,
	"Taehee Yoo" <ap420073@gmail.com>,
	"Pavel Begunkov" <asml.silence@gmail.com>,
	"David Wei" <dw@davidwei.uk>, "Jason Gunthorpe" <jgg@ziepe.ca>,
	"Yunsheng Lin" <linyunsheng@huawei.com>,
	"Shailend Chand" <shailend@google.com>,
	"Harshitha Ramamurthy" <hramamurthy@google.com>,
	"Shakeel Butt" <shakeel.butt@linux.dev>,
	"Jeroen de Borst" <jeroendb@google.com>,
	"Praveen Kaligineedi" <pkaligineedi@google.com>,
	"Willem de Bruijn" <willemb@google.com>,
	"Kaiyuan Zhang" <kaiyuanz@google.com>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>
Subject: Re: [PATCH net-next v18 03/14] netdev: support binding dma-buf to netdevice
Date: Tue, 6 Aug 2024 13:37:18 -0700	[thread overview]
Message-ID: <20240806133718.71a53a4f@kernel.org> (raw)
In-Reply-To: <20240805212536.2172174-4-almasrymina@google.com>

On Mon,  5 Aug 2024 21:25:16 +0000 Mina Almasry wrote:
> +/* Protected by rtnl_lock() */
> +static DEFINE_XARRAY_FLAGS(net_devmem_dmabuf_bindings, XA_FLAGS_ALLOC1);

nit: global variable declarations before any code

> +void net_devmem_unbind_dmabuf(struct net_devmem_dmabuf_binding *binding)
> +{
> +	struct netdev_rx_queue *rxq;
> +	unsigned long xa_idx;
> +	unsigned int rxq_idx;
> +
> +	if (binding->list.next)
> +		list_del(&binding->list);
> +
> +	xa_for_each(&binding->bound_rxqs, xa_idx, rxq) {
> +		if (rxq->mp_params.mp_priv == binding) {
> +			rxq->mp_params.mp_priv = NULL;
> +
> +			rxq_idx = get_netdev_rx_queue_index(rxq);
> +
> +			netdev_rx_queue_restart(binding->dev, rxq_idx);

Throw in a WARN_ON() around this, hopefully we'll get to addressing it
later..

> +		}
> +	}
> +
> +	xa_erase(&net_devmem_dmabuf_bindings, binding->id);
> +
> +	net_devmem_dmabuf_binding_put(binding);
> +}
> +
> +int net_devmem_bind_dmabuf_to_queue(struct net_device *dev, u32 rxq_idx,
> +				    struct net_devmem_dmabuf_binding *binding)
> +{
> +	struct netdev_rx_queue *rxq;
> +	u32 xa_idx;
> +	int err;
> +
> +	if (rxq_idx >= dev->real_num_rx_queues)
> +		return -ERANGE;

If we prevent binding to an inactive queue we should also prevent
deactivation.

Please take a look at the (two?) callers of
ethtool_get_max_rxnfc_channel() and ethtool_get_max_rxfh_channel().
Wrap those into a new function for reading max active channel, and
take mp binds into account as well (send the refactor separately 
from the series to avoid making it longer).

> +	rxq = __netif_get_rx_queue(dev, rxq_idx);
> +	if (rxq->mp_params.mp_priv)
> +		return -EEXIST;
> +
> +	err = xa_alloc(&binding->bound_rxqs, &xa_idx, rxq, xa_limit_32b,
> +		       GFP_KERNEL);
> +	if (err)
> +		return err;
> +
> +	rxq->mp_params.mp_priv = binding;
> +
> +	err = netdev_rx_queue_restart(dev, rxq_idx);
> +	if (err)
> +		goto err_xa_erase;
> +
> +	return 0;
> +
> +err_xa_erase:
> +	rxq->mp_params.mp_priv = NULL;
> +	xa_erase(&binding->bound_rxqs, xa_idx);
> +
> +	return err;
> +}

> +void dev_dmabuf_uninstall(struct net_device *dev)
> +{
> +	unsigned int i, count = dev->num_rx_queues;

nit: why stash the value of num_rx_queues ?

> +	struct net_devmem_dmabuf_binding *binding;
> +	struct netdev_rx_queue *rxq;
> +	unsigned long xa_idx;
> +
> +	for (i = 0; i < count; i++) {
> +		binding = dev->_rx[i].mp_params.mp_priv;
> +		if (binding)
> +			xa_for_each(&binding->bound_rxqs, xa_idx, rxq)
> +				if (rxq == &dev->_rx[i])
> +					xa_erase(&binding->bound_rxqs, xa_idx);

nit: Please use "continue", this is too deeply indented

> +	nla_for_each_attr_type(attr, NETDEV_A_DMABUF_QUEUES,
> +			       genlmsg_data(info->genlhdr),
> +			       genlmsg_len(info->genlhdr), rem) {
> +		err = nla_parse_nested(
> +			tb, ARRAY_SIZE(netdev_queue_id_nl_policy) - 1, attr,
> +			netdev_queue_id_nl_policy, info->extack);
> +		if (err < 0)
> +			goto err_unbind;
> +
> +		rxq_idx = nla_get_u32(tb[NETDEV_A_QUEUE_ID]);

How do we know this attribute is present?  NL_REQ_ATTR_CHECK()

> +		err = net_devmem_bind_dmabuf_to_queue(netdev, rxq_idx, binding);
> +		if (err)
> +			goto err_unbind;
> +	}
> +
> +	list_add(&binding->list, sock_binding_list);
> +
> +	nla_put_u32(rsp, NETDEV_A_DMABUF_ID, binding->id);
> +	genlmsg_end(rsp, hdr);
> +
> +	rtnl_unlock();

nit: for symmetry you should also unlock after list_add(),
     netlink msg alloc and prep are before rtnl_lock()

> +	return genlmsg_reply(rsp, info);
> +
> +err_unbind:
> +	net_devmem_unbind_dmabuf(binding);
> +err_unlock:
> +	rtnl_unlock();
> +err_genlmsg_free:
> +	nlmsg_free(rsp);
> +	return err;
>  }

> +void netdev_nl_sock_priv_init(struct list_head *priv)
> +{
> +	INIT_LIST_HEAD(priv);
> +}
> +
> +void netdev_nl_sock_priv_destroy(struct list_head *priv)
> +{
> +	struct net_devmem_dmabuf_binding *binding;
> +	struct net_devmem_dmabuf_binding *temp;
> +
> +	list_for_each_entry_safe(binding, temp, priv, list) {
> +		rtnl_lock();
> +		net_devmem_unbind_dmabuf(binding);
> +		rtnl_unlock();
> +	}
> +}

nit: move these before the subsys_initcall.. and what it calls

  reply	other threads:[~2024-08-06 20:37 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-05 21:25 [PATCH net-next v18 00/14] Device Memory TCP Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 01/14] netdev: add netdev_rx_queue_restart() Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 02/14] net: netdev netlink api to bind dma-buf to a net device Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 03/14] netdev: support binding dma-buf to netdevice Mina Almasry
2024-08-06 20:37   ` Jakub Kicinski [this message]
2024-08-05 21:25 ` [PATCH net-next v18 04/14] netdev: netdevice devmem allocator Mina Almasry
2024-08-06 20:47   ` Jakub Kicinski
2024-08-05 21:25 ` [PATCH net-next v18 05/14] page_pool: move dmaddr helpers to .c file Mina Almasry
2024-08-06 20:42   ` Jakub Kicinski
2024-08-05 21:25 ` [PATCH net-next v18 06/14] page_pool: devmem support Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 07/14] memory-provider: dmabuf devmem memory provider Mina Almasry
2024-08-06 20:59   ` Jakub Kicinski
2024-08-08 20:36     ` Mina Almasry
2024-08-09  2:24       ` Jakub Kicinski
2024-08-09 14:10         ` Mina Almasry
2024-08-09 15:45           ` Pavel Begunkov
2024-08-10  3:52             ` Jakub Kicinski
2024-08-11  2:21               ` Mina Almasry
2024-08-11 21:51                 ` Pavel Begunkov
2024-08-12 17:57                   ` Jakub Kicinski
2024-08-12 18:55                     ` Mina Almasry
2024-08-12 19:10                       ` Pavel Begunkov
2024-08-12 23:57                         ` Jakub Kicinski
2024-08-13  2:31                           ` Pavel Begunkov
2024-08-13 14:39                             ` Jakub Kicinski
2024-08-13 15:11                               ` Pavel Begunkov
2024-08-13 15:26                                 ` Jakub Kicinski
2024-08-12 18:57                     ` Pavel Begunkov
2024-08-12 19:04                       ` Pavel Begunkov
2024-08-13  0:15                         ` Jakub Kicinski
2024-08-13  1:56                           ` Pavel Begunkov
2024-08-13  8:39                           ` Mina Almasry
2024-08-13  9:03                             ` Mina Almasry
2024-08-13 14:33                             ` Jakub Kicinski
2024-08-05 21:25 ` [PATCH net-next v18 08/14] net: support non paged skb frags Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 09/14] net: add support for skbs with unreadable frags Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 10/14] tcp: RX path for devmem TCP Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 11/14] net: add SO_DEVMEM_DONTNEED setsockopt to release RX frags Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 12/14] net: add devmem TCP documentation Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 13/14] selftests: add ncdevmem, netcat for devmem TCP Mina Almasry
2024-08-05 21:25 ` [PATCH net-next v18 14/14] netdev: add dmabuf introspection Mina Almasry

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=20240806133718.71a53a4f@kernel.org \
    --to=kuba@kernel.org \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=almasrymina@google.com \
    --cc=andreas@gaisler.com \
    --cc=ap420073@gmail.com \
    --cc=arnd@arndb.de \
    --cc=asml.silence@gmail.com \
    --cc=bagasdotme@gmail.com \
    --cc=bpf@vger.kernel.org \
    --cc=christian.koenig@amd.com \
    --cc=corbet@lwn.net \
    --cc=daniel.vetter@ffwll.ch \
    --cc=davem@davemloft.net \
    --cc=deller@gmx.de \
    --cc=donald.hunter@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=dsahern@kernel.org \
    --cc=dw@davidwei.uk \
    --cc=edumazet@google.com \
    --cc=hawk@kernel.org \
    --cc=hch@infradead.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=hramamurthy@google.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=ink@jurassic.park.msu.ru \
    --cc=jeroendb@google.com \
    --cc=jgg@ziepe.ca \
    --cc=kaiyuanz@google.com \
    --cc=linux-alpha@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-parisc@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=linyunsheng@huawei.com \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mattst88@gmail.com \
    --cc=mhiramat@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=pkaligineedi@google.com \
    --cc=razor@blackwall.org \
    --cc=richard.henderson@linaro.org \
    --cc=rostedt@goodmis.org \
    --cc=shailend@google.com \
    --cc=shakeel.butt@linux.dev \
    --cc=shuah@kernel.org \
    --cc=sparclinux@vger.kernel.org \
    --cc=steffen.klassert@secunet.com \
    --cc=sumit.semwal@linaro.org \
    --cc=tsbogend@alpha.franken.de \
    --cc=willemb@google.com \
    --cc=willemdebruijn.kernel@gmail.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.