From: Zhi Yong Wu <wu...@linux.vnet.ibm.com>

  Add three proc interfaces hot-reloc-interval, hot-reloc-threshold,
and hot-reloc-max-items under the dir /proc/sys/fs/ in order to
turn HOT_RELOC_INTERVAL, HOT_RELOC_THRESHOLD, and HOT_RELOC_MAX_ITEMS
into be tunable.

Signed-off-by: Zhi Yong Wu <wu...@linux.vnet.ibm.com>
---
 fs/btrfs/hot_relocate.c | 26 +++++++++++++++++---------
 fs/btrfs/hot_relocate.h |  5 -----
 include/linux/btrfs.h   |  4 ++++
 kernel/sysctl.c         | 22 ++++++++++++++++++++++
 4 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/fs/btrfs/hot_relocate.c b/fs/btrfs/hot_relocate.c
index ae28b86..3a18555 100644
--- a/fs/btrfs/hot_relocate.c
+++ b/fs/btrfs/hot_relocate.c
@@ -25,7 +25,7 @@
  * The relocation code below operates on the heat map lists to identify
  * hot or cold data logical file ranges that are candidates for relocation.
  * The triggering mechanism for relocation is controlled by a global heat
- * threshold integer value (HOT_RELOC_THRESHOLD). Ranges are
+ * threshold integer value (sysctl_hot_reloc_threshold). Ranges are
  * queued for relocation by the periodically executing relocate kthread,
  * which updates the global heat threshold and responds to space pressure
  * on the nonrotating disks.
@@ -53,6 +53,15 @@
  * (assuming, critically, the HOT_MOVE option is set at mount time).
  */
 
+int sysctl_hot_reloc_threshold = 150;
+EXPORT_SYMBOL_GPL(sysctl_hot_reloc_threshold);
+
+int sysctl_hot_reloc_interval __read_mostly = 120;
+EXPORT_SYMBOL_GPL(sysctl_hot_reloc_interval);
+
+int sysctl_hot_reloc_max_items __read_mostly = 250;
+EXPORT_SYMBOL_GPL(sysctl_hot_reloc_max_items);
+
 /*
  * Returns the ratio of nonrotating disks that are full.
  * If no nonrotating disk is found, returns THRESH_MAX_VALUE + 1.
@@ -103,7 +112,7 @@ static int hot_calc_nonrot_ratio(struct hot_reloc 
*hot_reloc)
 static int hot_update_threshold(struct hot_reloc *hot_reloc,
                                int update)
 {
-       int thresh = hot_reloc->thresh;
+       int thresh = sysctl_hot_reloc_threshold;
        int ratio = hot_calc_nonrot_ratio(hot_reloc);
 
        /* Sometimes update global threshold, others not */
@@ -127,7 +136,7 @@ static int hot_update_threshold(struct hot_reloc *hot_reloc,
                        thresh = 0;
        }
 
-       hot_reloc->thresh = thresh;
+       sysctl_hot_reloc_threshold = thresh;
        return ratio;
 }
 
@@ -215,7 +224,7 @@ static int hot_queue_extent(struct hot_reloc *hot_reloc,
                        *counter = *counter + 1;
                }
 
-               if (*counter >= HOT_RELOC_MAX_ITEMS)
+               if (*counter >= sysctl_hot_reloc_max_items)
                        break;
 
                if (kthread_should_stop()) {
@@ -293,7 +302,7 @@ again:
                while (1) {
                        lock_extent(tree, page_start, page_end);
                        ordered = btrfs_lookup_ordered_extent(inode,
-                                                       page_start);
+                                                             page_start);
                        unlock_extent(tree, page_start, page_end);
                        if (!ordered)
                                break;
@@ -559,7 +568,7 @@ void hot_do_relocate(struct hot_reloc *hot_reloc)
 
        run++;
        ratio = hot_update_threshold(hot_reloc, !(run % 15));
-       thresh = hot_reloc->thresh;
+       thresh = sysctl_hot_reloc_threshold;
 
        INIT_LIST_HEAD(&hot_reloc->hot_relocq[TYPE_NONROT]);
 
@@ -569,7 +578,7 @@ void hot_do_relocate(struct hot_reloc *hot_reloc)
        if (count_to_hot == 0)
                return;
 
-       count_to_cold = HOT_RELOC_MAX_ITEMS;
+       count_to_cold = sysctl_hot_reloc_max_items;
 
        /* Don't move cold data to HDD unless there's space pressure */
        if (ratio < HIGH_WATER_LEVEL)
@@ -653,7 +662,7 @@ static int hot_relocate_kthread(void *arg)
        unsigned long delay;
 
        do {
-               delay = HZ * HOT_RELOC_INTERVAL;
+               delay = HZ * sysctl_hot_reloc_interval;
                if (mutex_trylock(&hot_reloc->hot_reloc_mutex)) {
                        hot_do_relocate(hot_reloc);
                        mutex_unlock(&hot_reloc->hot_reloc_mutex);
@@ -685,7 +694,6 @@ int hot_relocate_init(struct btrfs_fs_info *fs_info)
 
        fs_info->hot_reloc = hot_reloc;
        hot_reloc->fs_info = fs_info;
-       hot_reloc->thresh = HOT_RELOC_THRESHOLD;
        for (i = 0; i < MAX_RELOC_TYPES; i++)
                INIT_LIST_HEAD(&hot_reloc->hot_relocq[i]);
        mutex_init(&hot_reloc->hot_reloc_mutex);
diff --git a/fs/btrfs/hot_relocate.h b/fs/btrfs/hot_relocate.h
index 1b1cfb5..94defe6 100644
--- a/fs/btrfs/hot_relocate.h
+++ b/fs/btrfs/hot_relocate.h
@@ -18,10 +18,6 @@
 #include "btrfs_inode.h"
 #include "volumes.h"
 
-#define HOT_RELOC_INTERVAL  120
-#define HOT_RELOC_THRESHOLD 150
-#define HOT_RELOC_MAX_ITEMS 250
-
 #define HEAT_MAX_VALUE    (MAP_SIZE - 1)
 #define HIGH_WATER_LEVEL  75 /* when to raise the threshold */
 #define LOW_WATER_LEVEL   50 /* when to lower the threshold */
@@ -32,7 +28,6 @@
 struct hot_reloc {
        struct btrfs_fs_info *fs_info;
        struct list_head hot_relocq[MAX_RELOC_TYPES];
-       int thresh;
        struct task_struct *hot_reloc_kthread;
        struct mutex hot_reloc_mutex;
 };
diff --git a/include/linux/btrfs.h b/include/linux/btrfs.h
index 22d7991..7179819 100644
--- a/include/linux/btrfs.h
+++ b/include/linux/btrfs.h
@@ -3,4 +3,8 @@
 
 #include <uapi/linux/btrfs.h>
 
+extern int sysctl_hot_reloc_threshold;
+extern int sysctl_hot_reloc_interval;
+extern int sysctl_hot_reloc_max_items;
+
 #endif /* _LINUX_BTRFS_H */
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 6ee4338..3ab1a68 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -62,6 +62,7 @@
 #include <linux/capability.h>
 #include <linux/binfmts.h>
 #include <linux/sched/sysctl.h>
+#include <linux/btrfs.h>
 
 #include <asm/uaccess.h>
 #include <asm/processor.h>
@@ -1630,6 +1631,27 @@ static struct ctl_table fs_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
+       {
+               .procname       = "hot-reloc-threshold",
+               .data           = &sysctl_hot_reloc_threshold,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "hot-reloc-interval",
+               .data           = &sysctl_hot_reloc_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "hot-reloc-max-items",
+               .data           = &sysctl_hot_reloc_max_items,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
        { }
 };
 
-- 
1.7.11.7

--
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/

Reply via email to