From nobody Tue Jun 9 00:00:26 2026 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C34DD328B62 for ; Mon, 25 May 2026 09:49:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.167.41 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779702560; cv=pass; b=eAiWGl+nUkn+Kwu6sPaOFL7Q0MfisH3DbPiDyfOpwcCqDZzYsWEhffMIB56gZrXb2RUBEqkcbK29PeRLpO7v0BWpIHUXRny0FoFpyTm9c7Ga7x+E1J3swSAN47Xu16n6g1OErZhwj0jgn1Nx3mamPbU/us0VdcYcSauxCYGpkrU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779702560; c=relaxed/simple; bh=XUYsPYuEtgcbNqgabP8/NI595Lceo+HjypqozXcp/p0=; h=MIME-Version:From:Date:Message-ID:Subject:To:Cc:Content-Type; b=byMxh1TxxKymGSyv87IZkgY4QzUhnl/WLMiR3riUOjp13XThJPkWCoTCGSO1NLpvGsXaN0/J59k6QD6PcfKKmLtIt3pwLQh/9Tz8vd+5IyQ1unj8kAdlL65SOZZgNjQ/U7aG6VWcvTW1enWO+8Db3iMtlUtd0E581FFgcRdvQt0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=arista.com; spf=pass smtp.mailfrom=arista.com; dkim=pass (2048-bit key) header.d=arista.com header.i=@arista.com header.b=jHzoAyVU; arc=pass smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=arista.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arista.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=arista.com header.i=@arista.com header.b="jHzoAyVU" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5aa21fa024cso7004915e87.2 for ; Mon, 25 May 2026 02:49:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779702556; cv=none; d=google.com; s=arc-20240605; b=lS0o4jfyvQTMc7tB5vkYGhkb17pqDKewGazQjkJ8XbpC3YrWGYcNXMdY5MOAXdjPbJ TAn0fBWNbUEdxRg6gwUJhOA66WNh4YR0lucCEnX2d32hifB6Gow+xmTahJ0wyisLuetz z16zUMHAdAt1n3YIQ1vDChTX1EN5uLMny7RegP30OpXTjVsP0psKpsWzvNsvJQIl9MAA z+URCgf7ruXY94s9yxL9rmyz9eyqlCsPY6Z2kF9IAbsEbs2VhJg6/8HYKUfD+Vkrc7Id MRrSnUTvyjFVWPuoa9OWHaNoM5VcfwlFDWKWSJgQRUds+PnMBJ8kEeLKWUHZDDH586DF 9Iww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:mime-version:dkim-signature; bh=nl8gjzSMcK0ncvKIf7FJKv8fpIW2nt2TDnnsKu3pg48=; fh=adRY+QYSKZwHipnLs9W6Va/78oLFk6smqhdiLJqquXo=; b=T45RShngEYG1nrtgzmguG/8jn77HiXQrkjTouHKrXaCkrOgwtDDChfv6K5tiLe3FOg fSvbP2Q4EAf73CD9NK7bHwXEuUBTu6wMjggor1v76ih0thkojNTG00ARnZRH1Wsy9fCf Gn8ElS1lwWmc7afLw69xKbQVxfOtVIQVgIFXF1T2HoF2CLHH8FqiAcmGYeXvCIooXOFt JtQu2sQWpJTqiQ2dc2BFiLJ+ExYetZbMbTxLdcHsLd1UVNMUMnI8JTCYALgeOO579Mwd FU5yssRA/zIT5MzY2QN3LRdask/cYJWiLS8k16HE/ZxWaJ6sFnGJJy/Yyf1S1t3iAD17 uhUA==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=google; t=1779702556; x=1780307356; darn=vger.kernel.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=nl8gjzSMcK0ncvKIf7FJKv8fpIW2nt2TDnnsKu3pg48=; b=jHzoAyVUBYobk1RljF/k93ekiZJBPK13yy1ObCNMW/M8M/89FF3P0HJzR032VelIVC JVSoLJA1tMMWDAqDpPP7ZnShrmHA37oEzWnrXvkts92Go28cZ4zHJZlUbafa/HYG3pCl MVpP8soj+PDNNvTrY53yi68Nql9QaQ9bMXYqt/ScICHZjlQgTXSj7geS+lyXu51u9yK8 DDFZPC/nTwxPf41WCUvbcsNkYYEeLDu+F/aBq492aX2jEQ88+CcPf5S43DFsypLzWaZN s9RfWSGk7D5XelyaFO3hdtCUz66fCsoptOG8pNeJXUexmkmiy6O/eeOU3oROM6rRyFL6 Ozkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779702556; x=1780307356; h=cc:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nl8gjzSMcK0ncvKIf7FJKv8fpIW2nt2TDnnsKu3pg48=; b=DF/aWiuL5OeWKyU4FoQIUp+PiJ7CbKd4PERfEB3cK8v9jblMZW6vYwHCNHeseb6qkH TsGIbnotezx1rhD7G7MHBkeOu3G87co98qRWJ8UwHHhG5hrnHz9va0cdzqebx/8bAjTx umhuCZCHLsz6O/ZR0CI9oJ7yzWH5BKeAF0QkipDjAFH+qIK1uD5OtrJXmr7FGdgDMv/j fNCmXbdMRP49okbAaTBO+cbAWu0PF/l3hW+W7NlZDMVmT8X2LS5r6lrUcxJeuoH7ix0S qpj8hznOAmH2wp4fIzQkpOJuK8MgOAZiWOt6Xb3pK4+d8KVdCPB9W21cyAQRi9nWTj10 jmYw== X-Forwarded-Encrypted: i=1; AFNElJ/P8JKJ1aEImFXLta5NG3A7OR/c4dSpy0gQWuugQevrkAlhWZymSlrILVeEP4Ij/sSzZ5S6YLDhz/ith9A=@vger.kernel.org X-Gm-Message-State: AOJu0YwO+6c/9SlXu5wKjhapZaoMjn26DXBJJNMo6lKZDaiMII3iAAFZ PG3ukids+V7dSs3gkYyi8Vs2boa5UVeUs+7GkNmd4MLXHu5hNZ+Al+ak5/gIOdVil2oKBJc9Gwd Qxth7hSO+F1/AiZQCUkFm0B/6PH7In16GHFJ1NESZKzIc7v+1NDPiRg== X-Gm-Gg: Acq92OGDpoj/Wjhsv9oyj/nUOClfcR/85WOp/tbFfuGuNeurrfg8imP4CuWqw69x8pg FMHWpTrk+/swXDW49bAUScDiIYujtPlNGljc7qsAhlMjhC26CAqH7Ci5JqP3dTEufmPe0PM4nGM ze3LtY3gl1k5bi8qh4+W1gGSBGejJJIUBhJqsaNvDe8uRvDND/eVIWDedAwKRvx8Bh//QytznLE q4RBLmSQZHj4GTqfMfLN/zsvQvGq7cHSI+Nj7xMVV0TFKGHxXZA29cysL908UbBLbtEDxhl87c8 c9lpY2TA20dOlVgUKvo= X-Received: by 2002:a05:6512:31c2:b0:5a2:874e:8a1e with SMTP id 2adb3069b0e04-5aa323c56bbmr4180563e87.26.1779702555841; Mon, 25 May 2026 02:49:15 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Yury Murashka Date: Mon, 25 May 2026 10:49:03 +0100 X-Gm-Features: AVHnY4LCnuGEfwsBlq12wIIY9QZ6Ty1mVihVrqXdNhUZ5XhMZEDCZAaCV64FzkA Message-ID: Subject: [PATCH net v3] net: tg3: guard napi_disable and pci_disable_device calls To: Pavan Chebbi , mchan@broadcom.com Cc: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Yury Murashka Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" During PCIe hot-plug events, uncorrectable errors can be reported and AER recovery for the tg3 device is initiated by the AER kernel driver. The tg3_io_error_detected function is the AER error recovery handler. From tg3_io_error_detected, we call tg3_netif_stop->tg3_napi_disable-> napi_disable and return PCI_ERS_RESULT_NEED_RESET on non-fatal error. We expect that during AER recovery tg3_io_slot_reset and tg3_io_resume will be called. But AER error recovery can fail. For example, when one of PCIe devices on the same bus reports PCI_ERS_RESULT_NO_AER_DRIVER. As a result, tg3_io_slot_reset and tg3_io_resume are not called, PCIe device is disabled and NAPI is disabled (pci_disable_device and napi_disable are called from tg3_io_error_detected). Then we can try to disable PCIe link and napi_disable will be called again: napi_disable+0x1b/0x1b0 tg3_napi_disable+0x89/0xa0 [tg3] tg3_netif_stop+0x37/0xe3 [tg3] tg3_stop+0x30/0x160 [tg3] tg3_close+0x2a/0x60 [tg3] __dev_close_many+0xad/0x130 dev_close_many+0xb2/0x190 unregister_netdevice_many_notify+0x19d/0xa00 unregister_netdevice_queue+0xf8/0x140 unregister_netdev+0x1c/0x30 tg3_remove_one+0xaa/0x150 [tg3] pci_device_remove+0x42/0xb0 device_release_driver_internal+0x19c/0x200 pci_stop_bus_device+0x85/0xb0 pci_stop_bus_device+0x2c/0xb0 pci_stop_bus_device+0x2c/0xb0 pci_stop_and_remove_bus_device+0x12/0x20 pciehp_unconfigure_device+0x9f/0x160 pciehp_disable_slot+0x67/0x100 pciehp_handle_presence_or_link_change+0x77/0x350 This is not expected by napi_disable and a thread can be locked in napi_disable forever. We have pcierr_recovery to cover a similar issue, but for fatal errors. We cannot reuse this flag because it is reset in tg3_io_resume, but it is not called when AER recovery fails. Similarly, if an AER error is reported and tg3_io_error_detected calls pci_disable_device, a subsequent device removal via tg3_remove_one or tg3_shutdown will call pci_disable_device again for the already-disabled device. Add a napi_enabled flag to struct tg3 to track whether napi_enable has been called. Guard tg3_napi_disable() so it returns early if NAPI was not previously enabled. Also guard pci_disable_device() calls in tg3_remove_one() and tg3_shutdown() with pci_is_enabled() to avoid disabling an already-disabled device. Fixes: b45aa2f6192e ("tg3: Add EEH support") Signed-off-by: Yury Murashka Reviewed-by: Pavan Chebbi --- drivers/net/ethernet/broadcom/tg3.c | 14 ++++++++++++-- drivers/net/ethernet/broadcom/tg3.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 73a4b569b03e..86995e689519 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -7398,6 +7398,11 @@ static void tg3_napi_disable(struct tg3 *tp) struct tg3_napi *tnapi; int i; + if (!tp->napi_enabled) + return; + + tp->napi_enabled =3D false; + for (i =3D tp->irq_cnt - 1; i >=3D 0; i--) { tnapi =3D &tp->napi[i]; if (tnapi->tx_buffers) { @@ -7420,6 +7425,8 @@ static void tg3_napi_enable(struct tg3 *tp) struct tg3_napi *tnapi; int i; + tp->napi_enabled =3D true; + for (i =3D 0; i < tp->irq_cnt; i++) { tnapi =3D &tp->napi[i]; napi_enable_locked(&tnapi->napi); @@ -17718,6 +17725,7 @@ static int tg3_init_one(struct pci_dev *pdev, tp->tx_mode =3D TG3_DEF_TX_MODE; tp->irq_sync =3D 1; tp->pcierr_recovery =3D false; + tp->napi_enabled =3D false; if (tg3_debug > 0) tp->msg_enable =3D tg3_debug; @@ -18099,7 +18107,8 @@ static void tg3_remove_one(struct pci_dev *pdev) } free_netdev(dev); pci_release_regions(pdev); - pci_disable_device(pdev); + if (pci_is_enabled(pdev)) + pci_disable_device(pdev); } } @@ -18257,7 +18266,8 @@ static void tg3_shutdown(struct pci_dev *pdev) rtnl_unlock(); - pci_disable_device(pdev); + if (pci_is_enabled(pdev)) + pci_disable_device(pdev); } /** diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index a9e7f88fa26d..34fb771e8a86 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h @@ -3429,6 +3429,7 @@ struct tg3 { struct device *hwmon_dev; bool link_up; bool pcierr_recovery; + bool napi_enabled; u32 ape_hb; unsigned long ape_hb_interval; -- 2.51.0