diff mbox series

scsi: ufs: core: sysfs: Prevent div by zero

Message ID 20241120062522.917157-1-gwendal@chromium.org
State New
Headers show
Series scsi: ufs: core: sysfs: Prevent div by zero | expand

Commit Message

Gwendal Grignou Nov. 20, 2024, 6:25 a.m. UTC
Prevent a division by 0 when monitoring is not enabled.

Fixes: 1d8613a23f3c ("scsi: ufs: core: Introduce HBA performance monitor sysfs nodes")

Cc: stable@vger.kernel.org
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
---
 drivers/ufs/core/ufs-sysfs.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Bart Van Assche Nov. 21, 2024, 8:24 p.m. UTC | #1
On 11/19/24 10:25 PM, Gwendal Grignou wrote:
> Prevent a division by 0 when monitoring is not enabled.
> 
> Fixes: 1d8613a23f3c ("scsi: ufs: core: Introduce HBA performance monitor sysfs nodes")
> 
> Cc: stable@vger.kernel.org
> Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
> ---
>   drivers/ufs/core/ufs-sysfs.c | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c
> index c95906443d5f9..3692b39b35e78 100644
> --- a/drivers/ufs/core/ufs-sysfs.c
> +++ b/drivers/ufs/core/ufs-sysfs.c
> @@ -485,6 +485,9 @@ static ssize_t read_req_latency_avg_show(struct device *dev,
>   	struct ufs_hba *hba = dev_get_drvdata(dev);
>   	struct ufs_hba_monitor *m = &hba->monitor;
>   
> +	if (!m->nr_req[READ])
> +		return sysfs_emit(buf, "0\n");
> +
>   	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[READ]),
>   						 m->nr_req[READ]));
>   }
> @@ -552,6 +555,9 @@ static ssize_t write_req_latency_avg_show(struct device *dev,
>   	struct ufs_hba *hba = dev_get_drvdata(dev);
>   	struct ufs_hba_monitor *m = &hba->monitor;
>   
> +	if (!m->nr_req[WRITE])
> +		return sysfs_emit(buf, "0\n");
> +
>   	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[WRITE]),
>   						 m->nr_req[WRITE]));
>   }

Is anyone using the UFS monitor infrastructure or can it perhaps be
removed?

Thanks,

Bart.
Can Guo Nov. 22, 2024, 2:09 a.m. UTC | #2
On 11/20/2024 2:25 PM, Gwendal Grignou wrote:
> Prevent a division by 0 when monitoring is not enabled.
>
> Fixes: 1d8613a23f3c ("scsi: ufs: core: Introduce HBA performance monitor sysfs nodes")
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
> ---
>   drivers/ufs/core/ufs-sysfs.c | 6 ++++++
>   1 file changed, 6 insertions(+)
>
> diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c
> index c95906443d5f9..3692b39b35e78 100644
> --- a/drivers/ufs/core/ufs-sysfs.c
> +++ b/drivers/ufs/core/ufs-sysfs.c
> @@ -485,6 +485,9 @@ static ssize_t read_req_latency_avg_show(struct device *dev,
>   	struct ufs_hba *hba = dev_get_drvdata(dev);
>   	struct ufs_hba_monitor *m = &hba->monitor;
>   
> +	if (!m->nr_req[READ])
> +		return sysfs_emit(buf, "0\n");
> +
>   	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[READ]),
>   						 m->nr_req[READ]));
>   }
> @@ -552,6 +555,9 @@ static ssize_t write_req_latency_avg_show(struct device *dev,
>   	struct ufs_hba *hba = dev_get_drvdata(dev);
>   	struct ufs_hba_monitor *m = &hba->monitor;
>   
> +	if (!m->nr_req[WRITE])
> +		return sysfs_emit(buf, "0\n");
> +
>   	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[WRITE]),
>   						 m->nr_req[WRITE]));
>   }
Thanks for the fix!

Reviewed-by: Can Guo <quic_cang@quicinc.com>
Can Guo Nov. 22, 2024, 2:12 a.m. UTC | #3
Hi Bart,

On 11/22/2024 4:24 AM, Bart Van Assche wrote:
> On 11/19/24 10:25 PM, Gwendal Grignou wrote:
>> Prevent a division by 0 when monitoring is not enabled.
>>
>> Fixes: 1d8613a23f3c ("scsi: ufs: core: Introduce HBA performance 
>> monitor sysfs nodes")
>>
>> Cc: stable@vger.kernel.org
>> Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
>> ---
>>   drivers/ufs/core/ufs-sysfs.c | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c
>> index c95906443d5f9..3692b39b35e78 100644
>> --- a/drivers/ufs/core/ufs-sysfs.c
>> +++ b/drivers/ufs/core/ufs-sysfs.c
>> @@ -485,6 +485,9 @@ static ssize_t read_req_latency_avg_show(struct 
>> device *dev,
>>       struct ufs_hba *hba = dev_get_drvdata(dev);
>>       struct ufs_hba_monitor *m = &hba->monitor;
>>   +    if (!m->nr_req[READ])
>> +        return sysfs_emit(buf, "0\n");
>> +
>>       return sysfs_emit(buf, "%llu\n", 
>> div_u64(ktime_to_us(m->lat_sum[READ]),
>>                            m->nr_req[READ]));
>>   }
>> @@ -552,6 +555,9 @@ static ssize_t write_req_latency_avg_show(struct 
>> device *dev,
>>       struct ufs_hba *hba = dev_get_drvdata(dev);
>>       struct ufs_hba_monitor *m = &hba->monitor;
>>   +    if (!m->nr_req[WRITE])
>> +        return sysfs_emit(buf, "0\n");
>> +
>>       return sysfs_emit(buf, "%llu\n", 
>> div_u64(ktime_to_us(m->lat_sum[WRITE]),
>>                            m->nr_req[WRITE]));
>>   }
>
> Is anyone using the UFS monitor infrastructure or can it perhaps be
> removed?

We are the user of the UFS monitor. And we are about to integrate UFS 
queue depth monitoring in it.


Thanks,

Can Guo.

>
> Thanks,
>
> Bart.
Bart Van Assche Nov. 25, 2024, 11:08 p.m. UTC | #4
On 11/21/24 6:12 PM, Can Guo wrote:
> We are the user of the UFS monitor. And we are about to integrate UFS 
> queue depth monitoring in it.

Shouldn't such functionality be integrated in the block layer or SCSI 
core instead of in the UFS driver such that this functionality becomes
available to all block drivers?

Thanks,

Bart.
diff mbox series

Patch

diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c
index c95906443d5f9..3692b39b35e78 100644
--- a/drivers/ufs/core/ufs-sysfs.c
+++ b/drivers/ufs/core/ufs-sysfs.c
@@ -485,6 +485,9 @@  static ssize_t read_req_latency_avg_show(struct device *dev,
 	struct ufs_hba *hba = dev_get_drvdata(dev);
 	struct ufs_hba_monitor *m = &hba->monitor;
 
+	if (!m->nr_req[READ])
+		return sysfs_emit(buf, "0\n");
+
 	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[READ]),
 						 m->nr_req[READ]));
 }
@@ -552,6 +555,9 @@  static ssize_t write_req_latency_avg_show(struct device *dev,
 	struct ufs_hba *hba = dev_get_drvdata(dev);
 	struct ufs_hba_monitor *m = &hba->monitor;
 
+	if (!m->nr_req[WRITE])
+		return sysfs_emit(buf, "0\n");
+
 	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[WRITE]),
 						 m->nr_req[WRITE]));
 }