linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] tools/testing: fix testing/vma and testing/radix-tree build
@ 2026-02-25 23:31 Mike Rapoport
  2026-02-26  0:39 ` SeongJae Park
  0 siblings, 1 reply; 2+ messages in thread
From: Mike Rapoport @ 2026-02-25 23:31 UTC (permalink / raw)
  To: Andrew Morton
  Cc: David Hildenbrand, Kees Cook, Liam R. Howlett, Lorenzo Stoakes,
	Matthew Wilcox, Mike Rapoport, linux-kernel, linux-mm

From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>

Build of VMA and radix-tree tests is unhappy after the conversion of
kzalloc() to kzalloc_obj() in lib/idr.c:

  cc -I../shared -I. -I../../include -I../../arch/x86/include -I../../../lib -g -Og -Wall -D_LGPL_SOURCE -fsanitize=address -fsanitize=undefined  -DNUM_VMA_FLAG_BITS=128 -DNUM_MM_FLAG_BITS=128   -c -o idr.o idr.c
  idr.c: In function ‘ida_alloc_range’:
  idr.c:420:34: error: implicit declaration of function ‘kzalloc_obj’; did you mean ‘kzalloc_node’? [-Wimplicit-function-declaration]
    420 |                         bitmap = kzalloc_obj(*bitmap, GFP_NOWAIT);
        |                                  ^~~~~~~~~~~
        |                                  kzalloc_node
  idr.c:420:32: error: assignment to ‘struct ida_bitmap *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
    420 |                         bitmap = kzalloc_obj(*bitmap, GFP_NOWAIT);
        |                                ^
  idr.c:447:40: error: assignment to ‘struct ida_bitmap *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
    447 |                                 bitmap = kzalloc_obj(*bitmap, GFP_NOWAIT);
        |                                        ^
  idr.c:468:15: error: assignment to ‘struct ida_bitmap *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
    468 |         alloc = kzalloc_obj(*bitmap, gfp);
        |               ^
  make: *** [<builtin>: idr.o] Error 1

Import necessary macros from include/linux to tools/include/linux to fix
the compilation.

Fixes: 69050f8d6d07 ("treewide: Replace kmalloc with kmalloc_obj for non-scalar types")
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
---
 tools/include/linux/gfp.h      |  4 ++++
 tools/include/linux/overflow.h | 19 +++++++++++++++++++
 tools/include/linux/slab.h     |  9 +++++++++
 3 files changed, 32 insertions(+)

diff --git a/tools/include/linux/gfp.h b/tools/include/linux/gfp.h
index 6a10ff5f5be9..9e957b57b694 100644
--- a/tools/include/linux/gfp.h
+++ b/tools/include/linux/gfp.h
@@ -5,6 +5,10 @@
 #include <linux/types.h>
 #include <linux/gfp_types.h>
 
+/* Helper macro to avoid gfp flags if they are the default one */
+#define __default_gfp(a,...) a
+#define default_gfp(...) __default_gfp(__VA_ARGS__ __VA_OPT__(,) GFP_KERNEL)
+
 static inline bool gfpflags_allow_blocking(const gfp_t gfp_flags)
 {
 	return !!(gfp_flags & __GFP_DIRECT_RECLAIM);
diff --git a/tools/include/linux/overflow.h b/tools/include/linux/overflow.h
index dcb0c1bf6866..3427d7880326 100644
--- a/tools/include/linux/overflow.h
+++ b/tools/include/linux/overflow.h
@@ -68,6 +68,25 @@
 	__builtin_mul_overflow(__a, __b, __d);	\
 })
 
+/**
+ * size_mul() - Calculate size_t multiplication with saturation at SIZE_MAX
+ * @factor1: first factor
+ * @factor2: second factor
+ *
+ * Returns: calculate @factor1 * @factor2, both promoted to size_t,
+ * with any overflow causing the return value to be SIZE_MAX. The
+ * lvalue must be size_t to avoid implicit type conversion.
+ */
+static inline size_t __must_check size_mul(size_t factor1, size_t factor2)
+{
+	size_t bytes;
+
+	if (check_mul_overflow(factor1, factor2, &bytes))
+		return SIZE_MAX;
+
+	return bytes;
+}
+
 /**
  * array_size() - Calculate size of 2-dimensional array.
  *
diff --git a/tools/include/linux/slab.h b/tools/include/linux/slab.h
index 94937a699402..6d8e9413d5a4 100644
--- a/tools/include/linux/slab.h
+++ b/tools/include/linux/slab.h
@@ -202,4 +202,13 @@ static inline unsigned int kmem_cache_sheaf_size(struct slab_sheaf *sheaf)
 	return sheaf->size;
 }
 
+#define __alloc_objs(KMALLOC, GFP, TYPE, COUNT)				\
+({									\
+	const size_t __obj_size = size_mul(sizeof(TYPE), COUNT);	\
+	(TYPE *)KMALLOC(__obj_size, GFP);				\
+})
+
+#define kzalloc_obj(P, ...) \
+	__alloc_objs(kzalloc, default_gfp(__VA_ARGS__), typeof(P), 1)
+
 #endif		/* _TOOLS_SLAB_H */
-- 
2.51.0



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] tools/testing: fix testing/vma and testing/radix-tree build
  2026-02-25 23:31 [PATCH] tools/testing: fix testing/vma and testing/radix-tree build Mike Rapoport
@ 2026-02-26  0:39 ` SeongJae Park
  0 siblings, 0 replies; 2+ messages in thread
From: SeongJae Park @ 2026-02-26  0:39 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: SeongJae Park, Andrew Morton, David Hildenbrand, Kees Cook,
	Liam R. Howlett, Lorenzo Stoakes, Matthew Wilcox, linux-kernel,
	linux-mm

On Thu, 26 Feb 2026 01:31:11 +0200 Mike Rapoport <rppt@kernel.org> wrote:

> From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
> 
> Build of VMA and radix-tree tests is unhappy after the conversion of
> kzalloc() to kzalloc_obj() in lib/idr.c:
> 
>   cc -I../shared -I. -I../../include -I../../arch/x86/include -I../../../lib -g -Og -Wall -D_LGPL_SOURCE -fsanitize=address -fsanitize=undefined  -DNUM_VMA_FLAG_BITS=128 -DNUM_MM_FLAG_BITS=128   -c -o idr.o idr.c
>   idr.c: In function ‘ida_alloc_range’:
>   idr.c:420:34: error: implicit declaration of function ‘kzalloc_obj’; did you mean ‘kzalloc_node’? [-Wimplicit-function-declaration]
>     420 |                         bitmap = kzalloc_obj(*bitmap, GFP_NOWAIT);
>         |                                  ^~~~~~~~~~~
>         |                                  kzalloc_node
>   idr.c:420:32: error: assignment to ‘struct ida_bitmap *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
>     420 |                         bitmap = kzalloc_obj(*bitmap, GFP_NOWAIT);
>         |                                ^
>   idr.c:447:40: error: assignment to ‘struct ida_bitmap *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
>     447 |                                 bitmap = kzalloc_obj(*bitmap, GFP_NOWAIT);
>         |                                        ^
>   idr.c:468:15: error: assignment to ‘struct ida_bitmap *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
>     468 |         alloc = kzalloc_obj(*bitmap, gfp);
>         |               ^
>   make: *** [<builtin>: idr.o] Error 1
> 
> Import necessary macros from include/linux to tools/include/linux to fix
> the compilation.

Thank you for fixing this!
> 
> Fixes: 69050f8d6d07 ("treewide: Replace kmalloc with kmalloc_obj for non-scalar types")
> Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>

Tested-by: SeongJae Park <sj@kernel.org>

> ---
>  tools/include/linux/gfp.h      |  4 ++++
>  tools/include/linux/overflow.h | 19 +++++++++++++++++++
>  tools/include/linux/slab.h     |  9 +++++++++
>  3 files changed, 32 insertions(+)
> 
> diff --git a/tools/include/linux/gfp.h b/tools/include/linux/gfp.h
> index 6a10ff5f5be9..9e957b57b694 100644
> --- a/tools/include/linux/gfp.h
> +++ b/tools/include/linux/gfp.h
> @@ -5,6 +5,10 @@
>  #include <linux/types.h>
>  #include <linux/gfp_types.h>
>  
> +/* Helper macro to avoid gfp flags if they are the default one */
> +#define __default_gfp(a,...) a
> +#define default_gfp(...) __default_gfp(__VA_ARGS__ __VA_OPT__(,) GFP_KERNEL)
> +
>  static inline bool gfpflags_allow_blocking(const gfp_t gfp_flags)
>  {
>  	return !!(gfp_flags & __GFP_DIRECT_RECLAIM);
> diff --git a/tools/include/linux/overflow.h b/tools/include/linux/overflow.h
> index dcb0c1bf6866..3427d7880326 100644
> --- a/tools/include/linux/overflow.h
> +++ b/tools/include/linux/overflow.h
> @@ -68,6 +68,25 @@
>  	__builtin_mul_overflow(__a, __b, __d);	\
>  })
>  
> +/**
> + * size_mul() - Calculate size_t multiplication with saturation at SIZE_MAX
> + * @factor1: first factor
> + * @factor2: second factor
> + *
> + * Returns: calculate @factor1 * @factor2, both promoted to size_t,
> + * with any overflow causing the return value to be SIZE_MAX. The
> + * lvalue must be size_t to avoid implicit type conversion.
> + */
> +static inline size_t __must_check size_mul(size_t factor1, size_t factor2)
> +{
> +	size_t bytes;
> +
> +	if (check_mul_overflow(factor1, factor2, &bytes))
> +		return SIZE_MAX;
> +
> +	return bytes;
> +}
> +
>  /**
>   * array_size() - Calculate size of 2-dimensional array.
>   *
> diff --git a/tools/include/linux/slab.h b/tools/include/linux/slab.h
> index 94937a699402..6d8e9413d5a4 100644
> --- a/tools/include/linux/slab.h
> +++ b/tools/include/linux/slab.h
> @@ -202,4 +202,13 @@ static inline unsigned int kmem_cache_sheaf_size(struct slab_sheaf *sheaf)
>  	return sheaf->size;
>  }
>  
> +#define __alloc_objs(KMALLOC, GFP, TYPE, COUNT)				\
> +({									\
> +	const size_t __obj_size = size_mul(sizeof(TYPE), COUNT);	\
> +	(TYPE *)KMALLOC(__obj_size, GFP);				\
> +})
> +
> +#define kzalloc_obj(P, ...) \
> +	__alloc_objs(kzalloc, default_gfp(__VA_ARGS__), typeof(P), 1)
> +

Just out of curiosity.  Is there a reason to not copy the comments from the
original (include/linux/...) for the above two macros, unlike the others on
this patch?


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-02-26  0:39 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-25 23:31 [PATCH] tools/testing: fix testing/vma and testing/radix-tree build Mike Rapoport
2026-02-26  0:39 ` SeongJae Park

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox