Re: [PATCH] mm: add strictlimit knob -v2
On Wed, 06 Nov 2013 19:05:57 +0400 Maxim Patlasov wrote: > "strictlimit" feature was introduced to enforce per-bdi dirty limits for > FUSE which sets bdi max_ratio to 1% by default: > > http://article.gmane.org/gmane.linux.kernel.mm/105809 > > However the feature can be useful for other relatively slow or untrusted > BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the > feature: > > echo 1 > /sys/class/bdi/X:Y/strictlimit > > Being enabled, the feature enforces bdi max_ratio limit even if global (10%) > dirty limit is not reached. Of course, the effect is not visible until > /sys/class/bdi/X:Y/max_ratio is decreased to some reasonable value. > > ... > > --- a/Documentation/ABI/testing/sysfs-class-bdi > +++ b/Documentation/ABI/testing/sysfs-class-bdi > @@ -53,3 +53,11 @@ stable_pages_required (read-only) > > If set, the backing device requires that all pages comprising a write > request must not be changed until writeout is complete. > + > +strictlimit (read-write) > + > + Forces per-BDI checks for the share of given device in the write-back > + cache even before the global background dirty limit is reached. This > + is useful in situations where the global limit is much higher than > + affordable for given relatively slow (or untrusted) device. Turning > + strictlimit on has no visible effect if max_ratio is equal to 100%. > diff --git a/mm/backing-dev.c b/mm/backing-dev.c > index ce682f7..4ee1d64 100644 > --- a/mm/backing-dev.c > +++ b/mm/backing-dev.c > @@ -234,11 +234,46 @@ static ssize_t stable_pages_required_show(struct device > *dev, > } > static DEVICE_ATTR_RO(stable_pages_required); > > +static ssize_t strictlimit_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 val; > + ssize_t ret; > + > + ret = kstrtouint(buf, 10, ); > + if (ret < 0) > + return ret; > + > + switch (val) { > + case 0: > + bdi->capabilities &= ~BDI_CAP_STRICTLIMIT; > + break; > + case 1: > + bdi->capabilities |= BDI_CAP_STRICTLIMIT; > + break; > + default: > + return -EINVAL; > + } > + > + return count; > +} > +static ssize_t strictlimit_show(struct device *dev, > + struct device_attribute *attr, char *page) > +{ > + struct backing_dev_info *bdi = dev_get_drvdata(dev); > + > + return snprintf(page, PAGE_SIZE-1, "%d\n", > + !!(bdi->capabilities & BDI_CAP_STRICTLIMIT)); > +} > +static DEVICE_ATTR_RW(strictlimit); > + > static struct attribute *bdi_dev_attrs[] = { > _attr_read_ahead_kb.attr, > _attr_min_ratio.attr, > _attr_max_ratio.attr, > _attr_stable_pages_required.attr, > + _attr_strictlimit.attr, > NULL, Well the patch is certainly simple and straightforward enough and *seems* like it will be useful. The main (and large!) downside is that it adds to the user interface so we'll have to maintain this feature and its functionality for ever. Given this, my concern is that while potentially useful, the feature might not be *sufficiently* useful to justify its inclusion. So we'll end up addressing these issues by other means, then we're left maintaining this obsolete legacy feature. So I'm thinking that unless someone can show that this is good and complete and sufficient for a "large enough" set of issues, I'll take a pass on the patch[1]. What do people think? [1] Actually, I'll stick it in -mm and maintain it, so next time someone reports an issue I can say "hey, try this". -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob -v2
On Wed, 06 Nov 2013 19:05:57 +0400 Maxim Patlasov mpatla...@parallels.com wrote: strictlimit feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until /sys/class/bdi/X:Y/max_ratio is decreased to some reasonable value. ... --- a/Documentation/ABI/testing/sysfs-class-bdi +++ b/Documentation/ABI/testing/sysfs-class-bdi @@ -53,3 +53,11 @@ stable_pages_required (read-only) If set, the backing device requires that all pages comprising a write request must not be changed until writeout is complete. + +strictlimit (read-write) + + Forces per-BDI checks for the share of given device in the write-back + cache even before the global background dirty limit is reached. This + is useful in situations where the global limit is much higher than + affordable for given relatively slow (or untrusted) device. Turning + strictlimit on has no visible effect if max_ratio is equal to 100%. diff --git a/mm/backing-dev.c b/mm/backing-dev.c index ce682f7..4ee1d64 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -234,11 +234,46 @@ static ssize_t stable_pages_required_show(struct device *dev, } static DEVICE_ATTR_RO(stable_pages_required); +static ssize_t strictlimit_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 val; + ssize_t ret; + + ret = kstrtouint(buf, 10, val); + if (ret 0) + return ret; + + switch (val) { + case 0: + bdi-capabilities = ~BDI_CAP_STRICTLIMIT; + break; + case 1: + bdi-capabilities |= BDI_CAP_STRICTLIMIT; + break; + default: + return -EINVAL; + } + + return count; +} +static ssize_t strictlimit_show(struct device *dev, + struct device_attribute *attr, char *page) +{ + struct backing_dev_info *bdi = dev_get_drvdata(dev); + + return snprintf(page, PAGE_SIZE-1, %d\n, + !!(bdi-capabilities BDI_CAP_STRICTLIMIT)); +} +static DEVICE_ATTR_RW(strictlimit); + static struct attribute *bdi_dev_attrs[] = { dev_attr_read_ahead_kb.attr, dev_attr_min_ratio.attr, dev_attr_max_ratio.attr, dev_attr_stable_pages_required.attr, + dev_attr_strictlimit.attr, NULL, Well the patch is certainly simple and straightforward enough and *seems* like it will be useful. The main (and large!) downside is that it adds to the user interface so we'll have to maintain this feature and its functionality for ever. Given this, my concern is that while potentially useful, the feature might not be *sufficiently* useful to justify its inclusion. So we'll end up addressing these issues by other means, then we're left maintaining this obsolete legacy feature. So I'm thinking that unless someone can show that this is good and complete and sufficient for a large enough set of issues, I'll take a pass on the patch[1]. What do people think? [1] Actually, I'll stick it in -mm and maintain it, so next time someone reports an issue I can say hey, try this. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob -v2
Is there a reason to not enforce strictlimit by default? -- "One disk to rule them all, One disk to find them. One disk to bring them all and in the darkness grind them. In the Land of Redmond where the shadows lie." -- The Silicon Valley Tarot Henrique Holschuh -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob -v2
Is there a reason to not enforce strictlimit by default? -- One disk to rule them all, One disk to find them. One disk to bring them all and in the darkness grind them. In the Land of Redmond where the shadows lie. -- The Silicon Valley Tarot Henrique Holschuh -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] mm: add strictlimit knob -v2
"strictlimit" feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 > /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until /sys/class/bdi/X:Y/max_ratio is decreased to some reasonable value. Changed in v2: - updated patch description and documentation Signed-off-by: Maxim Patlasov --- Documentation/ABI/testing/sysfs-class-bdi |8 +++ mm/backing-dev.c | 35 + 2 files changed, 43 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-class-bdi b/Documentation/ABI/testing/sysfs-class-bdi index d773d56..3187a18 100644 --- a/Documentation/ABI/testing/sysfs-class-bdi +++ b/Documentation/ABI/testing/sysfs-class-bdi @@ -53,3 +53,11 @@ stable_pages_required (read-only) If set, the backing device requires that all pages comprising a write request must not be changed until writeout is complete. + +strictlimit (read-write) + + Forces per-BDI checks for the share of given device in the write-back + cache even before the global background dirty limit is reached. This + is useful in situations where the global limit is much higher than + affordable for given relatively slow (or untrusted) device. Turning + strictlimit on has no visible effect if max_ratio is equal to 100%. diff --git a/mm/backing-dev.c b/mm/backing-dev.c index ce682f7..4ee1d64 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -234,11 +234,46 @@ static ssize_t stable_pages_required_show(struct device *dev, } static DEVICE_ATTR_RO(stable_pages_required); +static ssize_t strictlimit_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 val; + ssize_t ret; + + ret = kstrtouint(buf, 10, ); + if (ret < 0) + return ret; + + switch (val) { + case 0: + bdi->capabilities &= ~BDI_CAP_STRICTLIMIT; + break; + case 1: + bdi->capabilities |= BDI_CAP_STRICTLIMIT; + break; + default: + return -EINVAL; + } + + return count; +} +static ssize_t strictlimit_show(struct device *dev, + struct device_attribute *attr, char *page) +{ + struct backing_dev_info *bdi = dev_get_drvdata(dev); + + return snprintf(page, PAGE_SIZE-1, "%d\n", + !!(bdi->capabilities & BDI_CAP_STRICTLIMIT)); +} +static DEVICE_ATTR_RW(strictlimit); + static struct attribute *bdi_dev_attrs[] = { _attr_read_ahead_kb.attr, _attr_min_ratio.attr, _attr_max_ratio.attr, _attr_stable_pages_required.attr, + _attr_strictlimit.attr, NULL, }; ATTRIBUTE_GROUPS(bdi_dev); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob
Hi Andrew, On 11/05/2013 02:01 AM, Andrew Morton wrote: On Fri, 01 Nov 2013 18:31:40 +0400 Maxim Patlasov wrote: "strictlimit" feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://www.http.com//article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 > /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until max_ratio is decreased to some reasonable value. I suggest replacing "max_ratio" here with the much more informative "/sys/class/bdi/X:Y/max_ratio". Also, Documentation/ABI/testing/sysfs-class-bdi will need an update please. OK, I'll update it, fix patch description and re-send the patch. mm/backing-dev.c | 35 +++ 1 file changed, 35 insertions(+) I'm not really sure what to make of the patch. I assume you tested it and observed some effect. Could you please describe the test setup and the effects in some detail? I plugged 16GB USB-flash in a node with 8GB RAM running 3.12.0-rc7 and started writing a huge file by "dd" (from /dev/zero to USB-flash mount-point). While writing I was observing "Dirty" counter as reported by /proc/meminfo. As expected it stabilized on a level about 1.2GB (15% of total RAM). Immediately after dd completed, the "umount" command took about 5 minutes. This corresponded to 5MB write throughput of the flash drive. Then I repeated the experiment after setting tunables: echo 1 > /sys/class/bdi/8\:16/max_ratio echo 1 > /sys/class/bdi/8\:16/strictlimit This time, "Dirty" counter became 100 times lesser - about 12MB and "umount" took about a second. Thanks, Maxim -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob
Hi Andrew, On 11/05/2013 02:01 AM, Andrew Morton wrote: On Fri, 01 Nov 2013 18:31:40 +0400 Maxim Patlasov mpatla...@parallels.com wrote: strictlimit feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://www.http.com//article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until max_ratio is decreased to some reasonable value. I suggest replacing max_ratio here with the much more informative /sys/class/bdi/X:Y/max_ratio. Also, Documentation/ABI/testing/sysfs-class-bdi will need an update please. OK, I'll update it, fix patch description and re-send the patch. mm/backing-dev.c | 35 +++ 1 file changed, 35 insertions(+) I'm not really sure what to make of the patch. I assume you tested it and observed some effect. Could you please describe the test setup and the effects in some detail? I plugged 16GB USB-flash in a node with 8GB RAM running 3.12.0-rc7 and started writing a huge file by dd (from /dev/zero to USB-flash mount-point). While writing I was observing Dirty counter as reported by /proc/meminfo. As expected it stabilized on a level about 1.2GB (15% of total RAM). Immediately after dd completed, the umount command took about 5 minutes. This corresponded to 5MB write throughput of the flash drive. Then I repeated the experiment after setting tunables: echo 1 /sys/class/bdi/8\:16/max_ratio echo 1 /sys/class/bdi/8\:16/strictlimit This time, Dirty counter became 100 times lesser - about 12MB and umount took about a second. Thanks, Maxim -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] mm: add strictlimit knob -v2
strictlimit feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until /sys/class/bdi/X:Y/max_ratio is decreased to some reasonable value. Changed in v2: - updated patch description and documentation Signed-off-by: Maxim Patlasov mpatla...@parallels.com --- Documentation/ABI/testing/sysfs-class-bdi |8 +++ mm/backing-dev.c | 35 + 2 files changed, 43 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-class-bdi b/Documentation/ABI/testing/sysfs-class-bdi index d773d56..3187a18 100644 --- a/Documentation/ABI/testing/sysfs-class-bdi +++ b/Documentation/ABI/testing/sysfs-class-bdi @@ -53,3 +53,11 @@ stable_pages_required (read-only) If set, the backing device requires that all pages comprising a write request must not be changed until writeout is complete. + +strictlimit (read-write) + + Forces per-BDI checks for the share of given device in the write-back + cache even before the global background dirty limit is reached. This + is useful in situations where the global limit is much higher than + affordable for given relatively slow (or untrusted) device. Turning + strictlimit on has no visible effect if max_ratio is equal to 100%. diff --git a/mm/backing-dev.c b/mm/backing-dev.c index ce682f7..4ee1d64 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -234,11 +234,46 @@ static ssize_t stable_pages_required_show(struct device *dev, } static DEVICE_ATTR_RO(stable_pages_required); +static ssize_t strictlimit_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 val; + ssize_t ret; + + ret = kstrtouint(buf, 10, val); + if (ret 0) + return ret; + + switch (val) { + case 0: + bdi-capabilities = ~BDI_CAP_STRICTLIMIT; + break; + case 1: + bdi-capabilities |= BDI_CAP_STRICTLIMIT; + break; + default: + return -EINVAL; + } + + return count; +} +static ssize_t strictlimit_show(struct device *dev, + struct device_attribute *attr, char *page) +{ + struct backing_dev_info *bdi = dev_get_drvdata(dev); + + return snprintf(page, PAGE_SIZE-1, %d\n, + !!(bdi-capabilities BDI_CAP_STRICTLIMIT)); +} +static DEVICE_ATTR_RW(strictlimit); + static struct attribute *bdi_dev_attrs[] = { dev_attr_read_ahead_kb.attr, dev_attr_min_ratio.attr, dev_attr_max_ratio.attr, dev_attr_stable_pages_required.attr, + dev_attr_strictlimit.attr, NULL, }; ATTRIBUTE_GROUPS(bdi_dev); -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob
On Fri, 01 Nov 2013 18:31:40 +0400 Maxim Patlasov wrote: > "strictlimit" feature was introduced to enforce per-bdi dirty limits for > FUSE which sets bdi max_ratio to 1% by default: > > http://www.http.com//article.gmane.org/gmane.linux.kernel.mm/105809 > > However the feature can be useful for other relatively slow or untrusted > BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the > feature: > > echo 1 > /sys/class/bdi/X:Y/strictlimit > > Being enabled, the feature enforces bdi max_ratio limit even if global (10%) > dirty limit is not reached. Of course, the effect is not visible until > max_ratio is decreased to some reasonable value. I suggest replacing "max_ratio" here with the much more informative "/sys/class/bdi/X:Y/max_ratio". Also, Documentation/ABI/testing/sysfs-class-bdi will need an update please. > mm/backing-dev.c | 35 +++ > 1 file changed, 35 insertions(+) > I'm not really sure what to make of the patch. I assume you tested it and observed some effect. Could you please describe the test setup and the effects in some detail? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] mm: add strictlimit knob
On Fri, 01 Nov 2013 18:31:40 +0400 Maxim Patlasov mpatla...@parallels.com wrote: strictlimit feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://www.http.com//article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until max_ratio is decreased to some reasonable value. I suggest replacing max_ratio here with the much more informative /sys/class/bdi/X:Y/max_ratio. Also, Documentation/ABI/testing/sysfs-class-bdi will need an update please. mm/backing-dev.c | 35 +++ 1 file changed, 35 insertions(+) I'm not really sure what to make of the patch. I assume you tested it and observed some effect. Could you please describe the test setup and the effects in some detail? -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] mm: add strictlimit knob
"strictlimit" feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://www.http.com//article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 > /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until max_ratio is decreased to some reasonable value. Signed-off-by: Maxim Patlasov --- mm/backing-dev.c | 35 +++ 1 file changed, 35 insertions(+) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index ce682f7..4ee1d64 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -234,11 +234,46 @@ static ssize_t stable_pages_required_show(struct device *dev, } static DEVICE_ATTR_RO(stable_pages_required); +static ssize_t strictlimit_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 val; + ssize_t ret; + + ret = kstrtouint(buf, 10, ); + if (ret < 0) + return ret; + + switch (val) { + case 0: + bdi->capabilities &= ~BDI_CAP_STRICTLIMIT; + break; + case 1: + bdi->capabilities |= BDI_CAP_STRICTLIMIT; + break; + default: + return -EINVAL; + } + + return count; +} +static ssize_t strictlimit_show(struct device *dev, + struct device_attribute *attr, char *page) +{ + struct backing_dev_info *bdi = dev_get_drvdata(dev); + + return snprintf(page, PAGE_SIZE-1, "%d\n", + !!(bdi->capabilities & BDI_CAP_STRICTLIMIT)); +} +static DEVICE_ATTR_RW(strictlimit); + static struct attribute *bdi_dev_attrs[] = { _attr_read_ahead_kb.attr, _attr_min_ratio.attr, _attr_max_ratio.attr, _attr_stable_pages_required.attr, + _attr_strictlimit.attr, NULL, }; ATTRIBUTE_GROUPS(bdi_dev); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] mm: add strictlimit knob
strictlimit feature was introduced to enforce per-bdi dirty limits for FUSE which sets bdi max_ratio to 1% by default: http://www.http.com//article.gmane.org/gmane.linux.kernel.mm/105809 However the feature can be useful for other relatively slow or untrusted BDIs like USB flash drives and DVD+RW. The patch adds a knob to enable the feature: echo 1 /sys/class/bdi/X:Y/strictlimit Being enabled, the feature enforces bdi max_ratio limit even if global (10%) dirty limit is not reached. Of course, the effect is not visible until max_ratio is decreased to some reasonable value. Signed-off-by: Maxim Patlasov mpatla...@parallels.com --- mm/backing-dev.c | 35 +++ 1 file changed, 35 insertions(+) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index ce682f7..4ee1d64 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -234,11 +234,46 @@ static ssize_t stable_pages_required_show(struct device *dev, } static DEVICE_ATTR_RO(stable_pages_required); +static ssize_t strictlimit_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 val; + ssize_t ret; + + ret = kstrtouint(buf, 10, val); + if (ret 0) + return ret; + + switch (val) { + case 0: + bdi-capabilities = ~BDI_CAP_STRICTLIMIT; + break; + case 1: + bdi-capabilities |= BDI_CAP_STRICTLIMIT; + break; + default: + return -EINVAL; + } + + return count; +} +static ssize_t strictlimit_show(struct device *dev, + struct device_attribute *attr, char *page) +{ + struct backing_dev_info *bdi = dev_get_drvdata(dev); + + return snprintf(page, PAGE_SIZE-1, %d\n, + !!(bdi-capabilities BDI_CAP_STRICTLIMIT)); +} +static DEVICE_ATTR_RW(strictlimit); + static struct attribute *bdi_dev_attrs[] = { dev_attr_read_ahead_kb.attr, dev_attr_min_ratio.attr, dev_attr_max_ratio.attr, dev_attr_stable_pages_required.attr, + dev_attr_strictlimit.attr, NULL, }; ATTRIBUTE_GROUPS(bdi_dev); -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/