Message ID | 20220519140145.1917314-1-aleksandr.loktionov@intel.com |
---|---|
State | Accepted |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | [net,v4] i40e: Fix call trace in setup_tx_descriptors | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Loktionov, Aleksandr > Sent: Thursday, May 19, 2022 7:32 PM > To: intel-wired-lan@lists.osuosl.org; Nguyen, Anthony L > <anthony.l.nguyen@intel.com> > Cc: Loktionov, Aleksandr <aleksandr.loktionov@intel.com>; Jaron, MichalX > <michalx.jaron@intel.com> > Subject: [Intel-wired-lan] [PATCH net v4] i40e: Fix call trace in > setup_tx_descriptors > > From: Aleksandr Loktionov <aleksandr.loktionov@intel.com> > > After PF reset and ethtool -t there was call trace in dmesg sometimes leading > to panic. When there was some time, around 5 seconds, between reset and > test there were no errors. > > Problem was that pf reset calls i40e_vsi_close in prep_for_reset and ethtool > -t calls i40e_vsi_close in diag_test. If there was not enough time between > those commands the second i40e_vsi_close starts before previous > i40e_vsi_close was done which leads to crash. > > Add check to diag_test if pf is in reset and don't start offline tests if it is true. > Add netif_info("testing failed") into unhappy path of i40e_diag_test() > > Fixes: e17bc411aea8 ("i40e: Disable offline diagnostics if VFs are enabled") > Fixes: 510efb2682b3 ("i40e: Fix ethtool offline diagnostic with netqueues") > Signed-off-by: Michal Jaron <michalx.jaron@intel.com> > Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> > --- > .../net/ethernet/intel/i40e/i40e_ethtool.c | 25 +++++++++++++------ > 1 file changed, 17 insertions(+), 8 deletions(-) > Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c index e484996..06c05a6 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c @@ -2584,15 +2584,16 @@ static void i40e_diag_test(struct net_device *netdev, set_bit(__I40E_TESTING, pf->state); + if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) || + test_bit(__I40E_RESET_INTR_RECEIVED, pf->state)) { + dev_warn(&pf->pdev->dev, + "Cannot start offline testing when PF is in reset state.\n"); + goto skip_ol_tests; + } + if (i40e_active_vfs(pf) || i40e_active_vmdqs(pf)) { dev_warn(&pf->pdev->dev, "Please take active VFs and Netqueues offline and restart the adapter before running NIC diagnostics\n"); - data[I40E_ETH_TEST_REG] = 1; - data[I40E_ETH_TEST_EEPROM] = 1; - data[I40E_ETH_TEST_INTR] = 1; - data[I40E_ETH_TEST_LINK] = 1; - eth_test->flags |= ETH_TEST_FL_FAILED; - clear_bit(__I40E_TESTING, pf->state); goto skip_ol_tests; } @@ -2639,9 +2640,17 @@ static void i40e_diag_test(struct net_device *netdev, data[I40E_ETH_TEST_INTR] = 0; } -skip_ol_tests: - netif_info(pf, drv, netdev, "testing finished\n"); + return; + +skip_ol_tests: + data[I40E_ETH_TEST_REG] = 1; + data[I40E_ETH_TEST_EEPROM] = 1; + data[I40E_ETH_TEST_INTR] = 1; + data[I40E_ETH_TEST_LINK] = 1; + eth_test->flags |= ETH_TEST_FL_FAILED; + clear_bit(__I40E_TESTING, pf->state); + netif_info(pf, drv, netdev, "testing failed\n"); } static void i40e_get_wol(struct net_device *netdev,