All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Toke Høiland-Jørgensen" <toke@redhat.com>
To: Jesper Dangaard Brouer <hawk@kernel.org>,
	Eric Dumazet <eric.dumazet@gmail.com>,
	netdev@vger.kernel.org, Jakub Kicinski <kuba@kernel.org>,
	edumazet@google.com
Cc: bpf@vger.kernel.org, tom@herbertland.com,
	"David S. Miller" <davem@davemloft.net>,
	Paolo Abeni <pabeni@redhat.com>,
	dsahern@kernel.org, makita.toshiaki@lab.ntt.co.jp,
	kernel-team@cloudflare.com
Subject: Re: [PATCH net-next V2 2/2] net: sched: generalize check for no-op qdisc
Date: Wed, 09 Apr 2025 15:47:55 +0200	[thread overview]
Message-ID: <87ikndv438.fsf@toke.dk> (raw)
In-Reply-To: <e40c4f92-cc4f-49d2-9d7f-e2d88aeba873@kernel.org>

Jesper Dangaard Brouer <hawk@kernel.org> writes:

> On 08/04/2025 17.47, Eric Dumazet wrote:
>> 
>> On 4/8/25 5:31 PM, Jesper Dangaard Brouer wrote:
>>> Several drivers (e.g., veth, vrf) contain open-coded checks to determine
>>> whether a TX queue has a real qdisc attached - typically by testing if
>>> qdisc->enqueue is non-NULL.
>>>
>>> These checks are functionally equivalent to comparing the queue's qdisc
>>> pointer against &noop_qdisc (qdisc named "noqueue"). This equivalence
>>> stems from noqueue_init(), which explicitly clears the enqueue pointer
>>> for the "noqueue" qdisc. As a result, __dev_queue_xmit() treats the qdisc
>>> as a no-op only when enqueue == NULL.
>>>
>>> This patch introduces a common helper, qdisc_txq_is_noop() to standardize
>>> this check. The helper is added in sch_generic.h and replaces open-coded
>>> logic in both the veth and vrf drivers.
>>>
>>> This is a non-functional change.
>>>
>>> Signed-off-by: Jesper Dangaard Brouer <hawk@kernel.org>
>>> ---
>>>   drivers/net/veth.c        |   14 +-------------
>>>   drivers/net/vrf.c         |    3 +--
>>>   include/net/sch_generic.h |    7 ++++++-
>>>   3 files changed, 8 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/drivers/net/veth.c b/drivers/net/veth.c
>>> index f29a0db2ba36..83c7758534da 100644
>>> --- a/drivers/net/veth.c
>>> +++ b/drivers/net/veth.c
>>> @@ -341,18 +341,6 @@ static bool veth_skb_is_eligible_for_gro(const 
>>> struct net_device *dev,
>>>            rcv->features & (NETIF_F_GRO_FRAGLIST | NETIF_F_GRO_UDP_FWD));
>>>   }
>>> -/* Does specific txq have a real qdisc attached? - see noqueue_init() */
>>> -static inline bool txq_has_qdisc(struct netdev_queue *txq)
>>> -{
>>> -    struct Qdisc *q;
>>> -
>>> -    q = rcu_dereference(txq->qdisc);
>>> -    if (q->enqueue)
>>> -        return true;
>>> -    else
>>> -        return false;
>>> -}
>>> -
>>>   static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device 
>>> *dev)
>>>   {
>>>       struct veth_priv *rcv_priv, *priv = netdev_priv(dev);
>>> @@ -399,7 +387,7 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, 
>>> struct net_device *dev)
>>>            */
>>>           txq = netdev_get_tx_queue(dev, rxq);
>>> -        if (!txq_has_qdisc(txq)) {
>>> +        if (qdisc_txq_is_noop(txq)) {
>>>               dev_kfree_skb_any(skb);
>>>               goto drop;
>>>           }
>>> diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
>>> index 7168b33adadb..d4fe36c55f29 100644
>>> --- a/drivers/net/vrf.c
>>> +++ b/drivers/net/vrf.c
>>> @@ -349,9 +349,8 @@ static bool qdisc_tx_is_default(const struct 
>>> net_device *dev)
>>>           return false;
>>>       txq = netdev_get_tx_queue(dev, 0);
>>> -    qdisc = rcu_access_pointer(txq->qdisc);
>>> -    return !qdisc->enqueue;
>>> +    return qdisc_txq_is_noop(txq);
>>>   }
>>>   /* Local traffic destined to local address. Reinsert the packet to rx
>>> diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
>>> index d48c657191cd..eb90d5103371 100644
>>> --- a/include/net/sch_generic.h
>>> +++ b/include/net/sch_generic.h
>>> @@ -803,6 +803,11 @@ static inline bool qdisc_tx_changing(const struct 
>>> net_device *dev)
>>>       return false;
>>>   }
>>> +static inline bool qdisc_txq_is_noop(const struct netdev_queue *txq)
>>> +{
>>> +    return (rcu_access_pointer(txq->qdisc) == &noop_qdisc);
>> 
>> 
>> return (expression);
>> 
>> ->
>> 
>> return expression;
>> 
>> 
>> return rcu_access_pointer(txq->qdisc) == &noop_qdisc;
>
> Will fix in next iteration.
>
>> I also feel this patch should come first in the series ?
>> 
>
> To me it looks/feels wrong doing this before there are two users.
> With only the vrf driver, the changed looked unnecessary.
> The diff stats looks/feels wrong, when it's patch-1.

Generalising something in preparation for another user is pretty normal,
isn't it? Just write this in the commit message, like: "In preparation
for using this in more places, move the check for a noop qdisc from the
vrf driver into sch_generic.h" - or something like that?

-Toke


  reply	other threads:[~2025-04-09 13:48 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-08 15:31 [PATCH net-next V2 0/2] veth: qdisc backpressure and qdisc check refactor Jesper Dangaard Brouer
2025-04-08 15:31 ` [PATCH net-next V2 1/2] veth: apply qdisc backpressure on full ptr_ring to reduce TX drops Jesper Dangaard Brouer
2025-04-11 12:45   ` Simon Horman
2025-04-11 13:56     ` Jesper Dangaard Brouer
2025-04-11 14:32       ` Toke Høiland-Jørgensen
2025-04-08 15:31 ` [PATCH net-next V2 2/2] net: sched: generalize check for no-op qdisc Jesper Dangaard Brouer
2025-04-08 15:47   ` Eric Dumazet
2025-04-09 13:28     ` Jesper Dangaard Brouer
2025-04-09 13:47       ` Toke Høiland-Jørgensen [this message]
2025-04-11 12:48   ` Simon Horman
2025-04-11 12:59 ` [PATCH net-next V2 0/2] veth: qdisc backpressure and qdisc check refactor Jakub Sitnicki

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=87ikndv438.fsf@toke.dk \
    --to=toke@redhat.com \
    --cc=bpf@vger.kernel.org \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=edumazet@google.com \
    --cc=eric.dumazet@gmail.com \
    --cc=hawk@kernel.org \
    --cc=kernel-team@cloudflare.com \
    --cc=kuba@kernel.org \
    --cc=makita.toshiaki@lab.ntt.co.jp \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=tom@herbertland.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.