bnxt_en: Do not process completion entries after fatal condition detected.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 25 Jan 2021 07:08:21 +0000 (02:08 -0500)
committerJakub Kicinski <kuba@kernel.org>
Tue, 26 Jan 2021 03:20:05 +0000 (19:20 -0800)
Once the firmware fatal condition is detected, we should cease
comminication with the firmware and hardware quickly even if there
are many completion entries in the completion rings.  This will
speed up the recovery process and prevent further I/Os that may
cause further exceptions.

Do not proceed in the NAPI poll function if fatal condition is
detected.  Call napi_complete() and return without arming interrupts.
Cleanup of all rings and reset are imminent.

Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 221f543..dd7d2ca 100644 (file)
@@ -2405,6 +2405,10 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
        struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
        int work_done = 0;
 
+       if (unlikely(test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))) {
+               napi_complete(napi);
+               return 0;
+       }
        while (1) {
                work_done += bnxt_poll_work(bp, cpr, budget - work_done);
 
@@ -2479,6 +2483,10 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
        int work_done = 0;
        u32 cons;
 
+       if (unlikely(test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))) {
+               napi_complete(napi);
+               return 0;
+       }
        if (cpr->has_more_work) {
                cpr->has_more_work = 0;
                work_done = __bnxt_poll_cqs(bp, bnapi, budget);