linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 1/2] printk: stop including cache.h from printk.h
@ 2022-04-27 19:58 Peter Collingbourne
  2022-04-27 19:58 ` [PATCH v5 2/2] mm: make minimum slab alignment a runtime property Peter Collingbourne
  2022-05-23 14:24 ` [PATCH v5 1/2] printk: stop including cache.h from printk.h Guenter Roeck
  0 siblings, 2 replies; 7+ messages in thread
From: Peter Collingbourne @ 2022-04-27 19:58 UTC (permalink / raw)
  To: Andrey Konovalov, Hyeonggon Yoo, Andrew Morton, Catalin Marinas
  Cc: Peter Collingbourne, Linux ARM, Linux Memory Management List,
	Linux Kernel Mailing List, vbabka, penberg, roman.gushchin,
	iamjoonsoo.kim, rientjes, Herbert Xu, Andrey Ryabinin,
	Alexander Potapenko, Dmitry Vyukov, kasan-dev, Eric Biederman,
	Kees Cook

An inclusion of cache.h in printk.h was added in 2014 in
commit c28aa1f0a847 ("printk/cache: mark printk_once test variable
__read_mostly") in order to bring in the definition of __read_mostly. The
usage of __read_mostly was later removed in commit 3ec25826ae33 ("printk:
Tie printk_once / printk_deferred_once into .data.once for reset")
which made the inclusion of cache.h unnecessary, so remove it.

We have a small amount of code that depended on the inclusion of cache.h
from printk.h; fix that code to include the appropriate header.

This fixes a circular inclusion on arm64 (linux/printk.h -> linux/cache.h
-> asm/cache.h -> linux/kasan-enabled.h -> linux/static_key.h ->
linux/jump_label.h -> linux/bug.h -> asm/bug.h -> linux/printk.h) that
would otherwise be introduced by the next patch.

Build tested using {allyesconfig,defconfig} x {arm64,x86_64}.

Link: https://linux-review.googlesource.com/id/I8fd51f72c9ef1f2d6afd3b2cbc875aa4792c1fba
Signed-off-by: Peter Collingbourne <pcc@google.com>
---
v5:
- fixes for arm randconfig and (tentatively) csky

 arch/arm64/include/asm/mte-kasan.h | 1 +
 arch/arm64/include/asm/percpu.h    | 1 +
 arch/csky/include/asm/processor.h  | 2 +-
 drivers/firmware/smccc/kvm_guest.c | 1 +
 include/linux/printk.h             | 1 -
 kernel/bpf/bpf_lru_list.h          | 1 +
 6 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/include/asm/mte-kasan.h b/arch/arm64/include/asm/mte-kasan.h
index a857bcacf0fe..9f79425fc65a 100644
--- a/arch/arm64/include/asm/mte-kasan.h
+++ b/arch/arm64/include/asm/mte-kasan.h
@@ -6,6 +6,7 @@
 #define __ASM_MTE_KASAN_H
 
 #include <asm/compiler.h>
+#include <asm/cputype.h>
 #include <asm/mte-def.h>
 
 #ifndef __ASSEMBLY__
diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h
index 8f1661603b78..b9ba19dbdb69 100644
--- a/arch/arm64/include/asm/percpu.h
+++ b/arch/arm64/include/asm/percpu.h
@@ -10,6 +10,7 @@
 #include <asm/alternative.h>
 #include <asm/cmpxchg.h>
 #include <asm/stack_pointer.h>
+#include <asm/sysreg.h>
 
 static inline void set_my_cpu_offset(unsigned long off)
 {
diff --git a/arch/csky/include/asm/processor.h b/arch/csky/include/asm/processor.h
index 688c7548b559..9638206bc44f 100644
--- a/arch/csky/include/asm/processor.h
+++ b/arch/csky/include/asm/processor.h
@@ -4,9 +4,9 @@
 #define __ASM_CSKY_PROCESSOR_H
 
 #include <linux/bitops.h>
+#include <linux/cache.h>
 #include <asm/ptrace.h>
 #include <asm/current.h>
-#include <asm/cache.h>
 #include <abi/reg_ops.h>
 #include <abi/regdef.h>
 #include <abi/switch_context.h>
diff --git a/drivers/firmware/smccc/kvm_guest.c b/drivers/firmware/smccc/kvm_guest.c
index 2d3e866decaa..89a68e7eeaa6 100644
--- a/drivers/firmware/smccc/kvm_guest.c
+++ b/drivers/firmware/smccc/kvm_guest.c
@@ -4,6 +4,7 @@
 
 #include <linux/arm-smccc.h>
 #include <linux/bitmap.h>
+#include <linux/cache.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 1522df223c0f..8e8d74edf121 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -6,7 +6,6 @@
 #include <linux/init.h>
 #include <linux/kern_levels.h>
 #include <linux/linkage.h>
-#include <linux/cache.h>
 #include <linux/ratelimit_types.h>
 #include <linux/once_lite.h>
 
diff --git a/kernel/bpf/bpf_lru_list.h b/kernel/bpf/bpf_lru_list.h
index 6b12f06ee18c..4ea227c9c1ad 100644
--- a/kernel/bpf/bpf_lru_list.h
+++ b/kernel/bpf/bpf_lru_list.h
@@ -4,6 +4,7 @@
 #ifndef __BPF_LRU_LIST_H_
 #define __BPF_LRU_LIST_H_
 
+#include <linux/cache.h>
 #include <linux/list.h>
 #include <linux/spinlock_types.h>
 
-- 
2.36.0.464.gb9c8b46e94-goog


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

* [PATCH v5 2/2] mm: make minimum slab alignment a runtime property
  2022-04-27 19:58 [PATCH v5 1/2] printk: stop including cache.h from printk.h Peter Collingbourne
@ 2022-04-27 19:58 ` Peter Collingbourne
  2022-04-27 20:27   ` Andrew Morton
  2022-04-29  9:56   ` Vlastimil Babka
  2022-05-23 14:24 ` [PATCH v5 1/2] printk: stop including cache.h from printk.h Guenter Roeck
  1 sibling, 2 replies; 7+ messages in thread
From: Peter Collingbourne @ 2022-04-27 19:58 UTC (permalink / raw)
  To: Andrey Konovalov, Hyeonggon Yoo, Andrew Morton, Catalin Marinas
  Cc: Peter Collingbourne, Linux ARM, Linux Memory Management List,
	Linux Kernel Mailing List, vbabka, penberg, roman.gushchin,
	iamjoonsoo.kim, rientjes, Herbert Xu, Andrey Ryabinin,
	Alexander Potapenko, Dmitry Vyukov, kasan-dev, Eric Biederman,
	Kees Cook

When CONFIG_KASAN_HW_TAGS is enabled we currently increase the minimum
slab alignment to 16. This happens even if MTE is not supported in
hardware or disabled via kasan=off, which creates an unnecessary
memory overhead in those cases. Eliminate this overhead by making
the minimum slab alignment a runtime property and only aligning to
16 if KASAN is enabled at runtime.

On a DragonBoard 845c (non-MTE hardware) with a kernel built with
CONFIG_KASAN_HW_TAGS, waiting for quiescence after a full Android
boot I see the following Slab measurements in /proc/meminfo (median
of 3 reboots):

Before: 169020 kB
After:  167304 kB

Link: https://linux-review.googlesource.com/id/I752e725179b43b144153f4b6f584ceb646473ead
Signed-off-by: Peter Collingbourne <pcc@google.com>
Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com>
Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Acked-by: David Rientjes <rientjes@google.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
---
v4:
- add a dependent patch to fix the build with CONFIG_JUMP_LABEL disabled

v3:
- go back to ARCH_SLAB_MINALIGN
- revert changes to fs/binfmt_flat.c
- update arch_slab_minalign() comment to say that it must be a power of two

v2:
- use max instead of max_t in flat_stack_align()

 arch/arm64/include/asm/cache.h | 17 ++++++++++++-----
 include/linux/slab.h           | 12 ++++++++++++
 mm/slab.c                      |  7 +++----
 mm/slab_common.c               |  3 +--
 mm/slob.c                      |  6 +++---
 5 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/arch/arm64/include/asm/cache.h b/arch/arm64/include/asm/cache.h
index a074459f8f2f..22b22dc1b1b5 100644
--- a/arch/arm64/include/asm/cache.h
+++ b/arch/arm64/include/asm/cache.h
@@ -6,6 +6,7 @@
 #define __ASM_CACHE_H
 
 #include <asm/cputype.h>
+#include <asm/mte-def.h>
 
 #define CTR_L1IP_SHIFT		14
 #define CTR_L1IP_MASK		3
@@ -49,16 +50,22 @@
  */
 #define ARCH_DMA_MINALIGN	(128)
 
+#ifndef __ASSEMBLY__
+
+#include <linux/bitops.h>
+#include <linux/kasan-enabled.h>
+
 #ifdef CONFIG_KASAN_SW_TAGS
 #define ARCH_SLAB_MINALIGN	(1ULL << KASAN_SHADOW_SCALE_SHIFT)
 #elif defined(CONFIG_KASAN_HW_TAGS)
-#define ARCH_SLAB_MINALIGN	MTE_GRANULE_SIZE
+static inline size_t arch_slab_minalign(void)
+{
+	return kasan_hw_tags_enabled() ? MTE_GRANULE_SIZE :
+					 __alignof__(unsigned long long);
+}
+#define arch_slab_minalign() arch_slab_minalign()
 #endif
 
-#ifndef __ASSEMBLY__
-
-#include <linux/bitops.h>
-
 #define ICACHEF_ALIASING	0
 #define ICACHEF_VPIPT		1
 extern unsigned long __icache_flags;
diff --git a/include/linux/slab.h b/include/linux/slab.h
index 373b3ef99f4e..2c7190db4cc0 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -209,6 +209,18 @@ void kmem_dump_obj(void *object);
 #define ARCH_SLAB_MINALIGN __alignof__(unsigned long long)
 #endif
 
+/*
+ * Arches can define this function if they want to decide the minimum slab
+ * alignment at runtime. The value returned by the function must be a power
+ * of two and >= ARCH_SLAB_MINALIGN.
+ */
+#ifndef arch_slab_minalign
+static inline size_t arch_slab_minalign(void)
+{
+	return ARCH_SLAB_MINALIGN;
+}
+#endif
+
 /*
  * kmalloc and friends return ARCH_KMALLOC_MINALIGN aligned
  * pointers. kmem_cache_alloc and friends return ARCH_SLAB_MINALIGN
diff --git a/mm/slab.c b/mm/slab.c
index 0edb474edef1..97b756976c8b 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3009,10 +3009,9 @@ static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
 	objp += obj_offset(cachep);
 	if (cachep->ctor && cachep->flags & SLAB_POISON)
 		cachep->ctor(objp);
-	if (ARCH_SLAB_MINALIGN &&
-	    ((unsigned long)objp & (ARCH_SLAB_MINALIGN-1))) {
-		pr_err("0x%px: not aligned to ARCH_SLAB_MINALIGN=%d\n",
-		       objp, (int)ARCH_SLAB_MINALIGN);
+	if ((unsigned long)objp & (arch_slab_minalign() - 1)) {
+		pr_err("0x%px: not aligned to arch_slab_minalign()=%d\n", objp,
+		       (int)arch_slab_minalign());
 	}
 	return objp;
 }
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 2b3206a2c3b5..33cc49810a54 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -154,8 +154,7 @@ static unsigned int calculate_alignment(slab_flags_t flags,
 		align = max(align, ralign);
 	}
 
-	if (align < ARCH_SLAB_MINALIGN)
-		align = ARCH_SLAB_MINALIGN;
+	align = max_t(size_t, align, arch_slab_minalign());
 
 	return ALIGN(align, sizeof(void *));
 }
diff --git a/mm/slob.c b/mm/slob.c
index 40ea6e2d4ccd..3bd2669bd690 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -478,7 +478,7 @@ static __always_inline void *
 __do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller)
 {
 	unsigned int *m;
-	int minalign = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
+	int minalign = max_t(size_t, ARCH_KMALLOC_MINALIGN, arch_slab_minalign());
 	void *ret;
 
 	gfp &= gfp_allowed_mask;
@@ -555,7 +555,7 @@ void kfree(const void *block)
 
 	sp = virt_to_folio(block);
 	if (folio_test_slab(sp)) {
-		int align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
+		int align = max_t(size_t, ARCH_KMALLOC_MINALIGN, arch_slab_minalign());
 		unsigned int *m = (unsigned int *)(block - align);
 		slob_free(m, *m + align);
 	} else {
@@ -584,7 +584,7 @@ size_t __ksize(const void *block)
 	if (unlikely(!folio_test_slab(folio)))
 		return folio_size(folio);
 
-	align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
+	align = max_t(size_t, ARCH_KMALLOC_MINALIGN, arch_slab_minalign());
 	m = (unsigned int *)(block - align);
 	return SLOB_UNITS(*m) * SLOB_UNIT;
 }
-- 
2.36.0.464.gb9c8b46e94-goog


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

* Re: [PATCH v5 2/2] mm: make minimum slab alignment a runtime property
  2022-04-27 19:58 ` [PATCH v5 2/2] mm: make minimum slab alignment a runtime property Peter Collingbourne
@ 2022-04-27 20:27   ` Andrew Morton
  2022-04-28 21:55     ` Peter Collingbourne
  2022-04-29  9:56   ` Vlastimil Babka
  1 sibling, 1 reply; 7+ messages in thread
From: Andrew Morton @ 2022-04-27 20:27 UTC (permalink / raw)
  To: Peter Collingbourne
  Cc: Andrey Konovalov, Hyeonggon Yoo, Catalin Marinas, Linux ARM,
	Linux Memory Management List, Linux Kernel Mailing List, vbabka,
	penberg, roman.gushchin, iamjoonsoo.kim, rientjes, Herbert Xu,
	Andrey Ryabinin, Alexander Potapenko, Dmitry Vyukov, kasan-dev,
	Eric Biederman, Kees Cook

On Wed, 27 Apr 2022 12:58:20 -0700 Peter Collingbourne <pcc@google.com> wrote:

> When CONFIG_KASAN_HW_TAGS is enabled we currently increase the minimum
> slab alignment to 16. This happens even if MTE is not supported in
> hardware or disabled via kasan=off, which creates an unnecessary
> memory overhead in those cases. Eliminate this overhead by making
> the minimum slab alignment a runtime property and only aligning to
> 16 if KASAN is enabled at runtime.
> 
> On a DragonBoard 845c (non-MTE hardware) with a kernel built with
> CONFIG_KASAN_HW_TAGS, waiting for quiescence after a full Android
> boot I see the following Slab measurements in /proc/meminfo (median
> of 3 reboots):
> 
> ...
>
> --- a/mm/slab.c
> +++ b/mm/slab.c
> @@ -3009,10 +3009,9 @@ static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
>  	objp += obj_offset(cachep);
>  	if (cachep->ctor && cachep->flags & SLAB_POISON)
>  		cachep->ctor(objp);
> -	if (ARCH_SLAB_MINALIGN &&
> -	    ((unsigned long)objp & (ARCH_SLAB_MINALIGN-1))) {
> -		pr_err("0x%px: not aligned to ARCH_SLAB_MINALIGN=%d\n",
> -		       objp, (int)ARCH_SLAB_MINALIGN);
> +	if ((unsigned long)objp & (arch_slab_minalign() - 1)) {
> +		pr_err("0x%px: not aligned to arch_slab_minalign()=%d\n", objp,
> +		       (int)arch_slab_minalign());

printf/printk know about size_t.  Use %zu, no cast needed.  But...

>  	}
>  	return objp;
>  }
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index 2b3206a2c3b5..33cc49810a54 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -154,8 +154,7 @@ static unsigned int calculate_alignment(slab_flags_t flags,
>  		align = max(align, ralign);
>  	}
>  
> -	if (align < ARCH_SLAB_MINALIGN)
> -		align = ARCH_SLAB_MINALIGN;
> +	align = max_t(size_t, align, arch_slab_minalign());

max_t/min_t are nature's way of telling us "you screwed up the types".

So what type _is_ slab alignment?  size_t seems sensible, but the code
prefers unsigned int.  So how about we stick with that?


This compiles.  Still some max_t's in slob.c because I was too lazy to
go fix the type of ARCH_KMALLOC_MINALIGN.

Shrug, I don't know if we can be bothered.   You decide :)


 arch/arm64/include/asm/cache.h |    2 +-
 include/linux/slab.h           |    2 +-
 mm/slab.c                      |    4 ++--
 mm/slab_common.c               |    2 +-
 mm/slob.c                      |   16 +++++++++++-----
 5 files changed, 16 insertions(+), 10 deletions(-)

--- a/arch/arm64/include/asm/cache.h~mm-make-minimum-slab-alignment-a-runtime-property-fix
+++ a/arch/arm64/include/asm/cache.h
@@ -58,7 +58,7 @@
 #ifdef CONFIG_KASAN_SW_TAGS
 #define ARCH_SLAB_MINALIGN	(1ULL << KASAN_SHADOW_SCALE_SHIFT)
 #elif defined(CONFIG_KASAN_HW_TAGS)
-static inline size_t arch_slab_minalign(void)
+static inline unsigned int arch_slab_minalign(void)
 {
 	return kasan_hw_tags_enabled() ? MTE_GRANULE_SIZE :
 					 __alignof__(unsigned long long);
--- a/include/linux/slab.h~mm-make-minimum-slab-alignment-a-runtime-property-fix
+++ a/include/linux/slab.h
@@ -215,7 +215,7 @@ void kmem_dump_obj(void *object);
  * of two and >= ARCH_SLAB_MINALIGN.
  */
 #ifndef arch_slab_minalign
-static inline size_t arch_slab_minalign(void)
+static inline unsigned int arch_slab_minalign(void)
 {
 	return ARCH_SLAB_MINALIGN;
 }
--- a/mm/slab.c~mm-make-minimum-slab-alignment-a-runtime-property-fix
+++ a/mm/slab.c
@@ -3010,8 +3010,8 @@ static void *cache_alloc_debugcheck_afte
 	if (cachep->ctor && cachep->flags & SLAB_POISON)
 		cachep->ctor(objp);
 	if ((unsigned long)objp & (arch_slab_minalign() - 1)) {
-		pr_err("0x%px: not aligned to arch_slab_minalign()=%d\n", objp,
-		       (int)arch_slab_minalign());
+		pr_err("0x%px: not aligned to arch_slab_minalign()=%u\n", objp,
+		       arch_slab_minalign());
 	}
 	return objp;
 }
--- a/mm/slab_common.c~mm-make-minimum-slab-alignment-a-runtime-property-fix
+++ a/mm/slab_common.c
@@ -154,7 +154,7 @@ static unsigned int calculate_alignment(
 		align = max(align, ralign);
 	}
 
-	align = max_t(size_t, align, arch_slab_minalign());
+	align = max(align, arch_slab_minalign());
 
 	return ALIGN(align, sizeof(void *));
 }
--- a/mm/slob.c~mm-make-minimum-slab-alignment-a-runtime-property-fix
+++ a/mm/slob.c
@@ -478,9 +478,11 @@ static __always_inline void *
 __do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller)
 {
 	unsigned int *m;
-	int minalign = max_t(size_t, ARCH_KMALLOC_MINALIGN, arch_slab_minalign());
+	unsigned int minalign;
 	void *ret;
 
+	minalign = max_t(unsigned int, ARCH_KMALLOC_MINALIGN,
+			 arch_slab_minalign());
 	gfp &= gfp_allowed_mask;
 
 	might_alloc(gfp);
@@ -493,7 +495,7 @@ __do_kmalloc_node(size_t size, gfp_t gfp
 		 * kmalloc()'d objects.
 		 */
 		if (is_power_of_2(size))
-			align = max(minalign, (int) size);
+			align = max_t(unsigned int, minalign, size);
 
 		if (!size)
 			return ZERO_SIZE_PTR;
@@ -555,8 +557,11 @@ void kfree(const void *block)
 
 	sp = virt_to_folio(block);
 	if (folio_test_slab(sp)) {
-		int align = max_t(size_t, ARCH_KMALLOC_MINALIGN, arch_slab_minalign());
+		unsigned int align = max_t(unsigned int,
+					   ARCH_KMALLOC_MINALIGN,
+					   arch_slab_minalign());
 		unsigned int *m = (unsigned int *)(block - align);
+
 		slob_free(m, *m + align);
 	} else {
 		unsigned int order = folio_order(sp);
@@ -573,7 +578,7 @@ EXPORT_SYMBOL(kfree);
 size_t __ksize(const void *block)
 {
 	struct folio *folio;
-	int align;
+	unsigned int align;
 	unsigned int *m;
 
 	BUG_ON(!block);
@@ -584,7 +589,8 @@ size_t __ksize(const void *block)
 	if (unlikely(!folio_test_slab(folio)))
 		return folio_size(folio);
 
-	align = max_t(size_t, ARCH_KMALLOC_MINALIGN, arch_slab_minalign());
+	align = max_t(unsigned int, ARCH_KMALLOC_MINALIGN,
+		      arch_slab_minalign());
 	m = (unsigned int *)(block - align);
 	return SLOB_UNITS(*m) * SLOB_UNIT;
 }
_


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

* Re: [PATCH v5 2/2] mm: make minimum slab alignment a runtime property
  2022-04-27 20:27   ` Andrew Morton
@ 2022-04-28 21:55     ` Peter Collingbourne
  0 siblings, 0 replies; 7+ messages in thread
From: Peter Collingbourne @ 2022-04-28 21:55 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Andrey Konovalov, Hyeonggon Yoo, Catalin Marinas, Linux ARM,
	Linux Memory Management List, Linux Kernel Mailing List,
	Vlastimil Babka, Pekka Enberg, roman.gushchin, Joonsoo Kim,
	David Rientjes, Herbert Xu, Andrey Ryabinin, Alexander Potapenko,
	Dmitry Vyukov, kasan-dev, Eric Biederman, Kees Cook

On Wed, Apr 27, 2022 at 1:27 PM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Wed, 27 Apr 2022 12:58:20 -0700 Peter Collingbourne <pcc@google.com> wrote:
>
> > When CONFIG_KASAN_HW_TAGS is enabled we currently increase the minimum
> > slab alignment to 16. This happens even if MTE is not supported in
> > hardware or disabled via kasan=off, which creates an unnecessary
> > memory overhead in those cases. Eliminate this overhead by making
> > the minimum slab alignment a runtime property and only aligning to
> > 16 if KASAN is enabled at runtime.
> >
> > On a DragonBoard 845c (non-MTE hardware) with a kernel built with
> > CONFIG_KASAN_HW_TAGS, waiting for quiescence after a full Android
> > boot I see the following Slab measurements in /proc/meminfo (median
> > of 3 reboots):
> >
> > ...
> >
> > --- a/mm/slab.c
> > +++ b/mm/slab.c
> > @@ -3009,10 +3009,9 @@ static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
> >       objp += obj_offset(cachep);
> >       if (cachep->ctor && cachep->flags & SLAB_POISON)
> >               cachep->ctor(objp);
> > -     if (ARCH_SLAB_MINALIGN &&
> > -         ((unsigned long)objp & (ARCH_SLAB_MINALIGN-1))) {
> > -             pr_err("0x%px: not aligned to ARCH_SLAB_MINALIGN=%d\n",
> > -                    objp, (int)ARCH_SLAB_MINALIGN);
> > +     if ((unsigned long)objp & (arch_slab_minalign() - 1)) {
> > +             pr_err("0x%px: not aligned to arch_slab_minalign()=%d\n", objp,
> > +                    (int)arch_slab_minalign());
>
> printf/printk know about size_t.  Use %zu, no cast needed.  But...
>
> >       }
> >       return objp;
> >  }
> > diff --git a/mm/slab_common.c b/mm/slab_common.c
> > index 2b3206a2c3b5..33cc49810a54 100644
> > --- a/mm/slab_common.c
> > +++ b/mm/slab_common.c
> > @@ -154,8 +154,7 @@ static unsigned int calculate_alignment(slab_flags_t flags,
> >               align = max(align, ralign);
> >       }
> >
> > -     if (align < ARCH_SLAB_MINALIGN)
> > -             align = ARCH_SLAB_MINALIGN;
> > +     align = max_t(size_t, align, arch_slab_minalign());
>
> max_t/min_t are nature's way of telling us "you screwed up the types".
>
> So what type _is_ slab alignment?  size_t seems sensible, but the code
> prefers unsigned int.  So how about we stick with that?
>
>
> This compiles.  Still some max_t's in slob.c because I was too lazy to
> go fix the type of ARCH_KMALLOC_MINALIGN.
>
> Shrug, I don't know if we can be bothered.   You decide :)

Hi Andrew,

No strong opinions here. I'm happy with the fixup that you added to
your tree on top of my patch.

Peter

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

* Re: [PATCH v5 2/2] mm: make minimum slab alignment a runtime property
  2022-04-27 19:58 ` [PATCH v5 2/2] mm: make minimum slab alignment a runtime property Peter Collingbourne
  2022-04-27 20:27   ` Andrew Morton
@ 2022-04-29  9:56   ` Vlastimil Babka
  1 sibling, 0 replies; 7+ messages in thread
From: Vlastimil Babka @ 2022-04-29  9:56 UTC (permalink / raw)
  To: Peter Collingbourne, Andrey Konovalov, Hyeonggon Yoo,
	Andrew Morton, Catalin Marinas
  Cc: Linux ARM, Linux Memory Management List,
	Linux Kernel Mailing List, penberg, roman.gushchin,
	iamjoonsoo.kim, rientjes, Herbert Xu, Andrey Ryabinin,
	Alexander Potapenko, Dmitry Vyukov, kasan-dev, Eric Biederman,
	Kees Cook

On 4/27/22 21:58, Peter Collingbourne wrote:
> When CONFIG_KASAN_HW_TAGS is enabled we currently increase the minimum
> slab alignment to 16. This happens even if MTE is not supported in
> hardware or disabled via kasan=off, which creates an unnecessary
> memory overhead in those cases. Eliminate this overhead by making
> the minimum slab alignment a runtime property and only aligning to
> 16 if KASAN is enabled at runtime.
> 
> On a DragonBoard 845c (non-MTE hardware) with a kernel built with
> CONFIG_KASAN_HW_TAGS, waiting for quiescence after a full Android
> boot I see the following Slab measurements in /proc/meminfo (median
> of 3 reboots):
> 
> Before: 169020 kB
> After:  167304 kB
> 
> Link: https://linux-review.googlesource.com/id/I752e725179b43b144153f4b6f584ceb646473ead
> Signed-off-by: Peter Collingbourne <pcc@google.com>
> Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com>
> Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
> Tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
> Acked-by: David Rientjes <rientjes@google.com>
> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

Acked-by: Vlastimil Babka <vbabka@suse.cz>
Andrew's fixup LGTM too.

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

* Re: [PATCH v5 1/2] printk: stop including cache.h from printk.h
  2022-04-27 19:58 [PATCH v5 1/2] printk: stop including cache.h from printk.h Peter Collingbourne
  2022-04-27 19:58 ` [PATCH v5 2/2] mm: make minimum slab alignment a runtime property Peter Collingbourne
@ 2022-05-23 14:24 ` Guenter Roeck
  2022-05-27 12:26   ` Michael Ellerman
  1 sibling, 1 reply; 7+ messages in thread
From: Guenter Roeck @ 2022-05-23 14:24 UTC (permalink / raw)
  To: Peter Collingbourne
  Cc: Andrey Konovalov, Hyeonggon Yoo, Andrew Morton, Catalin Marinas,
	Linux ARM, Linux Memory Management List,
	Linux Kernel Mailing List, vbabka, penberg, roman.gushchin,
	iamjoonsoo.kim, rientjes, Herbert Xu, Andrey Ryabinin,
	Alexander Potapenko, Dmitry Vyukov, kasan-dev, Eric Biederman,
	Kees Cook

On Wed, Apr 27, 2022 at 12:58:19PM -0700, Peter Collingbourne wrote:
> An inclusion of cache.h in printk.h was added in 2014 in
> commit c28aa1f0a847 ("printk/cache: mark printk_once test variable
> __read_mostly") in order to bring in the definition of __read_mostly. The
> usage of __read_mostly was later removed in commit 3ec25826ae33 ("printk:
> Tie printk_once / printk_deferred_once into .data.once for reset")
> which made the inclusion of cache.h unnecessary, so remove it.
> 
> We have a small amount of code that depended on the inclusion of cache.h
> from printk.h; fix that code to include the appropriate header.
> 
> This fixes a circular inclusion on arm64 (linux/printk.h -> linux/cache.h
> -> asm/cache.h -> linux/kasan-enabled.h -> linux/static_key.h ->
> linux/jump_label.h -> linux/bug.h -> asm/bug.h -> linux/printk.h) that
> would otherwise be introduced by the next patch.
> 
> Build tested using {allyesconfig,defconfig} x {arm64,x86_64}.

But not powerpc:corenet64_smp_defconfig, where it results in lots of
build errors such as

powerpc64-linux-ld: fs/freevxfs/vxfs_fshead.o:(.bss+0x0):
	multiple definition of `____cacheline_aligned';
	fs/freevxfs/vxfs_bmap.o:(.bss+0x0): first defined here

Reverting this patch fixes the problem.

Guenter

---
# bad: [18ecd30af1a8402c162cca1bd58771c0e5be7815] Add linux-next specific files for 20220520
# good: [42226c989789d8da4af1de0c31070c96726d990c] Linux 5.18-rc7
git bisect start 'HEAD' 'v5.18-rc7'
# good: [f9b63740b666dd9887eb0282d21b5f65bb0cadd0] Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
git bisect good f9b63740b666dd9887eb0282d21b5f65bb0cadd0
# good: [1f5eb3e76303572f0318e8c50da51c516580aa03] Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git
git bisect good 1f5eb3e76303572f0318e8c50da51c516580aa03
# good: [4c1d9cc0363691893ef94fa0d798faca013e27d3] Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
git bisect good 4c1d9cc0363691893ef94fa0d798faca013e27d3
# good: [a3204ed0fc565fc76901c67dfc8e04c91a5c8ea4] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock.git
git bisect good a3204ed0fc565fc76901c67dfc8e04c91a5c8ea4
# bad: [ca228447682904bc749c0702695681543b5dc709] Merge branch 'mm-nonmm-unstable' into mm-everything
git bisect bad ca228447682904bc749c0702695681543b5dc709
# bad: [c0eeeb02d9df878c71a457008900b650d94bd0d9] selftests/uffd: enable uffd-wp for shmem/hugetlbfs
git bisect bad c0eeeb02d9df878c71a457008900b650d94bd0d9
# good: [0a7a0f6f7f3679c906fc55e3805c1d5e2c566f55] hugetlb: fix wrong use of nr_online_nodes
git bisect good 0a7a0f6f7f3679c906fc55e3805c1d5e2c566f55
# good: [c9fe66560bf2dc7d109754414e309888cb8c9ba9] mm/mprotect: do not flush when not required architecturally
git bisect good c9fe66560bf2dc7d109754414e309888cb8c9ba9
# bad: [97d482f4592fde2322c319f07bc54f3a0d37861c] mm/damon/sysfs: reuse damon_set_regions() for regions setting
git bisect bad 97d482f4592fde2322c319f07bc54f3a0d37861c
# good: [54205e9c5425049aef1bc7a812f890f00b5f79c7] mm: rmap: move the cache flushing to the correct place for hugetlb PMD sharing
git bisect good 54205e9c5425049aef1bc7a812f890f00b5f79c7
# bad: [9994715333515e82865e533250e488496b9742f4] selftest/vm: test that mremap fails on non-existent vma
git bisect bad 9994715333515e82865e533250e488496b9742f4
# bad: [d949a8155d139aa890795b802004a196b7f00598] mm: make minimum slab alignment a runtime property
git bisect bad d949a8155d139aa890795b802004a196b7f00598
# bad: [534aa1dc975ac883ad89110534585a96630802a0] printk: stop including cache.h from printk.h
git bisect bad 534aa1dc975ac883ad89110534585a96630802a0
# good: [dfc7ab57560da385f705b28e2bf50e3b90444a6b] mm: rmap: use flush_cache_range() to flush cache for hugetlb pages
git bisect good dfc7ab57560da385f705b28e2bf50e3b90444a6b
# first bad commit: [534aa1dc975ac883ad89110534585a96630802a0] printk: stop including cache.h from printk.h

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

* Re: [PATCH v5 1/2] printk: stop including cache.h from printk.h
  2022-05-23 14:24 ` [PATCH v5 1/2] printk: stop including cache.h from printk.h Guenter Roeck
@ 2022-05-27 12:26   ` Michael Ellerman
  0 siblings, 0 replies; 7+ messages in thread
From: Michael Ellerman @ 2022-05-27 12:26 UTC (permalink / raw)
  To: Guenter Roeck, Peter Collingbourne; +Cc: Linux Kernel Mailing List

Guenter Roeck <linux@roeck-us.net> writes:
> On Wed, Apr 27, 2022 at 12:58:19PM -0700, Peter Collingbourne wrote:
>> An inclusion of cache.h in printk.h was added in 2014 in
>> commit c28aa1f0a847 ("printk/cache: mark printk_once test variable
>> __read_mostly") in order to bring in the definition of __read_mostly. The
>> usage of __read_mostly was later removed in commit 3ec25826ae33 ("printk:
>> Tie printk_once / printk_deferred_once into .data.once for reset")
>> which made the inclusion of cache.h unnecessary, so remove it.
>> 
>> We have a small amount of code that depended on the inclusion of cache.h
>> from printk.h; fix that code to include the appropriate header.
>> 
>> This fixes a circular inclusion on arm64 (linux/printk.h -> linux/cache.h
>> -> asm/cache.h -> linux/kasan-enabled.h -> linux/static_key.h ->
>> linux/jump_label.h -> linux/bug.h -> asm/bug.h -> linux/printk.h) that
>> would otherwise be introduced by the next patch.
>> 
>> Build tested using {allyesconfig,defconfig} x {arm64,x86_64}.
>
> But not powerpc:corenet64_smp_defconfig, where it results in lots of
> build errors such as
>
> powerpc64-linux-ld: fs/freevxfs/vxfs_fshead.o:(.bss+0x0):
> 	multiple definition of `____cacheline_aligned';
> 	fs/freevxfs/vxfs_bmap.o:(.bss+0x0): first defined here

I sent a patch to fix it, and will merge the fix via my tree:

http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20220527112035.2842155-1-mpe@ellerman.id.au/

cheers

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

end of thread, other threads:[~2022-05-27 12:40 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-27 19:58 [PATCH v5 1/2] printk: stop including cache.h from printk.h Peter Collingbourne
2022-04-27 19:58 ` [PATCH v5 2/2] mm: make minimum slab alignment a runtime property Peter Collingbourne
2022-04-27 20:27   ` Andrew Morton
2022-04-28 21:55     ` Peter Collingbourne
2022-04-29  9:56   ` Vlastimil Babka
2022-05-23 14:24 ` [PATCH v5 1/2] printk: stop including cache.h from printk.h Guenter Roeck
2022-05-27 12:26   ` Michael Ellerman

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).