| From 0775ebc4cf8554bdcd2c212669a0868ab68df5c0 Mon Sep 17 00:00:00 2001 |
| From: Lijun Pan <lijunp213@gmail.com> |
| Date: Wed, 14 Apr 2021 02:46:14 -0500 |
| Subject: ibmvnic: avoid calling napi_disable() twice |
| |
| From: Lijun Pan <lijunp213@gmail.com> |
| |
| commit 0775ebc4cf8554bdcd2c212669a0868ab68df5c0 upstream. |
| |
| __ibmvnic_open calls napi_disable without checking whether NAPI polling |
| has already been disabled or not. This could cause napi_disable |
| being called twice, which could generate deadlock. For example, |
| the first napi_disable will spin until NAPI_STATE_SCHED is cleared |
| by napi_complete_done, then set it again. |
| When napi_disable is called the second time, it will loop infinitely |
| because no dev->poll will be running to clear NAPI_STATE_SCHED. |
| |
| To prevent above scenario from happening, call ibmvnic_napi_disable() |
| which checks if napi is disabled or not before calling napi_disable. |
| |
| Fixes: bfc32f297337 ("ibmvnic: Move resource initialization to its own routine") |
| Suggested-by: Thomas Falcon <tlfalcon@linux.ibm.com> |
| Signed-off-by: Lijun Pan <lijunp213@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/ibm/ibmvnic.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/ibm/ibmvnic.c |
| +++ b/drivers/net/ethernet/ibm/ibmvnic.c |
| @@ -1159,8 +1159,7 @@ static int __ibmvnic_open(struct net_dev |
| |
| rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_UP); |
| if (rc) { |
| - for (i = 0; i < adapter->req_rx_queues; i++) |
| - napi_disable(&adapter->napi[i]); |
| + ibmvnic_napi_disable(adapter); |
| release_resources(adapter); |
| return rc; |
| } |