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