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 |
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 >
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
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 --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
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(+)