diff mbox series

[v3,6/7] mm: demotion: expose per-node demotion targets via sysfs

Message ID 20220422195516.10769-7-jvgediya@linux.ibm.com (mailing list archive)
State New
Headers show
Series mm: demotion: Introduce new node state N_DEMOTION_TARGETS | expand

Commit Message

Jagdish Gediya April 22, 2022, 7:55 p.m. UTC
Kernel prepares per-node demotion target list based on
node_states[N_DEMOTION_TARGETS], If enabled through sysfs,
demotion kicks in during reclaim, and pages get migrated
according to demotion target list prepared by kernel.

It is helpful to know demotion target list prepared by
kernel to understand the demotion behaviour, so add
interface /sys/devices/system/node/nodeX/demotion_targets
to view per-node demotion targets via sysfs.

Signed-off-by: Jagdish Gediya <jvgediya@linux.ibm.com>
---
 drivers/base/node.c     | 10 ++++++++++
 include/linux/migrate.h |  1 +
 mm/migrate.c            | 17 +++++++++++++++++
 3 files changed, 28 insertions(+)

Comments

Wei Xu April 22, 2022, 8:47 p.m. UTC | #1
On Fri, Apr 22, 2022 at 12:55 PM Jagdish Gediya <jvgediya@linux.ibm.com> wrote:
>
> Kernel prepares per-node demotion target list based on
> node_states[N_DEMOTION_TARGETS], If enabled through sysfs,
> demotion kicks in during reclaim, and pages get migrated
> according to demotion target list prepared by kernel.
>
> It is helpful to know demotion target list prepared by
> kernel to understand the demotion behaviour, so add
> interface /sys/devices/system/node/nodeX/demotion_targets
> to view per-node demotion targets via sysfs.
>
> Signed-off-by: Jagdish Gediya <jvgediya@linux.ibm.com>
> ---
>  drivers/base/node.c     | 10 ++++++++++
>  include/linux/migrate.h |  1 +
>  mm/migrate.c            | 17 +++++++++++++++++
>  3 files changed, 28 insertions(+)
>
> diff --git a/drivers/base/node.c b/drivers/base/node.c
> index e03eedbc421b..92326219aac2 100644
> --- a/drivers/base/node.c
> +++ b/drivers/base/node.c
> @@ -561,11 +561,21 @@ static ssize_t node_read_distance(struct device *dev,
>  }
>  static DEVICE_ATTR(distance, 0444, node_read_distance, NULL);
>
> +static ssize_t demotion_targets_show(struct device *dev,
> +                                    struct device_attribute *attr, char *buf)
> +{
> +       nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
> +
> +       return sysfs_emit(buf, "%*pbl\n", nodemask_pr_args(&demotion_targets));
> +}
> +static DEVICE_ATTR_RO(demotion_targets);
> +
>  static struct attribute *node_dev_attrs[] = {
>         &dev_attr_meminfo.attr,
>         &dev_attr_numastat.attr,
>         &dev_attr_distance.attr,
>         &dev_attr_vmstat.attr,
> +       &dev_attr_demotion_targets.attr,
>         NULL
>  };
>
> diff --git a/include/linux/migrate.h b/include/linux/migrate.h
> index 90e75d5a54d6..072019441a24 100644
> --- a/include/linux/migrate.h
> +++ b/include/linux/migrate.h
> @@ -173,6 +173,7 @@ int migrate_vma_setup(struct migrate_vma *args);
>  void migrate_vma_pages(struct migrate_vma *migrate);
>  void migrate_vma_finalize(struct migrate_vma *migrate);
>  int next_demotion_node(int node);
> +nodemask_t node_get_demotion_targets(int node);

I think a stub implementation for !CONFIG_MIGRATION is also needed.

>  #else /* CONFIG_MIGRATION disabled: */
>
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 5b92a09fbe4a..da864831bc0c 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -2187,6 +2187,23 @@ struct demotion_nodes {
>
>  static struct demotion_nodes *node_demotion __read_mostly;
>
> +nodemask_t node_get_demotion_targets(int node)
> +{
> +       nodemask_t demotion_targets = NODE_MASK_NONE;
> +       unsigned short target_nr;
> +
> +       if (!node_demotion)
> +               return NODE_MASK_NONE;
> +
> +       rcu_read_lock();
> +       target_nr = READ_ONCE(node_demotion[node].nr);
> +       for (int i = 0; i < target_nr; i++)
> +               node_set(READ_ONCE(node_demotion[node].nodes[i]), demotion_targets);
> +       rcu_read_unlock();
> +
> +       return demotion_targets;
> +}
> +
>  /**
>   * next_demotion_node() - Get the next node in the demotion path
>   * @node: The starting node to lookup the next node
> --
> 2.35.1
>
kernel test robot April 23, 2022, 7:30 a.m. UTC | #2
Hi Jagdish,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on driver-core/driver-core-testing]
[also build test ERROR on linus/master linux/master v5.18-rc3]
[cannot apply to hnaz-mm/master next-20220422]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Jagdish-Gediya/mm-demotion-Introduce-new-node-state-N_DEMOTION_TARGETS/20220423-035714
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git 4e224719f5d9b92abf1e0edfb2a83053208f3026
config: x86_64-randconfig-a016 (https://download.01.org/0day-ci/archive/20220423/202204231557.Jmw6QI8T-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 5bd87350a5ae429baf8f373cb226a57b62f87280)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/0717e30f61ac83bd6ec65395bf46fdb5131cb83f
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Jagdish-Gediya/mm-demotion-Introduce-new-node-state-N_DEMOTION_TARGETS/20220423-035714
        git checkout 0717e30f61ac83bd6ec65395bf46fdb5131cb83f
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/base/node.c:567:32: error: call to undeclared function 'node_get_demotion_targets'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
           nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
                                         ^
>> drivers/base/node.c:567:13: error: initializing 'nodemask_t' with an expression of incompatible type 'int'
           nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
                      ^                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   2 errors generated.


vim +/node_get_demotion_targets +567 drivers/base/node.c

   563	
   564	static ssize_t demotion_targets_show(struct device *dev,
   565					     struct device_attribute *attr, char *buf)
   566	{
 > 567		nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
   568	
   569		return sysfs_emit(buf, "%*pbl\n", nodemask_pr_args(&demotion_targets));
   570	}
   571	static DEVICE_ATTR_RO(demotion_targets);
   572
kernel test robot April 23, 2022, 8:38 a.m. UTC | #3
Hi Jagdish,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on driver-core/driver-core-testing]
[also build test ERROR on linus/master linux/master v5.18-rc3]
[cannot apply to hnaz-mm/master next-20220422]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Jagdish-Gediya/mm-demotion-Introduce-new-node-state-N_DEMOTION_TARGETS/20220423-035714
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git 4e224719f5d9b92abf1e0edfb2a83053208f3026
config: sparc-randconfig-r034-20220422 (https://download.01.org/0day-ci/archive/20220423/202204231602.2DeA4BIa-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/0717e30f61ac83bd6ec65395bf46fdb5131cb83f
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Jagdish-Gediya/mm-demotion-Introduce-new-node-state-N_DEMOTION_TARGETS/20220423-035714
        git checkout 0717e30f61ac83bd6ec65395bf46fdb5131cb83f
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross W=1 O=build_dir ARCH=sparc SHELL=/bin/bash drivers/base/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/base/node.c: In function 'demotion_targets_show':
>> drivers/base/node.c:567:39: error: implicit declaration of function 'node_get_demotion_targets' [-Werror=implicit-function-declaration]
     567 |         nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
         |                                       ^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/base/node.c:567:39: error: invalid initializer
   cc1: some warnings being treated as errors


vim +/node_get_demotion_targets +567 drivers/base/node.c

   563	
   564	static ssize_t demotion_targets_show(struct device *dev,
   565					     struct device_attribute *attr, char *buf)
   566	{
 > 567		nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
   568	
   569		return sysfs_emit(buf, "%*pbl\n", nodemask_pr_args(&demotion_targets));
   570	}
   571	static DEVICE_ATTR_RO(demotion_targets);
   572
diff mbox series

Patch

diff --git a/drivers/base/node.c b/drivers/base/node.c
index e03eedbc421b..92326219aac2 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -561,11 +561,21 @@  static ssize_t node_read_distance(struct device *dev,
 }
 static DEVICE_ATTR(distance, 0444, node_read_distance, NULL);
 
+static ssize_t demotion_targets_show(struct device *dev,
+				     struct device_attribute *attr, char *buf)
+{
+	nodemask_t demotion_targets = node_get_demotion_targets(dev->id);
+
+	return sysfs_emit(buf, "%*pbl\n", nodemask_pr_args(&demotion_targets));
+}
+static DEVICE_ATTR_RO(demotion_targets);
+
 static struct attribute *node_dev_attrs[] = {
 	&dev_attr_meminfo.attr,
 	&dev_attr_numastat.attr,
 	&dev_attr_distance.attr,
 	&dev_attr_vmstat.attr,
+	&dev_attr_demotion_targets.attr,
 	NULL
 };
 
diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 90e75d5a54d6..072019441a24 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -173,6 +173,7 @@  int migrate_vma_setup(struct migrate_vma *args);
 void migrate_vma_pages(struct migrate_vma *migrate);
 void migrate_vma_finalize(struct migrate_vma *migrate);
 int next_demotion_node(int node);
+nodemask_t node_get_demotion_targets(int node);
 
 #else /* CONFIG_MIGRATION disabled: */
 
diff --git a/mm/migrate.c b/mm/migrate.c
index 5b92a09fbe4a..da864831bc0c 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -2187,6 +2187,23 @@  struct demotion_nodes {
 
 static struct demotion_nodes *node_demotion __read_mostly;
 
+nodemask_t node_get_demotion_targets(int node)
+{
+	nodemask_t demotion_targets = NODE_MASK_NONE;
+	unsigned short target_nr;
+
+	if (!node_demotion)
+		return NODE_MASK_NONE;
+
+	rcu_read_lock();
+	target_nr = READ_ONCE(node_demotion[node].nr);
+	for (int i = 0; i < target_nr; i++)
+		node_set(READ_ONCE(node_demotion[node].nodes[i]), demotion_targets);
+	rcu_read_unlock();
+
+	return demotion_targets;
+}
+
 /**
  * next_demotion_node() - Get the next node in the demotion path
  * @node: The starting node to lookup the next node