[PATCH V2 net 2/3] net: hibmcge: fix the division by zero issue

Jijie Shao posted 3 patches 2 months ago
There is a newer version of this series
[PATCH V2 net 2/3] net: hibmcge: fix the division by zero issue
Posted by Jijie Shao 2 months ago
When the network port is down, the queue is released, and ring->len is 0.
In debugfs, hbg_get_queue_used_num() will be called,
which may lead to a division by zero issue.

This patch adds a check, if ring->len is 0,
hbg_get_queue_used_num() directly returns 0.

Fixes: 40735e7543f9 ("net: hibmcge: Implement .ndo_start_xmit function")
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
---
 drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.h b/drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.h
index 2883a5899ae2..2aecc73f3d49 100644
--- a/drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.h
+++ b/drivers/net/ethernet/hisilicon/hibmcge/hbg_txrx.h
@@ -29,6 +29,9 @@ static inline bool hbg_fifo_is_full(struct hbg_priv *priv, enum hbg_dir dir)
 
 static inline u32 hbg_get_queue_used_num(struct hbg_ring *ring)
 {
+	if (!ring->len)
+		return 0;
+
 	return (ring->ntu + ring->len - ring->ntc) % ring->len;
 }
 
-- 
2.33.0
Re: [PATCH V2 net 2/3] net: hibmcge: fix the division by zero issue
Posted by Jakub Kicinski 2 months ago
On Sat, 2 Aug 2025 20:32:25 +0800 Jijie Shao wrote:
>  static inline u32 hbg_get_queue_used_num(struct hbg_ring *ring)
>  {
> +	if (!ring->len)
> +		return 0;
> +
>  	return (ring->ntu + ring->len - ring->ntc) % ring->len;

This should probably be a READ_ONCE() to a temporary variable.
There is no locking in debugfs, AFAICT, the value may change
between the test and the division / modulo.
-- 
pw-bot: cr
Re: [PATCH V2 net 2/3] net: hibmcge: fix the division by zero issue
Posted by Jijie Shao 2 months ago
on 2025/8/6 9:14, Jakub Kicinski wrote:
> On Sat, 2 Aug 2025 20:32:25 +0800 Jijie Shao wrote:
>>   static inline u32 hbg_get_queue_used_num(struct hbg_ring *ring)
>>   {
>> +	if (!ring->len)
>> +		return 0;
>> +
>>   	return (ring->ntu + ring->len - ring->ntc) % ring->len;
> This should probably be a READ_ONCE() to a temporary variable.
> There is no locking in debugfs, AFAICT, the value may change
> between the test and the division / modulo.

Yes, there is indeed a very short time window.
I will add READ_ONCE() to ring->len and read it only once.

Thanks
Jijie Shao