diff options
Diffstat (limited to 'mm/backing-dev.c')
| -rw-r--r-- | mm/backing-dev.c | 133 | 
1 files changed, 130 insertions, 3 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index c30419a5e119..a53b9360b72e 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -178,7 +178,26 @@ static ssize_t min_ratio_store(struct device *dev,  	return ret;  } -BDI_SHOW(min_ratio, bdi->min_ratio) +BDI_SHOW(min_ratio, bdi->min_ratio / BDI_RATIO_SCALE) + +static ssize_t min_ratio_fine_store(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); +	unsigned int ratio; +	ssize_t ret; + +	ret = kstrtouint(buf, 10, &ratio); +	if (ret < 0) +		return ret; + +	ret = bdi_set_min_ratio_no_scale(bdi, ratio); +	if (!ret) +		ret = count; + +	return ret; +} +BDI_SHOW(min_ratio_fine, bdi->min_ratio)  static ssize_t max_ratio_store(struct device *dev,  		struct device_attribute *attr, const char *buf, size_t count) @@ -197,7 +216,82 @@ static ssize_t max_ratio_store(struct device *dev,  	return ret;  } -BDI_SHOW(max_ratio, bdi->max_ratio) +BDI_SHOW(max_ratio, bdi->max_ratio / BDI_RATIO_SCALE) + +static ssize_t max_ratio_fine_store(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); +	unsigned int ratio; +	ssize_t ret; + +	ret = kstrtouint(buf, 10, &ratio); +	if (ret < 0) +		return ret; + +	ret = bdi_set_max_ratio_no_scale(bdi, ratio); +	if (!ret) +		ret = count; + +	return ret; +} +BDI_SHOW(max_ratio_fine, bdi->max_ratio) + +static ssize_t min_bytes_show(struct device *dev, +			      struct device_attribute *attr, +			      char *buf) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); + +	return sysfs_emit(buf, "%llu\n", bdi_get_min_bytes(bdi)); +} + +static ssize_t min_bytes_store(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); +	u64 bytes; +	ssize_t ret; + +	ret = kstrtoull(buf, 10, &bytes); +	if (ret < 0) +		return ret; + +	ret = bdi_set_min_bytes(bdi, bytes); +	if (!ret) +		ret = count; + +	return ret; +} +DEVICE_ATTR_RW(min_bytes); + +static ssize_t max_bytes_show(struct device *dev, +			      struct device_attribute *attr, +			      char *buf) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); + +	return sysfs_emit(buf, "%llu\n", bdi_get_max_bytes(bdi)); +} + +static ssize_t max_bytes_store(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); +	u64 bytes; +	ssize_t ret; + +	ret = kstrtoull(buf, 10, &bytes); +	if (ret < 0) +		return ret; + +	ret = bdi_set_max_bytes(bdi, bytes); +	if (!ret) +		ret = count; + +	return ret; +} +DEVICE_ATTR_RW(max_bytes);  static ssize_t stable_pages_required_show(struct device *dev,  					  struct device_attribute *attr, @@ -209,11 +303,44 @@ static ssize_t stable_pages_required_show(struct device *dev,  }  static DEVICE_ATTR_RO(stable_pages_required); +static ssize_t strict_limit_store(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); +	unsigned int strict_limit; +	ssize_t ret; + +	ret = kstrtouint(buf, 10, &strict_limit); +	if (ret < 0) +		return ret; + +	ret = bdi_set_strict_limit(bdi, strict_limit); +	if (!ret) +		ret = count; + +	return ret; +} + +static ssize_t strict_limit_show(struct device *dev, +		struct device_attribute *attr, char *buf) +{ +	struct backing_dev_info *bdi = dev_get_drvdata(dev); + +	return sysfs_emit(buf, "%d\n", +			!!(bdi->capabilities & BDI_CAP_STRICTLIMIT)); +} +static DEVICE_ATTR_RW(strict_limit); +  static struct attribute *bdi_dev_attrs[] = {  	&dev_attr_read_ahead_kb.attr,  	&dev_attr_min_ratio.attr, +	&dev_attr_min_ratio_fine.attr,  	&dev_attr_max_ratio.attr, +	&dev_attr_max_ratio_fine.attr, +	&dev_attr_min_bytes.attr, +	&dev_attr_max_bytes.attr,  	&dev_attr_stable_pages_required.attr, +	&dev_attr_strict_limit.attr,  	NULL,  };  ATTRIBUTE_GROUPS(bdi_dev); @@ -780,7 +907,7 @@ int bdi_init(struct backing_dev_info *bdi)  	kref_init(&bdi->refcnt);  	bdi->min_ratio = 0; -	bdi->max_ratio = 100; +	bdi->max_ratio = 100 * BDI_RATIO_SCALE;  	bdi->max_prop_frac = FPROP_FRAC_BASE;  	INIT_LIST_HEAD(&bdi->bdi_list);  	INIT_LIST_HEAD(&bdi->wb_list);  |