* [PATCH 1/3] vmalloc: Add for_each_vmap_node() helper
@ 2025-04-08 15:15 Uladzislau Rezki (Sony)
2025-04-08 15:15 ` [PATCH 2/3] vmalloc: Switch to " Uladzislau Rezki (Sony)
2025-04-08 15:15 ` [PATCH 3/3] vmalloc: Use for_each_vmap_node() in purge-vmap-area Uladzislau Rezki (Sony)
0 siblings, 2 replies; 6+ messages in thread
From: Uladzislau Rezki (Sony) @ 2025-04-08 15:15 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, LKML, Christoph Hellwig, Uladzislau Rezki,
Oleksiy Avramchenko
To simplify iteration over vmap-nodes, add the for_each_vmap_node()
macro that iterates over all nodes in a system. It tends to simplify
the code.
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
---
mm/vmalloc.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index bcc90d4357e48..e42ea20713dc7 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -900,6 +900,11 @@ static struct vmap_node *vmap_nodes = &single;
static __read_mostly unsigned int nr_vmap_nodes = 1;
static __read_mostly unsigned int vmap_zone_size = 1;
+/* A simple iterator over all vmap-nodes. */
+#define for_each_vmap_node(vn) \
+ for ((vn) = &vmap_nodes[0]; \
+ (vn) < &vmap_nodes[nr_vmap_nodes]; (vn)++)
+
static inline unsigned int
addr_to_node_id(unsigned long addr)
{
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] vmalloc: Switch to for_each_vmap_node() helper
2025-04-08 15:15 [PATCH 1/3] vmalloc: Add for_each_vmap_node() helper Uladzislau Rezki (Sony)
@ 2025-04-08 15:15 ` Uladzislau Rezki (Sony)
2025-04-09 17:39 ` kernel test robot
2025-04-08 15:15 ` [PATCH 3/3] vmalloc: Use for_each_vmap_node() in purge-vmap-area Uladzislau Rezki (Sony)
1 sibling, 1 reply; 6+ messages in thread
From: Uladzislau Rezki (Sony) @ 2025-04-08 15:15 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, LKML, Christoph Hellwig, Uladzislau Rezki,
Oleksiy Avramchenko
There are places which can be updated easily to use the
helper to iterate over all vmap-nodes. This is what this
patch does.
The aim is to improve readability and simplify the code.
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
---
mm/vmalloc.c | 36 +++++++++++++-----------------------
1 file changed, 13 insertions(+), 23 deletions(-)
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index e42ea20713dc7..3ff9acd64c077 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1061,12 +1061,11 @@ find_vmap_area_exceed_addr_lock(unsigned long addr, struct vmap_area **va)
{
unsigned long va_start_lowest;
struct vmap_node *vn;
- int i;
repeat:
- for (i = 0, va_start_lowest = 0; i < nr_vmap_nodes; i++) {
- vn = &vmap_nodes[i];
+ va_start_lowest = 0;
+ for_each_vmap_node(vn) {
spin_lock(&vn->busy.lock);
*va = __find_vmap_area_exceed_addr(addr, &vn->busy.root);
@@ -4946,11 +4945,8 @@ static void show_purge_info(struct seq_file *m)
{
struct vmap_node *vn;
struct vmap_area *va;
- int i;
-
- for (i = 0; i < nr_vmap_nodes; i++) {
- vn = &vmap_nodes[i];
+ for_each_vmap_node(vn) {
spin_lock(&vn->lazy.lock);
list_for_each_entry(va, &vn->lazy.head, list) {
seq_printf(m, "0x%pK-0x%pK %7ld unpurged vm_area\n",
@@ -4966,11 +4962,8 @@ static int vmalloc_info_show(struct seq_file *m, void *p)
struct vmap_node *vn;
struct vmap_area *va;
struct vm_struct *v;
- int i;
-
- for (i = 0; i < nr_vmap_nodes; i++) {
- vn = &vmap_nodes[i];
+ for_each_vmap_node(vn) {
spin_lock(&vn->busy.lock);
list_for_each_entry(va, &vn->busy.head, list) {
if (!va->vm) {
@@ -5123,8 +5116,7 @@ static void vmap_init_nodes(void)
}
#endif
- for (n = 0; n < nr_vmap_nodes; n++) {
- vn = &vmap_nodes[n];
+ for_each_vmap_node(vn) {
vn->busy.root = RB_ROOT;
INIT_LIST_HEAD(&vn->busy.head);
spin_lock_init(&vn->busy.lock);
@@ -5145,15 +5137,13 @@ static void vmap_init_nodes(void)
static unsigned long
vmap_node_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
{
- unsigned long count;
+ unsigned long count = 0;
struct vmap_node *vn;
- int i, j;
-
- for (count = 0, i = 0; i < nr_vmap_nodes; i++) {
- vn = &vmap_nodes[i];
+ int i;
- for (j = 0; j < MAX_VA_SIZE_PAGES; j++)
- count += READ_ONCE(vn->pool[j].len);
+ for_each_vmap_node(vn) {
+ for (i = 0; i < MAX_VA_SIZE_PAGES; i++)
+ count += READ_ONCE(vn->pool[i].len);
}
return count ? count : SHRINK_EMPTY;
@@ -5162,10 +5152,10 @@ vmap_node_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
static unsigned long
vmap_node_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
{
- int i;
+ struct vmap_node *vn;
- for (i = 0; i < nr_vmap_nodes; i++)
- decay_va_pool_node(&vmap_nodes[i], true);
+ for_each_vmap_node(vn)
+ decay_va_pool_node(vn, true);
return SHRINK_STOP;
}
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] vmalloc: Use for_each_vmap_node() in purge-vmap-area
2025-04-08 15:15 [PATCH 1/3] vmalloc: Add for_each_vmap_node() helper Uladzislau Rezki (Sony)
2025-04-08 15:15 ` [PATCH 2/3] vmalloc: Switch to " Uladzislau Rezki (Sony)
@ 2025-04-08 15:15 ` Uladzislau Rezki (Sony)
1 sibling, 0 replies; 6+ messages in thread
From: Uladzislau Rezki (Sony) @ 2025-04-08 15:15 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-mm, LKML, Christoph Hellwig, Uladzislau Rezki,
Oleksiy Avramchenko
Update a __purge_vmap_area_lazy() to use introduced helper.
This is last place in vmalloc code. Also this patch introduces
an extra function which is node_to_id() that converts a vmap_node
pointer to an index in array.
__purge_vmap_area_lazy() requires that extra function.
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
---
mm/vmalloc.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 3ff9acd64c077..409b8f372647f 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -923,6 +923,19 @@ id_to_node(unsigned int id)
return &vmap_nodes[id % nr_vmap_nodes];
}
+static inline unsigned int
+node_to_id(struct vmap_node *node)
+{
+ /* Pointer arithmetic. */
+ unsigned int id = node - vmap_nodes;
+
+ if (likely(id < nr_vmap_nodes))
+ return id;
+
+ WARN_ONCE(1, "An address 0x%p is out-of-bounds.\n", node);
+ return 0;
+}
+
/*
* We use the value 0 to represent "no node", that is why
* an encoded value will be the node-id incremented by 1.
@@ -2259,9 +2272,7 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end,
*/
purge_nodes = CPU_MASK_NONE;
- for (i = 0; i < nr_vmap_nodes; i++) {
- vn = &vmap_nodes[i];
-
+ for_each_vmap_node(vn) {
INIT_LIST_HEAD(&vn->purge_list);
vn->skip_populate = full_pool_decay;
decay_va_pool_node(vn, full_pool_decay);
@@ -2280,7 +2291,7 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end,
end = max(end, list_last_entry(&vn->purge_list,
struct vmap_area, list)->va_end);
- cpumask_set_cpu(i, &purge_nodes);
+ cpumask_set_cpu(node_to_id(vn), &purge_nodes);
}
nr_purge_nodes = cpumask_weight(&purge_nodes);
--
2.39.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/3] vmalloc: Switch to for_each_vmap_node() helper
2025-04-08 15:15 ` [PATCH 2/3] vmalloc: Switch to " Uladzislau Rezki (Sony)
@ 2025-04-09 17:39 ` kernel test robot
2025-04-10 0:32 ` Andrew Morton
0 siblings, 1 reply; 6+ messages in thread
From: kernel test robot @ 2025-04-09 17:39 UTC (permalink / raw)
To: Uladzislau Rezki (Sony), Andrew Morton
Cc: oe-kbuild-all, Linux Memory Management List, LKML,
Christoph Hellwig, Uladzislau Rezki, Oleksiy Avramchenko
Hi Uladzislau,
kernel test robot noticed the following build warnings:
[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on linus/master v6.15-rc1 next-20250409]
[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#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Uladzislau-Rezki-Sony/vmalloc-Switch-to-for_each_vmap_node-helper/20250408-231807
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20250408151549.77937-2-urezki%40gmail.com
patch subject: [PATCH 2/3] vmalloc: Switch to for_each_vmap_node() helper
config: sparc-randconfig-002-20250409 (https://download.01.org/0day-ci/archive/20250410/202504100130.OjlBJLkQ-lkp@intel.com/config)
compiler: sparc-linux-gcc (GCC) 7.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250410/202504100130.OjlBJLkQ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202504100130.OjlBJLkQ-lkp@intel.com/
All warnings (new ones prefixed by >>):
mm/vmalloc.c: In function 'vmap_init_nodes':
>> mm/vmalloc.c:5087:9: warning: unused variable 'n' [-Wunused-variable]
int i, n;
^
vim +/n +5087 mm/vmalloc.c
7fa8cee003166e Uladzislau Rezki (Sony 2024-01-02 5083)
d093602919ad59 Uladzislau Rezki (Sony 2024-01-02 5084) static void vmap_init_nodes(void)
d093602919ad59 Uladzislau Rezki (Sony 2024-01-02 5085) {
d093602919ad59 Uladzislau Rezki (Sony 2024-01-02 5086) struct vmap_node *vn;
8f33a2ff307248 Uladzislau Rezki (Sony 2024-01-02 @5087) int i, n;
8f33a2ff307248 Uladzislau Rezki (Sony 2024-01-02 5088)
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/3] vmalloc: Switch to for_each_vmap_node() helper
2025-04-09 17:39 ` kernel test robot
@ 2025-04-10 0:32 ` Andrew Morton
2025-04-10 9:34 ` Uladzislau Rezki
0 siblings, 1 reply; 6+ messages in thread
From: Andrew Morton @ 2025-04-10 0:32 UTC (permalink / raw)
To: kernel test robot
Cc: Uladzislau Rezki (Sony), oe-kbuild-all,
Linux Memory Management List, LKML, Christoph Hellwig,
Oleksiy Avramchenko
On Thu, 10 Apr 2025 01:39:24 +0800 kernel test robot <lkp@intel.com> wrote:
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202504100130.OjlBJLkQ-lkp@intel.com/
>
> All warnings (new ones prefixed by >>):
>
> mm/vmalloc.c: In function 'vmap_init_nodes':
> >> mm/vmalloc.c:5087:9: warning: unused variable 'n' [-Wunused-variable]
> int i, n;
> ^
Thanks, I added
--- a/mm/vmalloc.c~vmalloc-switch-to-for_each_vmap_node-helper-fix
+++ a/mm/vmalloc.c
@@ -5084,7 +5084,7 @@ static void __init vmap_init_free_space(
static void vmap_init_nodes(void)
{
struct vmap_node *vn;
- int i, n;
+ int i;
#if BITS_PER_LONG == 64
/*
@@ -5101,7 +5101,7 @@ static void vmap_init_nodes(void)
* set of cores. Therefore a per-domain purging is supposed to
* be added as well as a per-domain balancing.
*/
- n = clamp_t(unsigned int, num_possible_cpus(), 1, 128);
+ int n = clamp_t(unsigned int, num_possible_cpus(), 1, 128);
if (n > 1) {
vn = kmalloc_array(n, sizeof(*vn), GFP_NOWAIT | __GFP_NOWARN);
_
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/3] vmalloc: Switch to for_each_vmap_node() helper
2025-04-10 0:32 ` Andrew Morton
@ 2025-04-10 9:34 ` Uladzislau Rezki
0 siblings, 0 replies; 6+ messages in thread
From: Uladzislau Rezki @ 2025-04-10 9:34 UTC (permalink / raw)
To: Andrew Morton
Cc: kernel test robot, Uladzislau Rezki (Sony), oe-kbuild-all,
Linux Memory Management List, LKML, Christoph Hellwig,
Oleksiy Avramchenko
On Wed, Apr 09, 2025 at 05:32:17PM -0700, Andrew Morton wrote:
> On Thu, 10 Apr 2025 01:39:24 +0800 kernel test robot <lkp@intel.com> wrote:
>
> > | Reported-by: kernel test robot <lkp@intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202504100130.OjlBJLkQ-lkp@intel.com/
> >
> > All warnings (new ones prefixed by >>):
> >
> > mm/vmalloc.c: In function 'vmap_init_nodes':
> > >> mm/vmalloc.c:5087:9: warning: unused variable 'n' [-Wunused-variable]
> > int i, n;
> > ^
>
> Thanks, I added
>
> --- a/mm/vmalloc.c~vmalloc-switch-to-for_each_vmap_node-helper-fix
> +++ a/mm/vmalloc.c
> @@ -5084,7 +5084,7 @@ static void __init vmap_init_free_space(
> static void vmap_init_nodes(void)
> {
> struct vmap_node *vn;
> - int i, n;
> + int i;
>
> #if BITS_PER_LONG == 64
> /*
> @@ -5101,7 +5101,7 @@ static void vmap_init_nodes(void)
> * set of cores. Therefore a per-domain purging is supposed to
> * be added as well as a per-domain balancing.
> */
> - n = clamp_t(unsigned int, num_possible_cpus(), 1, 128);
> + int n = clamp_t(unsigned int, num_possible_cpus(), 1, 128);
>
> if (n > 1) {
> vn = kmalloc_array(n, sizeof(*vn), GFP_NOWAIT | __GFP_NOWARN);
> _
>
I was about to send a fix for build warning. Thank you Andrew for sorting this out :)
--
Uladzislau Rezki
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-04-10 9:34 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-08 15:15 [PATCH 1/3] vmalloc: Add for_each_vmap_node() helper Uladzislau Rezki (Sony)
2025-04-08 15:15 ` [PATCH 2/3] vmalloc: Switch to " Uladzislau Rezki (Sony)
2025-04-09 17:39 ` kernel test robot
2025-04-10 0:32 ` Andrew Morton
2025-04-10 9:34 ` Uladzislau Rezki
2025-04-08 15:15 ` [PATCH 3/3] vmalloc: Use for_each_vmap_node() in purge-vmap-area Uladzislau Rezki (Sony)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).