net: hns3: add cond_resched() to hns3 ring buffer init process
authorJie Wang <wangjie125@huawei.com>
Wed, 5 Jun 2024 07:20:58 +0000 (15:20 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Jun 2024 11:20:28 +0000 (12:20 +0100)
Currently hns3 ring buffer init process would hold cpu too long with big
Tx/Rx ring depth. This could cause soft lockup.

So this patch adds cond_resched() to the process. Then cpu can break to
run other tasks instead of busy looping.

Fixes: a723fb8efe29 ("net: hns3: refine for set ring parameters")
Signed-off-by: Jie Wang <wangjie125@huawei.com>
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h

index ff71fb1..a5fc020 100644 (file)
@@ -3535,6 +3535,9 @@ static int hns3_alloc_ring_buffers(struct hns3_enet_ring *ring)
                ret = hns3_alloc_and_attach_buffer(ring, i);
                if (ret)
                        goto out_buffer_fail;
+
+               if (!(i % HNS3_RESCHED_BD_NUM))
+                       cond_resched();
        }
 
        return 0;
@@ -5107,6 +5110,7 @@ int hns3_init_all_ring(struct hns3_nic_priv *priv)
                }
 
                u64_stats_init(&priv->ring[i].syncp);
+               cond_resched();
        }
 
        return 0;
index acd756b..d36c4ed 100644 (file)
@@ -214,6 +214,8 @@ enum hns3_nic_state {
 #define HNS3_CQ_MODE_EQE                       1U
 #define HNS3_CQ_MODE_CQE                       0U
 
+#define HNS3_RESCHED_BD_NUM                    1024
+
 enum hns3_pkt_l2t_type {
        HNS3_L2_TYPE_UNICAST,
        HNS3_L2_TYPE_MULTICAST,