mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 06:33:34 +00:00
scsi: ufs: wb: Add explicit flush_threshold sysfs attribute
There are three flags that control Write Booster Feature: 1. WB ON/OFF 2. WB Hibern Flush ON/OFF (implicitly) 3. WB Flush ON/OFF (explicit) In the case of "Hibern Flush", one of the conditions for flush WB buffer is that avail_wb_buff < wb_flush_threshold. As we know, different users have different requirements for power consumption and performance. Therefore, we need the ability to manually set wb_flush_threshold, so that users can easily and flexibly adjust the wb_flush_threshold value, thereby achieving a balance between power consumption and performance. So the sysfs attribute that controls this is necessary. wb_flush_threshold represents the threshold for flushing WB buffer, whose value expressed in unit of 10% granularity, such as '1' representing 10%, '2' representing 20%, and so on. Signed-off-by: Lu Hongfei <luhongfei@vivo.com> Link: https://lore.kernel.org/r/20230613022240.16595-1-luhongfei@vivo.com Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
56541c7c44
commit
e3d55626cf
@ -1426,6 +1426,17 @@ Description: This entry shows the status of WriteBooster buffer flushing
|
||||
If flushing is enabled, the device executes the flush
|
||||
operation when the command queue is empty.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/wb_flush_threshold
|
||||
What: /sys/bus/platform/devices/*.ufs/wb_flush_threshold
|
||||
Date: June 2023
|
||||
Contact: Lu Hongfei <luhongfei@vivo.com>
|
||||
Description:
|
||||
wb_flush_threshold represents the threshold for flushing WriteBooster buffer,
|
||||
whose value expressed in unit of 10% granularity, such as '1' representing 10%,
|
||||
'2' representing 20%, and so on.
|
||||
If avail_wb_buff < wb_flush_threshold, it indicates that WriteBooster buffer needs to
|
||||
be flushed, otherwise it is not necessary.
|
||||
|
||||
What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/hpb_version
|
||||
What: /sys/bus/platform/devices/*.ufs/device_descriptor/hpb_version
|
||||
Date: June 2021
|
||||
|
@ -298,6 +298,37 @@ static ssize_t enable_wb_buf_flush_store(struct device *dev,
|
||||
return res < 0 ? res : count;
|
||||
}
|
||||
|
||||
static ssize_t wb_flush_threshold_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct ufs_hba *hba = dev_get_drvdata(dev);
|
||||
|
||||
return sysfs_emit(buf, "%u\n", hba->vps->wb_flush_threshold);
|
||||
}
|
||||
|
||||
static ssize_t wb_flush_threshold_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct ufs_hba *hba = dev_get_drvdata(dev);
|
||||
unsigned int wb_flush_threshold;
|
||||
|
||||
if (kstrtouint(buf, 0, &wb_flush_threshold))
|
||||
return -EINVAL;
|
||||
|
||||
/* The range of values for wb_flush_threshold is (0,10] */
|
||||
if (wb_flush_threshold > UFS_WB_BUF_REMAIN_PERCENT(100) ||
|
||||
wb_flush_threshold == 0) {
|
||||
dev_err(dev, "The value of wb_flush_threshold is invalid!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hba->vps->wb_flush_threshold = wb_flush_threshold;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RW(rpm_lvl);
|
||||
static DEVICE_ATTR_RO(rpm_target_dev_state);
|
||||
static DEVICE_ATTR_RO(rpm_target_link_state);
|
||||
@ -307,6 +338,7 @@ static DEVICE_ATTR_RO(spm_target_link_state);
|
||||
static DEVICE_ATTR_RW(auto_hibern8);
|
||||
static DEVICE_ATTR_RW(wb_on);
|
||||
static DEVICE_ATTR_RW(enable_wb_buf_flush);
|
||||
static DEVICE_ATTR_RW(wb_flush_threshold);
|
||||
|
||||
static struct attribute *ufs_sysfs_ufshcd_attrs[] = {
|
||||
&dev_attr_rpm_lvl.attr,
|
||||
@ -318,6 +350,7 @@ static struct attribute *ufs_sysfs_ufshcd_attrs[] = {
|
||||
&dev_attr_auto_hibern8.attr,
|
||||
&dev_attr_wb_on.attr,
|
||||
&dev_attr_enable_wb_buf_flush.attr,
|
||||
&dev_attr_wb_flush_threshold.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user