| From foo@baz Tue 21 Jan 2020 04:28:01 PM CET |
| From: Yonglong Liu <liuyonglong@huawei.com> |
| Date: Thu, 16 Jan 2020 15:41:17 +0800 |
| Subject: net: hns: fix soft lockup when there is not enough memory |
| |
| From: Yonglong Liu <liuyonglong@huawei.com> |
| |
| [ Upstream commit 49edd6a2c456150870ddcef5b7ed11b21d849e13 ] |
| |
| When there is not enough memory and napi_alloc_skb() return NULL, |
| the HNS driver will print error message, and than try again, if |
| the memory is not enough for a while, huge error message and the |
| retry operation will cause soft lockup. |
| |
| When napi_alloc_skb() return NULL because of no memory, we can |
| get a warn_alloc() call trace, so this patch deletes the error |
| message. We already use polling mode to handle irq, but the |
| retry operation will render the polling weight inactive, this |
| patch just return budget when the rx is not completed to avoid |
| dead loop. |
| |
| Fixes: 36eedfde1a36 ("net: hns: Optimize hns_nic_common_poll for better performance") |
| Fixes: b5996f11ea54 ("net: add Hisilicon Network Subsystem basic ethernet support") |
| Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/hisilicon/hns/hns_enet.c | 4 +--- |
| 1 file changed, 1 insertion(+), 3 deletions(-) |
| |
| --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
| +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
| @@ -569,7 +569,6 @@ static int hns_nic_poll_rx_skb(struct hn |
| skb = *out_skb = napi_alloc_skb(&ring_data->napi, |
| HNS_RX_HEAD_SIZE); |
| if (unlikely(!skb)) { |
| - netdev_err(ndev, "alloc rx skb fail\n"); |
| ring->stats.sw_err_cnt++; |
| return -ENOMEM; |
| } |
| @@ -1060,7 +1059,6 @@ static int hns_nic_common_poll(struct na |
| container_of(napi, struct hns_nic_ring_data, napi); |
| struct hnae_ring *ring = ring_data->ring; |
| |
| -try_again: |
| clean_complete += ring_data->poll_one( |
| ring_data, budget - clean_complete, |
| ring_data->ex_process); |
| @@ -1070,7 +1068,7 @@ try_again: |
| napi_complete(napi); |
| ring->q->handle->dev->ops->toggle_ring_irq(ring, 0); |
| } else { |
| - goto try_again; |
| + return budget; |
| } |
| } |
| |