• Sebastian Andrzej Siewior's avatar
    locking: Allow to include asm/spinlock_types.h from linux/spinlock_types_raw.h · 77993b59
    Sebastian Andrzej Siewior authored
    The printk header file includes ratelimit_types.h for its __ratelimit()
    based usage. It is required for the static initializer used in
    printk_ratelimited(). It uses a raw_spinlock_t and includes the
    spinlock_types.h.
    
    PREEMPT_RT substitutes spinlock_t with a rtmutex based implementation and so
    its spinlock_t implmentation (provided by spinlock_rt.h) includes rtmutex.h and
    atomic.h which leads to recursive includes where defines are missing.
    
    By including only the raw_spinlock_t defines it avoids the atomic.h
    related includes at this stage.
    
    An example on powerpc:
    
    |  CALL    scripts/atomic/check-atomics.sh
    |In file included from include/linux/bug.h:5,
    |                 from include/linux/page-flags.h:10,
    |                 from kernel/bounds.c:10:
    |arch/powerpc/include/asm/page_32.h: In function ‘clear_page’:
    |arch/powerpc/include/asm/bug.h:87:4: error: implicit declaration of function â=80=98__WARNâ=80=99 [-Werror=3Dimplicit-function-declaration]
    |   87 |    __WARN();    \
    |      |    ^~~~~~
    |arch/powerpc/include/asm/page_32.h:48:2: note: in expansion of macro ‘WARN_ONâ€=99
    |   48 |  WARN_ON((unsigned long)addr & (L1_CACHE_BYTES - 1));
    |      |  ^~~~~~~
    |arch/powerpc/include/asm/bug.h:58:17: error: invalid application of ‘sizeofâ€=99 to incomplete type ‘struct bug_entryâ€=99
    |   58 |     "i" (sizeof(struct bug_entry)), \
    |      |                 ^~~~~~
    |arch/powerpc/include/asm/bug.h:89:3: note: in expansion of macro ‘BUG_ENTRYâ€=99
    |   89 |   BUG_ENTRY(PPC_TLNEI " %4, 0",   \
    |      |   ^~~~~~~~~
    |arch/powerpc/include/asm/page_32.h:48:2: note: in expansion of macro ‘WARN_ONâ€=99
    |   48 |  WARN_ON((unsigned long)addr & (L1_CACHE_BYTES - 1));
    |      |  ^~~~~~~
    |In file included from arch/powerpc/include/asm/ptrace.h:298,
    |                 from arch/powerpc/include/asm/hw_irq.h:12,
    |                 from arch/powerpc/include/asm/irqflags.h:12,
    |                 from include/linux/irqflags.h:16,
    |                 from include/asm-generic/cmpxchg-local.h:6,
    |                 from arch/powerpc/include/asm/cmpxchg.h:526,
    |                 from arch/powerpc/include/asm/atomic.h:11,
    |                 from include/linux/atomic.h:7,
    |                 from include/linux/rwbase_rt.h:6,
    |                 from include/linux/rwlock_types.h:55,
    |                 from include/linux/spinlock_types.h:74,
    |                 from include/linux/ratelimit_types.h:7,
    |                 from include/linux/printk.h:10,
    |                 from include/asm-generic/bug.h:22,
    |                 from arch/powerpc/include/asm/bug.h:109,
    |                 from include/linux/bug.h:5,
    |                 from include/linux/page-flags.h:10,
    |                 from kernel/bounds.c:10:
    |include/linux/thread_info.h: In function â=80=98copy_overflowâ=80=99:
    |include/linux/thread_info.h:210:2: error: implicit declaration of function â=80=98WARNâ=80=99 [-Werror=3Dimplicit-function-declaration]
    |  210 |  WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
    |      |  ^~~~
    
    The WARN / BUG include pulls in printk.h and then ptrace.h expects WARN
    (from bug.h) which is not yet complete. Even hw_irq.h has WARN_ON()
    statements.
    
    On POWERPC64 there are missing atomic64 defines while building 32bit
    VDSO:
    |  VDSO32C arch/powerpc/kernel/vdso32/vgettimeofday.o
    |In file included from include/linux/atomic.h:80,
    |                 from include/linux/rwbase_rt.h:6,
    |                 from include/linux/rwlock_types.h:55,
    |                 from include/linux/spinlock_types.h:74,
    |                 from include/linux/ratelimit_types.h:7,
    |                 from include/linux/printk.h:10,
    |                 from include/linux/kernel.h:19,
    |                 from arch/powerpc/include/asm/page.h:11,
    |                 from arch/powerpc/include/asm/vdso/gettimeofday.h:5,
    |                 from include/vdso/datapage.h:137,
    |                 from lib/vdso/gettimeofday.c:5,
    |                 from <command-line>:
    |include/linux/atomic-arch-fallback.h: In function ‘arch_atomic64_incâ€=99:
    |include/linux/atomic-arch-fallback.h:1447:2: error: implicit declaration of function ‘arch_atomic64_add’; did you mean ‘arch_atomic_add’? [-Werror=3Dimpl
    |icit-function-declaration]
    | 1447 |  arch_atomic64_add(1, v);
    |      |  ^~~~~~~~~~~~~~~~~
    |      |  arch_atomic_add
    
    The generic fallback is not included, atomics itself are not used. If
    kernel.h does not include printk.h then it comes later from the bug.h
    include.
    
    Allow asm/spinlock_types.h to be included from
    linux/spinlock_types_raw.h.
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20211129174654.668506-12-bigeasy@linutronix.de
    77993b59
spinlock_types.h 534 Bytes