From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756145AbbGFQxR (ORCPT ); Mon, 6 Jul 2015 12:53:17 -0400 Received: from linuxhacker.ru ([217.76.32.60]:53237 "EHLO fiona.linuxhacker.ru" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1754829AbbGFQt1 (ORCPT ); Mon, 6 Jul 2015 12:49:27 -0400 From: green@linuxhacker.ru To: Greg Kroah-Hartman , devel@driverdev.osuosl.org, Andreas Dilger Cc: Linux Kernel Mailing List , Oleg Drokin Subject: [PATCH 09/20] staging/lustre/obdclass: move max_dirty_mb from sysctl to sysfs Date: Mon, 6 Jul 2015 12:48:47 -0400 Message-Id: <1436201338-14263-10-git-send-email-green@linuxhacker.ru> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1436201338-14263-1-git-send-email-green@linuxhacker.ru> References: <1436201338-14263-1-git-send-email-green@linuxhacker.ru> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleg Drokin max_dirty_mb is now a parameter in /sys/fs/lustre/ Signed-off-by: Oleg Drokin --- .../lustre/lustre/obdclass/linux/linux-sysctl.c | 74 +++++++++------------- drivers/staging/lustre/sysfs-fs-lustre | 12 ++++ 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c b/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c index 3c8087b..bb55a07 100644 --- a/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c +++ b/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c @@ -100,48 +100,42 @@ static struct static_lustre_uintvalue_attr lustre_sattr_##name = \ LUSTRE_STATIC_UINT_ATTR(timeout, &obd_timeout); -#ifdef CONFIG_SYSCTL -static int proc_max_dirty_pages_in_mb(struct ctl_table *table, int write, - void __user *buffer, size_t *lenp, loff_t *ppos) +static ssize_t max_dirty_mb_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - int rc = 0; + return sprintf(buf, "%ul\n", + obd_max_dirty_pages / (1 << (20 - PAGE_CACHE_SHIFT))); +} + +static ssize_t max_dirty_mb_store(struct kobject *kobj, struct attribute *attr, + const char *buffer, size_t count) +{ + int rc; + unsigned long val; + + rc = kstrtoul(buffer, 10, &val); + if (rc) + return rc; + + val *= 1 << (20 - PAGE_CACHE_SHIFT); /* convert to pages */ - if (!table->data || !table->maxlen || !*lenp || (*ppos && !write)) { - *lenp = 0; - return 0; + if (val > ((totalram_pages / 10) * 9)) { + /* Somebody wants to assign too much memory to dirty pages */ + return -EINVAL; } - if (write) { - rc = lprocfs_write_frac_helper(buffer, *lenp, - (unsigned int *)table->data, - 1 << (20 - PAGE_CACHE_SHIFT)); - /* Don't allow them to let dirty pages exceed 90% of system - * memory and set a hard minimum of 4MB. */ - if (obd_max_dirty_pages > ((totalram_pages / 10) * 9)) { - CERROR("Refusing to set max dirty pages to %u, which is more than 90%% of available RAM; setting to %lu\n", - obd_max_dirty_pages, - ((totalram_pages / 10) * 9)); - obd_max_dirty_pages = (totalram_pages / 10) * 9; - } else if (obd_max_dirty_pages < 4 << (20 - PAGE_CACHE_SHIFT)) { - obd_max_dirty_pages = 4 << (20 - PAGE_CACHE_SHIFT); - } - } else { - char buf[21]; - int len; - - len = lprocfs_read_frac_helper(buf, sizeof(buf), - *(unsigned int *)table->data, - 1 << (20 - PAGE_CACHE_SHIFT)); - if (len > *lenp) - len = *lenp; - buf[len] = '\0'; - if (copy_to_user(buffer, buf, len)) - return -EFAULT; - *lenp = len; + + if (val < 4 << (20 - PAGE_CACHE_SHIFT)) { + /* Less than 4 Mb for dirty cache is also bad */ + return -EINVAL; } - *ppos += *lenp; - return rc; + + obd_max_dirty_pages = val; + + return count; } +LUSTRE_RW_ATTR(max_dirty_mb); +#ifdef CONFIG_SYSCTL static struct ctl_table obd_table[] = { { .procname = "debug_peer_on_timeout", @@ -165,13 +159,6 @@ static struct ctl_table obd_table[] = { .proc_handler = &proc_dointvec }, { - .procname = "max_dirty_mb", - .data = &obd_max_dirty_pages, - .maxlen = sizeof(int), - .mode = 0644, - .proc_handler = &proc_max_dirty_pages_in_mb - }, - { .procname = "at_min", .data = &at_min, .maxlen = sizeof(int), @@ -223,6 +210,7 @@ static struct ctl_table parent_table[] = { static struct attribute *lustre_attrs[] = { &lustre_sattr_timeout.u.attr, + &lustre_attr_max_dirty_mb.attr, NULL, }; diff --git a/drivers/staging/lustre/sysfs-fs-lustre b/drivers/staging/lustre/sysfs-fs-lustre index 6dbad26..38d1adc 100644 --- a/drivers/staging/lustre/sysfs-fs-lustre +++ b/drivers/staging/lustre/sysfs-fs-lustre @@ -52,6 +52,18 @@ Description: AT (adaptive timeouts). Unit: seconds, default: 100 +What: /sys/fs/lustre/max_dirty_mb +Date: June 2015 +Contact: "Oleg Drokin" +Description: + Controls total number of dirty cache (in megabytes) allowed + across all mounted lustre filesystems. + Since writeout of dirty pages in Lustre is somewhat expensive, + when you allow to many dirty pages, this might lead to + performance degradations as kernel tries to desperately + find some pages to free/writeout. + Default 1/2 RAM. Min value 4, max value 9/10 of RAM. + What: /sys/fs/lustre/llite/-/blocksize Date: May 2015 Contact: "Oleg Drokin" -- 2.1.0