netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jesper Dangaard Brouer <hawk@kernel.org>
To: Jakub Kicinski <kuba@kernel.org>
Cc: netdev@vger.kernel.org, bpf@vger.kernel.org, tom@herbertland.com,
	"Eric Dumazet" <eric.dumazet@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	"Paolo Abeni" <pabeni@redhat.com>,
	"Toke Høiland-Jørgensen" <toke@toke.dk>,
	dsahern@kernel.org, makita.toshiaki@lab.ntt.co.jp,
	kernel-team@cloudflare.com, phil@nwl.cc
Subject: Re: [PATCH net-next V6 2/2] veth: apply qdisc backpressure on full ptr_ring to reduce TX drops
Date: Thu, 24 Apr 2025 17:24:51 +0200	[thread overview]
Message-ID: <c6abaa9f-cd3e-4259-bed6-5e795ff58ecd@kernel.org> (raw)
In-Reply-To: <20250424072352.18aa0df1@kernel.org>



On 24/04/2025 16.23, Jakub Kicinski wrote:
> On Thu, 24 Apr 2025 14:56:49 +0200 Jesper Dangaard Brouer wrote:
>> +	case NETDEV_TX_BUSY:
>> +		/* If a qdisc is attached to our virtual device, returning
>> +		 * NETDEV_TX_BUSY is allowed.
>> +		 */
>> +		txq = netdev_get_tx_queue(dev, rxq);
>> +
>> +		if (qdisc_txq_has_no_queue(txq)) {
>> +			dev_kfree_skb_any(skb);
>> +			goto drop;
>> +		}
>> +		netif_tx_stop_queue(txq);
>> +		/* Restore Eth hdr pulled by dev_forward_skb/eth_type_trans */
>> +		__skb_push(skb, ETH_HLEN);
>> +		/* Depend on prior success packets started NAPI consumer via
>> +		 * __veth_xdp_flush(). Cancel TXQ stop if consumer stopped,
>> +		 * paired with empty check in veth_poll().
>> +		 */
>> +		if (unlikely(__ptr_ring_empty(&rq->xdp_ring)))
>> +			netif_tx_wake_queue(txq);
> 
> Looks like I wrote a reply to v5 but didn't hit send. But I may have
> set v5 to Changes Requested because of it :S Here is my comment:
> 
>   I think this is missing a memory barrier. When drivers do this dance
>   there's usually a barrier between stop and recheck, to make sure the
>   stop is visible before we check. And vice versa veth_xdp_rcv() needs
>   to make sure other side sees the "empty" indication before it checks
>   if the queue is stopped.

The call netif_tx_stop_queue(txq); already contains a memory barrier
smp_mb__before_atomic() plus an atomic set_bit operation.  That should
be sufficient.

And the other side veth_poll(), have a smp_store_mb() before reading
ptr_ring.

--Jesper

p.s.
I actually had an alternative implementation of this, that only calls
stop when it is needed.  See below, it kind of looks prettier, but it
adds an extra memory barrier in the likely path. (And I'm not sure if 
read memory barrier is strong enough).


diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index 6ef24e261574..5ab352ccee38 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -390,15 +390,16 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, 
struct net_device *dev)
                         dev_kfree_skb_any(skb);
                         goto drop;
                 }
-               netif_tx_stop_queue(txq);
                 /* Restore Eth hdr pulled by 
dev_forward_skb/eth_type_trans */
                 __skb_push(skb, ETH_HLEN);
                 /* Depend on prior success packets started NAPI 
consumer via
-                * __veth_xdp_flush(). Cancel TXQ stop if consumer stopped,
-                * paired with empty check in veth_poll().
+                * __veth_xdp_flush().  Make sure consumer is still 
running and
+                * didn't completely queue, before stopping TXQ. Paired with
+                * queue check in veth_poll().
                  */
-               if (unlikely(__ptr_ring_empty(&rq->xdp_ring)))
-                       netif_tx_wake_queue(txq);
+               smp_rmb();
+               if (likely(!__ptr_ring_empty(&rq->xdp_ring)))
+                       netif_tx_stop_queue(txq);
                 break;
         case NET_RX_DROP: /* same as NET_XMIT_DROP */


  reply	other threads:[~2025-04-24 15:24 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-24 12:56 [PATCH net-next V6 0/2] veth: qdisc backpressure and qdisc check refactor Jesper Dangaard Brouer
2025-04-24 12:56 ` [PATCH net-next V6 1/2] net: sched: generalize check for no-queue qdisc on TX queue Jesper Dangaard Brouer
2025-04-24 12:56 ` [PATCH net-next V6 2/2] veth: apply qdisc backpressure on full ptr_ring to reduce TX drops Jesper Dangaard Brouer
2025-04-24 14:23   ` Jakub Kicinski
2025-04-24 15:24     ` Jesper Dangaard Brouer [this message]
2025-04-24 15:53       ` Jakub Kicinski
2025-04-25 13:55         ` Jesper Dangaard Brouer

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=c6abaa9f-cd3e-4259-bed6-5e795ff58ecd@kernel.org \
    --to=hawk@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=eric.dumazet@gmail.com \
    --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=phil@nwl.cc \
    --cc=toke@toke.dk \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).