| From aead170e18f1a3cf686d9fd6482d287ed9869187 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 25 Jul 2021 13:29:03 +0530 |
| Subject: octeontx2-pf: Fix interface down flag on error |
| |
| From: Geetha sowjanya <gakula@marvell.com> |
| |
| [ Upstream commit 69f0aeb13bb548e2d5710a350116e03f0273302e ] |
| |
| In the existing code while changing the number of TX/RX |
| queues using ethtool the PF/VF interface resources are |
| freed and reallocated (otx2_stop and otx2_open is called) |
| if the device is in running state. If any resource allocation |
| fails in otx2_open, driver free already allocated resources |
| and return. But again, when the number of queues changes |
| as the device state still running oxt2_stop is called. |
| In which we try to free already freed resources leading |
| to driver crash. |
| This patch fixes the issue by setting the INTF_DOWN flag on |
| error and free the resources in otx2_stop only if the flag is |
| not set. |
| |
| Fixes: 50fe6c02e5ad ("octeontx2-pf: Register and handle link notifications") |
| Signed-off-by: Geetha sowjanya <gakula@marvell.com> |
| Signed-off-by: Sunil Kovvuri Goutham <Sunil.Goutham@cavium.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 7 +++---- |
| drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 5 +++++ |
| 2 files changed, 8 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c |
| index 662fb80dbb9d..c6d408de0605 100644 |
| --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c |
| +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c |
| @@ -230,15 +230,14 @@ static int otx2_set_channels(struct net_device *dev, |
| err = otx2_set_real_num_queues(dev, channel->tx_count, |
| channel->rx_count); |
| if (err) |
| - goto fail; |
| + return err; |
| |
| pfvf->hw.rx_queues = channel->rx_count; |
| pfvf->hw.tx_queues = channel->tx_count; |
| pfvf->qset.cq_cnt = pfvf->hw.tx_queues + pfvf->hw.rx_queues; |
| |
| -fail: |
| if (if_up) |
| - dev->netdev_ops->ndo_open(dev); |
| + err = dev->netdev_ops->ndo_open(dev); |
| |
| netdev_info(dev, "Setting num Tx rings to %d, Rx rings to %d success\n", |
| pfvf->hw.tx_queues, pfvf->hw.rx_queues); |
| @@ -342,7 +341,7 @@ static int otx2_set_ringparam(struct net_device *netdev, |
| qs->rqe_cnt = rx_count; |
| |
| if (if_up) |
| - netdev->netdev_ops->ndo_open(netdev); |
| + return netdev->netdev_ops->ndo_open(netdev); |
| |
| return 0; |
| } |
| diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c |
| index 9fef9be015e5..044a5b1196ac 100644 |
| --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c |
| +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c |
| @@ -1592,6 +1592,7 @@ int otx2_open(struct net_device *netdev) |
| err_tx_stop_queues: |
| netif_tx_stop_all_queues(netdev); |
| netif_carrier_off(netdev); |
| + pf->flags |= OTX2_FLAG_INTF_DOWN; |
| err_free_cints: |
| otx2_free_cints(pf, qidx); |
| vec = pci_irq_vector(pf->pdev, |
| @@ -1619,6 +1620,10 @@ int otx2_stop(struct net_device *netdev) |
| struct otx2_rss_info *rss; |
| int qidx, vec, wrk; |
| |
| + /* If the DOWN flag is set resources are already freed */ |
| + if (pf->flags & OTX2_FLAG_INTF_DOWN) |
| + return 0; |
| + |
| netif_carrier_off(netdev); |
| netif_tx_stop_all_queues(netdev); |
| |
| -- |
| 2.30.2 |
| |