From b02aaccc6beb72654c16307217843662ce916eea Mon Sep 17 00:00:00 2001 From: Carsten Beckmann Date: Mon, 21 Sep 2026 10:48:32 +0200 Subject: [PATCH 3/8] iavf: prevent panic in iavf_process_arq during reset There is a small window during a VF reset where the ICR register in iavf_intr still contains its normal value but when arq_head is read in iavf_process_arq it returns 0xdeadbeef. Using this for prod (even masked) will lead to a panic, so check for 0xdeadbeef first and trigger a reset if it is detected. --- sys/dev/pci/if_iavf.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sys/dev/pci/if_iavf.c b/sys/dev/pci/if_iavf.c index 5a15f80db48..6e7921e22e1 100644 --- a/sys/dev/pci/if_iavf.c +++ b/sys/dev/pci/if_iavf.c @@ -2723,8 +2723,16 @@ iavf_process_arq(struct iavf_softc *sc, int fill) unsigned int prod; int done = 0; - prod = iavf_rd(sc, sc->sc_aq_regs->arq_head) & - sc->sc_aq_regs->arq_head_mask; + prod = iavf_rd(sc, sc->sc_aq_regs->arq_head); + + if (prod == IAVF_REG_VFR) { + printf("%s: VF reset in progress\n", DEVNAME(sc)); + sc->sc_resetting = 1; + task_add(systq, &sc->sc_reset_task); + return (1); + } + + prod &= sc->sc_aq_regs->arq_head_mask; if (cons == prod) return (0); -- 2.53.0