| From bef3a388809a2ad10edf95a8a39985a0452e21fa Mon Sep 17 00:00:00 2001 |
| From: Yonglong Liu <liuyonglong@huawei.com> |
| Date: Thu, 16 Jan 2020 15:41:17 +0800 |
| Subject: [PATCH] net: hns: fix soft lockup when there is not enough memory |
| |
| commit 49edd6a2c456150870ddcef5b7ed11b21d849e13 upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
| index dd0969a6cb20..7699fecc9de4 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
| +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c |
| @@ -565,7 +565,6 @@ static int hns_nic_poll_rx_skb(struct hns_nic_ring_data *ring_data, |
| 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; |
| } |
| @@ -1056,7 +1055,6 @@ static int hns_nic_common_poll(struct napi_struct *napi, int budget) |
| 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); |
| @@ -1066,7 +1064,7 @@ static int hns_nic_common_poll(struct napi_struct *napi, int budget) |
| napi_complete(napi); |
| ring->q->handle->dev->ops->toggle_ring_irq(ring, 0); |
| } else { |
| - goto try_again; |
| + return budget; |
| } |
| } |
| |
| -- |
| 2.7.4 |
| |