[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230322202755.18e0f105@kernel.org>
Date: Wed, 22 Mar 2023 20:27:55 -0700
From: Jakub Kicinski <kuba@...nel.org>
To: Yunsheng Lin <linyunsheng@...wei.com>
Cc: <davem@...emloft.net>, <netdev@...r.kernel.org>,
<edumazet@...gle.com>, <pabeni@...hat.com>, <willemb@...gle.com>,
<alexander.duyck@...il.com>
Subject: Re: [PATCH net-next 1/3] net: provide macros for commonly copied
lockless queue stop/wake code
On Thu, 23 Mar 2023 11:05:36 +0800 Yunsheng Lin wrote:
> > +/* Lockless queue stopping / waking helpers.
> > + *
> > + * These macros are designed to safely implement stopping and waking
> > + * netdev queues without full lock protection. We assume that there can
> > + * be no concurrent stop attempts and no concurrent wake attempts.
> > + * The try-stop should happen from the xmit handler*, while wake up
>
> unnecessary '*' after handler?
>
> > + * should be triggered from NAPI poll context. The two may run
> > + * concurrently (single producer, single consumer).
> > + *
> > + * All descriptor ring indexes (and other relevant shared state) must
> > + * be updated before invoking the macros.
> > + *
> > + * * the try-stop side does not reschedule Tx (netif_tx_start_queue()
>
> double '*' here?
It's a footnote..
> > + * instead of netif_tx_wake_queue()) so uses outside of the xmit
> > + * handler may lead to bugs
> > + */
> > +
> > +#define netif_tx_queue_try_stop(txq, get_desc, start_thrs) \
> > + ({ \
> > + int _res; \
> > + \
> > + netif_tx_stop_queue(txq); \
> > + \
> > + smp_mb(); \
> > + \
> > + /* We need to check again in a case another \
> > + * CPU has just made room available. \
> > + */ \
> > + if (likely(get_desc < start_thrs)) { \
> > + _res = 0; \
> > + } else { \
> > + netif_tx_start_queue(txq); \
> > + _res = -1; \
> > + } \
> > + _res; \
> > + }) \
> > +
> > +/**
> > + * netif_tx_queue_maybe_stop() - locklessly stop a Tx queue, if needed
> > + * @txq: struct netdev_queue to stop/start
> > + * @get_desc: get current number of free descriptors (see requirements below!)
> > + * @stop_thrs: minimal number of available descriptors for queue to be left
> > + * enabled
> > + * @start_thrs: minimal number of descriptors to re-enable the queue, can be
> > + * equal to @stop_thrs or higher to avoid frequent waking
> > + *
> > + * All arguments may be evaluated multiple times, beware of side effects.
> > + * @get_desc must be a formula or a function call, it must always
> > + * return up-to-date information when evaluated!
> > + * Expected to be used from ndo_start_xmit, see the comment on top of the file.
>
> For now,there seems to be three ways of calling *_maybe_stop():
> 1. called before transimting a skb.
> 2. called after transimting a skb.
> 3. called both before and after transimting a skb.
>
> Which one should new driver follow?
> Do we need to make it clear here?
After, the check before is more of a sanity check.
AFAIR netdevice.rst or some other place documents the stopping
expectations.
Powered by blists - more mailing lists