Re: [PATCH net] net: bnxt: ring the doorbell when SW USO exits early

Michael Chan <[email protected]>
Newsgroups org.kernel.vger.netdev,org.kernel.vger.linux-kernel,org.kernel.vger.stable
Message-ID <CACKFLikEOu--B+q88X0pQsHQ0MuLM2onJKWnGGetSptgEpLrsw@mail.gmail.com>
On Tue, Aug 18, 2026 at 2:15 PM Joe Damato <[email protected]> wrote:

> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index bc7b37cb74a7..b6cc755f7a04 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -459,8 +459,7 @@ u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)
>         return md_dst->u.port_info.port_id;
>  }
>
> -static void bnxt_txr_db_kick(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
> -                            u16 prod)
> +void bnxt_txr_db_kick(struct bnxt *bp, struct bnxt_tx_ring_info *txr, u16 prod)
>  {
>         /* Sync BD data before updating doorbell */
>         wmb();
> @@ -485,6 +484,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
>         struct bnxt_sw_tx_bd *tx_buf;
>         __le32 lflags = 0;
>         skb_frag_t *frag;
> +       netdev_tx_t ret;
>
>         i = skb_get_queue_mapping(skb);
>         if (unlikely(i >= bp->tx_nr_rings)) {
> @@ -510,8 +510,17 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  #endif
>         if (skb_is_gso(skb) &&
>             (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) &&
> -           !(bp->flags & BNXT_FLAG_UDP_GSO_CAP))
> -               return bnxt_sw_udp_gso_xmit(bp, txr, txq, skb);
> +           !(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) {
> +               /* if the USO code exits early (for example, it returns
> +                * NETDEV_TX_BUSY) make sure we ring any outstanding doorbells
> +                * for any BDs in the ring before returning.
> +                */
> +               ret = bnxt_sw_udp_gso_xmit(bp, txr, txq, skb);
> +               if (txr->kick_pending)
> +                       bnxt_txr_db_kick(bp, txr, txr->tx_prod);
> +
> +               return ret;
> +       }
>
>         free_size = bnxt_tx_avail(bp, txr);
>         if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) {
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> index dc8ec5e5733e..60fbe3cabcf9 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> @@ -3009,6 +3009,8 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init);
>  void bnxt_tx_disable(struct bnxt *bp);
>  void bnxt_tx_enable(struct bnxt *bp);
>  u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb);
> +void bnxt_txr_db_kick(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
> +                     u16 prod);
>  void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
>                           u16 curr);
>  void bnxt_report_link(struct bnxt *bp);
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c
> index f317f60414e8..3c58b1d94ac9 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c
> @@ -223,9 +223,7 @@ netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp,
>         netdev_tx_sent_queue(txq, skb->len);
>
>         WRITE_ONCE(txr->tx_prod, prod);
> -       /* Sync BDs before doorbell */
> -       wmb();
> -       bnxt_db_write(bp, &txr->tx_db, prod);
> +       bnxt_txr_db_kick(bp, txr, prod);

The patch looks good to me.  But a slightly simpler approach is to
just set txr->kick_pending here.  Upon return, the new logic above
will always ring the doorbell for the success case.  By doing this, we
don't need to export bnxt_txr_db_kick().

But your patch is fine too, so:
Reviewed-by: Michael Chan <[email protected]>
smime.p7s (application/pkcs7-signature, 5.3 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.