2022-04-22 22:59:44

by Jagdish Gediya

[permalink] [raw]
Subject: [PATCH v3 6/7] mm: demotion: expose per-node demotion targets via sysfs

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 <[email protected]>
---
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);

#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


2022-04-23 09:55:57

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] mm: demotion: expose per-node demotion targets via sysfs

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/[email protected]/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 <[email protected]>

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

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-04-23 12:28:36

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] mm: demotion: expose per-node demotion targets via sysfs

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/[email protected]/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 <[email protected]>

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

--
0-DAY CI Kernel Test Service
https://01.org/lkp