On 2020/9/15 13:09, Saeed Mahameed wrote: > On Mon, 2020-09-14 at 20:06 +0800, Huazhong Tan wrote: >> From: Yunsheng Lin <linyunsh...@huawei.com> >> >> Use napi_consume_skb() to batch consuming skb when cleaning >> tx desc in NAPI polling. >> >> Signed-off-by: Yunsheng Lin <linyunsh...@huawei.com> >> Signed-off-by: Huazhong Tan <tanhuazh...@huawei.com> >> --- >> drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 27 +++++++++++- >> ---------- >> drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 2 +- >> drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 4 ++-- >> 3 files changed, 17 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c >> b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c >> index 4a49a76..feeaf75 100644 >> --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c >> +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c >> @@ -2333,10 +2333,10 @@ static int hns3_alloc_buffer(struct >> hns3_enet_ring *ring, >> } >> >> static void hns3_free_buffer(struct hns3_enet_ring *ring, >> - struct hns3_desc_cb *cb) >> + struct hns3_desc_cb *cb, int budget) >> { >> if (cb->type == DESC_TYPE_SKB) >> - dev_kfree_skb_any((struct sk_buff *)cb->priv); >> + napi_consume_skb(cb->priv, budget); > > This code can be reached from hns3_lb_clear_tx_ring() below which is > your loopback test and called with non-zero budget, I am not sure you > are allowed to call napi_consume_skb() with non-zero budget outside > napi context, perhaps the cb->type for loopback test is different in lb > test case ? Idk.. , please double check other code paths.
Yes, loopback test may call napi_consume_skb() with non-zero budget outside napi context. Thanks for pointing out this case. How about add the below WARN_ONCE() in napi_consume_skb() to catch this kind of error? WARN_ONCE(!in_serving_softirq(), "napi_consume_skb() is called with non-zero budget outside napi context"); > > [...] > >> static void hns3_lb_clear_tx_ring(struct hns3_nic_priv *priv, u32 >> start_ringid, >> - u32 end_ringid, u32 budget) >> + u32 end_ringid, int budget) >> { >> u32 i; >> >> for (i = start_ringid; i <= end_ringid; i++) { >> struct hns3_enet_ring *ring = &priv->ring[i]; >> >> - hns3_clean_tx_ring(ring); >> + hns3_clean_tx_ring(ring, budget); >> } >> } >>