diff options
author | Thomas Falcon <tlfalcon@linux.vnet.ibm.com> | 2017-06-15 00:50:09 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-06-15 14:29:00 -0400 |
commit | 21ecba6c48f903781d844b62854bedd8137df470 (patch) | |
tree | fb0e1abc90a1e1bd09cab91a0781e4c60e4e1232 /drivers/net/ethernet/ibm/ibmvnic.c | |
parent | 1cf9cc72bd7024af69419b5adee42c39ad4caf6f (diff) |
ibmvnic: Exit polling routine correctly during adapter reset
This patch fixes a bug where, in the case of a device reset,
the polling routine will never complete, causing napi_disable
to sleep indefinitely when attempting to close the device.
Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ibm/ibmvnic.c')
-rw-r--r-- | drivers/net/ethernet/ibm/ibmvnic.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index ebe443fe51db..9923b9fa0c74 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c | |||
@@ -1505,9 +1505,6 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget) | |||
1505 | int scrq_num = (int)(napi - adapter->napi); | 1505 | int scrq_num = (int)(napi - adapter->napi); |
1506 | int frames_processed = 0; | 1506 | int frames_processed = 0; |
1507 | 1507 | ||
1508 | if (adapter->resetting) | ||
1509 | return 0; | ||
1510 | |||
1511 | restart_poll: | 1508 | restart_poll: |
1512 | while (frames_processed < budget) { | 1509 | while (frames_processed < budget) { |
1513 | struct sk_buff *skb; | 1510 | struct sk_buff *skb; |
@@ -1517,6 +1514,12 @@ restart_poll: | |||
1517 | u16 offset; | 1514 | u16 offset; |
1518 | u8 flags = 0; | 1515 | u8 flags = 0; |
1519 | 1516 | ||
1517 | if (unlikely(adapter->resetting)) { | ||
1518 | enable_scrq_irq(adapter, adapter->rx_scrq[scrq_num]); | ||
1519 | napi_complete_done(napi, frames_processed); | ||
1520 | return frames_processed; | ||
1521 | } | ||
1522 | |||
1520 | if (!pending_scrq(adapter, adapter->rx_scrq[scrq_num])) | 1523 | if (!pending_scrq(adapter, adapter->rx_scrq[scrq_num])) |
1521 | break; | 1524 | break; |
1522 | next = ibmvnic_next_scrq(adapter, adapter->rx_scrq[scrq_num]); | 1525 | next = ibmvnic_next_scrq(adapter, adapter->rx_scrq[scrq_num]); |