ACK: [SRU X] [PATCH 1/1] UBUNTU: SAUCE: bnxt_en_bpo: Fix TX timeout during netpoll
Brad Figg
brad.figg at canonical.com
Wed Feb 27 16:03:50 UTC 2019
See my comment on the cover letter for this patch.
On Fri, Feb 22, 2019 at 11:20:29AM +0100, Nivedita Singhvi wrote:
> From: Michael Chan <michael.chan at broadcom.com>
>
> BugLink: http://bugs.launchpad.net/bugs/1814095
>
> The current netpoll implementation in the bnxt_en driver has problems
> that may miss TX completion events. bnxt_poll_work() in effect is
> only handling at most 1 TX packet before exiting. In addition, there
> may be in flight TX completions that ->poll() may miss even after we
> fix bnxt_poll_work() to handle all visible TX completions. netpoll
> may not call ->poll() again and HW may not generate IRQ because the
> driver does not ARM the IRQ when the budget (0 for netpoll) is reached.
> We fix it by handling all TX completions and to always ARM the IRQ
> when we exit ->poll() with 0 budget. Also, the logic to ACK the
> completion ring in case it is almost filled with TX completions need
> to be adjusted to take care of the 0 budget case, as discussed with
> Eric Dumazet <edumazet at google.com>
>
> Reported-by: Song Liu <songliubraving at fb.com>
> Reviewed-by: Song Liu <songliubraving at fb.com>
> Tested-by: Song Liu <songliubraving at fb.com>
> Signed-off-by: Michael Chan <michael.chan at broadcom.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (backported from commit 73f21c653f930f438d53eed29b5e4c65c8a0f906
> upstream)
> Signed-off-by: Nivedita Singhvi <nivedita.singhvi at canonical.com>
>
>
> diff --git a/ubuntu/bnxt/bnxt.c b/ubuntu/bnxt/bnxt.c
> index f04db69..9b51120 100644
> --- a/ubuntu/bnxt/bnxt.c
> +++ b/ubuntu/bnxt/bnxt.c
> @@ -2006,8 +2006,11 @@ static int bnxt_poll_work(struct bnxt *bp, struct
> bnxt_napi *bnapi, int budget)
> if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
> tx_pkts++;
> /* return full budget so NAPI will complete. */
> - if (unlikely(tx_pkts > bp->tx_wake_thresh))
> + if (unlikely(tx_pkts > bp->tx_wake_thresh)) {
> rx_pkts = budget;
> + raw_cons = NEXT_RAW_CMP(raw_cons);
> + break;
> + }
> } else if ((TX_CMP_TYPE(txcmp) & 0x30) == 0x10) {
> if (likely(budget))
> rc = bnxt_rx_pkt(bp, bnapi, &raw_cons, &event);
> @@ -2028,7 +2031,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct
> bnxt_napi *bnapi, int budget)
> }
> raw_cons = NEXT_RAW_CMP(raw_cons);
>
> - if (rx_pkts == budget)
> + if (rx_pkts && rx_pkts == budget)
> break;
> }
>
> @@ -2156,8 +2159,12 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
> while (1) {
> work_done += bnxt_poll_work(bp, bnapi, budget - work_done);
>
> - if (work_done >= budget)
> + if (work_done >= budget) {
> + if (!budget)
> + BNXT_CP_DB_REARM(cpr->cp_doorbell,
> + cpr->cp_raw_cons);
> break;
> + }
>
> if (!bnxt_has_work(bp, cpr)) {
> #ifdef HAVE_NEW_NAPI_COMPLETE_DONE
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
--
Brad Figg brad.figg at canonical.com http://www.canonical.com
More information about the kernel-team
mailing list