[PATCH 1/1] [SRU X] UBUNTU: SAUCE: bnxt_en_bpo: Fix TX timeout during netpoll
Nivedita Singhvi
nivedita.singhvi at canonical.com
Sun Mar 3 19:06:49 UTC 2019
From: Michael Chan <michael.chan at broadcom.com>
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)
[niv: Patch is for ubuntu/bnxt driver, adjusted file paths accordingly.]
Signed-off-by: Nivedita Singhvi <nivedita.singhvi at canonical.com>
---
ubuntu/bnxt/bnxt.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/ubuntu/bnxt/bnxt.c b/ubuntu/bnxt/bnxt.c
index f04db6967461..fd3649f46252 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
--
2.17.1
More information about the kernel-team
mailing list