aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGavin Shan <shangw@linux.vnet.ibm.com>2014-01-22 23:27:35 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-23 16:21:03 -0500
commit9fe6cb58378c3b8535e00dab7195b5d35defa17a (patch)
treeca9209b3c6b40ce99d095ff0782afe382afd21bc
parent144be3d9f72fca538871b69b1f4c4af6f39d562a (diff)
net/cxgb4: Don't retrieve stats during recovery
We possibly retrieve the adapter's statistics during EEH recovery and that should be disallowed. Otherwise, it would possibly incur replicate EEH error and EEH recovery is going to fail eventually. The patch reuses statistics lock and checks net_device is attached before going to retrieve statistics, so that the problem can be avoided. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index c8eafbf1f51d..139a70405582 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -4288,7 +4288,15 @@ static struct rtnl_link_stats64 *cxgb_get_stats(struct net_device *dev,
4288 struct port_info *p = netdev_priv(dev); 4288 struct port_info *p = netdev_priv(dev);
4289 struct adapter *adapter = p->adapter; 4289 struct adapter *adapter = p->adapter;
4290 4290
4291 /* Block retrieving statistics during EEH error
4292 * recovery. Otherwise, the recovery might fail
4293 * and the PCI device will be removed permanently
4294 */
4291 spin_lock(&adapter->stats_lock); 4295 spin_lock(&adapter->stats_lock);
4296 if (!netif_device_present(dev)) {
4297 spin_unlock(&adapter->stats_lock);
4298 return ns;
4299 }
4292 t4_get_port_stats(adapter, p->tx_chan, &stats); 4300 t4_get_port_stats(adapter, p->tx_chan, &stats);
4293 spin_unlock(&adapter->stats_lock); 4301 spin_unlock(&adapter->stats_lock);
4294 4302
@@ -5496,12 +5504,14 @@ static pci_ers_result_t eeh_err_detected(struct pci_dev *pdev,
5496 rtnl_lock(); 5504 rtnl_lock();
5497 adap->flags &= ~FW_OK; 5505 adap->flags &= ~FW_OK;
5498 notify_ulds(adap, CXGB4_STATE_START_RECOVERY); 5506 notify_ulds(adap, CXGB4_STATE_START_RECOVERY);
5507 spin_lock(&adap->stats_lock);
5499 for_each_port(adap, i) { 5508 for_each_port(adap, i) {
5500 struct net_device *dev = adap->port[i]; 5509 struct net_device *dev = adap->port[i];
5501 5510
5502 netif_device_detach(dev); 5511 netif_device_detach(dev);
5503 netif_carrier_off(dev); 5512 netif_carrier_off(dev);
5504 } 5513 }
5514 spin_unlock(&adap->stats_lock);
5505 if (adap->flags & FULL_INIT_DONE) 5515 if (adap->flags & FULL_INIT_DONE)
5506 cxgb_down(adap); 5516 cxgb_down(adap);
5507 rtnl_unlock(); 5517 rtnl_unlock();