mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 14:11:42 +02:00
mm/percpu: conditionally define _shared_alloc_tag via CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU
Recently discovered this entry while checking kallsyms on ARM64: ffff800083e509c0 D _shared_alloc_tag If ARCH_NEEDS_WEAK_PER_CPU is not defined(it is only defined for s390 and alpha architectures), there's no need to statically define the percpu variable _shared_alloc_tag. Therefore, we need to implement isolation for this purpose. When building the core kernel code for s390 or alpha architectures, ARCH_NEEDS_WEAK_PER_CPU remains undefined (as it is gated by #if defined(MODULE)). However, when building modules for these architectures, the macro is explicitly defined. Therefore, we remove all instances of ARCH_NEEDS_WEAK_PER_CPU from the code and introduced CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU to replace the relevant logic. We can now conditionally define the perpcu variable _shared_alloc_tag based on CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU. This allows architectures (such as s390/alpha) that require weak definitions for percpu variables in modules to include the definition, while others can omit it via compile-time exclusion. Link: https://lkml.kernel.org/r/20250618015809.1235761-1-hao.ge@linux.dev Signed-off-by: Hao Ge <gehao@kylinos.cn> Suggested-by: Suren Baghdasaryan <surenb@google.com> Acked-by: Alexander Gordeev <agordeev@linux.ibm.com> [s390] Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Cc: Chistoph Lameter <cl@linux.com> Cc: Christian Borntraeger <borntraeger@linux.ibm.com> Cc: David Hildenbrand <david@redhat.com> Cc: Dennis Zhou <dennis@kernel.org> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Kent Overstreet <kent.overstreet@linux.dev> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Matt Turner <mattst88@gmail.com> Cc: Richard Henderson <richard.henderson@linaro.org> Cc: Sven Schnelle <svens@linux.ibm.com> Cc: Tejun Heo <tj@kernel.org> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
cf34cfbf17
commit
59b5ed409d
8 changed files with 22 additions and 12 deletions
|
@ -7,6 +7,7 @@ config ALPHA
|
|||
select ARCH_HAS_DMA_OPS if PCI
|
||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||
select ARCH_MODULE_NEEDS_WEAK_PER_CPU if SMP
|
||||
select ARCH_NO_PREEMPT
|
||||
select ARCH_NO_SG_CHAIN
|
||||
select ARCH_USE_CMPXCHG_LOCKREF
|
||||
|
|
|
@ -9,10 +9,9 @@
|
|||
* way above 4G.
|
||||
*
|
||||
* Always use weak definitions for percpu variables in modules.
|
||||
* Therefore, we have enabled CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU
|
||||
* in the Kconfig.
|
||||
*/
|
||||
#if defined(MODULE) && defined(CONFIG_SMP)
|
||||
#define ARCH_NEEDS_WEAK_PER_CPU
|
||||
#endif
|
||||
|
||||
#include <asm-generic/percpu.h>
|
||||
|
||||
|
|
|
@ -132,6 +132,7 @@ config S390
|
|||
select ARCH_INLINE_WRITE_UNLOCK_IRQ
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
|
||||
select ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE
|
||||
select ARCH_MODULE_NEEDS_WEAK_PER_CPU
|
||||
select ARCH_STACKWALK
|
||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||
select ARCH_SUPPORTS_DEBUG_PAGEALLOC
|
||||
|
|
|
@ -16,10 +16,9 @@
|
|||
* For 64 bit module code, the module may be more than 4G above the
|
||||
* per cpu area, use weak definitions to force the compiler to
|
||||
* generate external references.
|
||||
* Therefore, we have enabled CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU
|
||||
* in the Kconfig.
|
||||
*/
|
||||
#if defined(MODULE)
|
||||
#define ARCH_NEEDS_WEAK_PER_CPU
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We use a compare-and-swap loop since that uses less cpu cycles than
|
||||
|
|
|
@ -88,7 +88,7 @@ static inline struct alloc_tag *ct_to_alloc_tag(struct codetag *ct)
|
|||
return container_of(ct, struct alloc_tag, ct);
|
||||
}
|
||||
|
||||
#ifdef ARCH_NEEDS_WEAK_PER_CPU
|
||||
#if defined(CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU) && defined(MODULE)
|
||||
/*
|
||||
* When percpu variables are required to be defined as weak, static percpu
|
||||
* variables can't be used inside a function (see comments for DECLARE_PER_CPU_SECTION).
|
||||
|
@ -102,7 +102,7 @@ DECLARE_PER_CPU(struct alloc_tag_counters, _shared_alloc_tag);
|
|||
.ct = CODE_TAG_INIT, \
|
||||
.counters = &_shared_alloc_tag };
|
||||
|
||||
#else /* ARCH_NEEDS_WEAK_PER_CPU */
|
||||
#else /* CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU && MODULE */
|
||||
|
||||
#ifdef MODULE
|
||||
|
||||
|
@ -123,7 +123,7 @@ DECLARE_PER_CPU(struct alloc_tag_counters, _shared_alloc_tag);
|
|||
|
||||
#endif /* MODULE */
|
||||
|
||||
#endif /* ARCH_NEEDS_WEAK_PER_CPU */
|
||||
#endif /* CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU && MODULE */
|
||||
|
||||
DECLARE_STATIC_KEY_MAYBE(CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT,
|
||||
mem_alloc_profiling_key);
|
||||
|
|
|
@ -63,14 +63,15 @@
|
|||
* 1. The symbol must be globally unique, even the static ones.
|
||||
* 2. Static percpu variables cannot be defined inside a function.
|
||||
*
|
||||
* Archs which need weak percpu definitions should define
|
||||
* ARCH_NEEDS_WEAK_PER_CPU in asm/percpu.h when necessary.
|
||||
* Archs which need weak percpu definitions should set
|
||||
* CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU when necessary.
|
||||
*
|
||||
* To ensure that the generic code observes the above two
|
||||
* restrictions, if CONFIG_DEBUG_FORCE_WEAK_PER_CPU is set weak
|
||||
* definition is used for all cases.
|
||||
*/
|
||||
#if defined(ARCH_NEEDS_WEAK_PER_CPU) || defined(CONFIG_DEBUG_FORCE_WEAK_PER_CPU)
|
||||
#if (defined(CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU) && defined(MODULE)) || \
|
||||
defined(CONFIG_DEBUG_FORCE_WEAK_PER_CPU)
|
||||
/*
|
||||
* __pcpu_scope_* dummy variable is used to enforce scope. It
|
||||
* receives the static modifier when it's used in front of
|
||||
|
|
|
@ -25,8 +25,10 @@ static bool mem_profiling_support;
|
|||
|
||||
static struct codetag_type *alloc_tag_cttype;
|
||||
|
||||
#ifdef CONFIG_ARCH_MODULE_NEEDS_WEAK_PER_CPU
|
||||
DEFINE_PER_CPU(struct alloc_tag_counters, _shared_alloc_tag);
|
||||
EXPORT_SYMBOL(_shared_alloc_tag);
|
||||
#endif
|
||||
|
||||
DEFINE_STATIC_KEY_MAYBE(CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT,
|
||||
mem_alloc_profiling_key);
|
||||
|
|
|
@ -933,6 +933,13 @@ config ARCH_SUPPORTS_PUD_PFNMAP
|
|||
def_bool y
|
||||
depends on ARCH_SUPPORTS_HUGE_PFNMAP && HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
|
||||
|
||||
#
|
||||
# Architectures that always use weak definitions for percpu
|
||||
# variables in modules should set this.
|
||||
#
|
||||
config ARCH_MODULE_NEEDS_WEAK_PER_CPU
|
||||
bool
|
||||
|
||||
#
|
||||
# UP and nommu archs use km based percpu allocator
|
||||
#
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue