Re: linux-next: build failure after merge of the tip tree

Peter Zijlstra
2024-11-07T10:34:19Z

[-- Attachment #1: Type: text/plain, Size: 3834 bytes --]

On Thu, Nov 07, 2024 at 06:24:11PM +1100, Stephen Rothwell wrote:
> Hi all,
>
> After merging the tip tree, today's linux-next build (x86_64 allmodconfig)
> failed like this:
>
> In file included from rust/helpers/helpers.c:26:
> rust/helpers/spinlock.c: In function 'rust_helper___spin_lock_init':
> rust/helpers/spinlock.c:10:30: error: implicit declaration of function 'spinlock_check'; did you mean 'spin_lock_bh'? [-Wimplicit-function-declaration]
> 10 | __raw_spin_lock_init(spinlock_check(lock), name, key, LD_WAIT_CONFIG);
> | ^~~~~~~~~~~~~~
> | spin_lock_bh
> rust/helpers/spinlock.c:10:30: error: passing argument 1 of '__raw_spin_lock_init' makes pointer from integer without a cast [-Wint-conversion]
> 10 | __raw_spin_lock_init(spinlock_check(lock), name, key, LD_WAIT_CONFIG);
> | ^~~~~~~~~~~~~~~~~~~~
> | |
> | int
> In file included from include/linux/wait.h:9,
> from include/linux/wait_bit.h:8,
> from include/linux/fs.h:6,
> from include/linux/highmem.h:5,
> from include/linux/bvec.h:10,
> from include/linux/blk_types.h:10,
> from include/linux/blkdev.h:9,
> from include/linux/blk-mq.h:5,
> from rust/helpers/blk.c:3,
> from rust/helpers/helpers.c:10:
> include/linux/spinlock.h:101:52: note: expected 'raw_spinlock_t *' {aka 'struct raw_spinlock *'} but argument is of type 'int'
> 101 | extern void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
> | ~~~~~~~~~~~~~~~~^~~~
>

So I can't get RUST=y, even though make rustavailable is happy.

make LLVM=-19 allmodconfig does not get me RUST=y

I started out with tip/master, tried adding rust-next, then kbuild-next
gave up and tried next/master. Nada.

Anyway, I think the above needs something like this:

---
diff --git a/rust/helpers/spinlock.c b/rust/helpers/spinlock.c
index b7b0945e8b3c..5804a6062eb1 100644
--- a/rust/helpers/spinlock.c
+++ b/rust/helpers/spinlock.c
@@ -5,11 +5,16 @@
void rust_helper___spin_lock_init(spinlock_t *lock, const char *name,
struct lock_class_key *key)
{
+#ifndef CONFIG_PREEMPT_RT
#ifdef CONFIG_DEBUG_SPINLOCK
__raw_spin_lock_init(spinlock_check(lock), name, key, LD_WAIT_CONFIG);
#else
spin_lock_init(lock);
#endif
+#else
+ rt_mutex_base_init(&lock->lock);
+ __rt_spin_lock_init(lock, name, key, false);
+#endif
}

void rust_helper_spin_lock(spinlock_t *lock)

> Probably caused by commit
>
> 35772d627b55 ("sched: Enable PREEMPT_DYNAMIC for PREEMPT_RT")
>
> at least reverting commit
>
> dafc2d42c0a6 ("Merge branch into tip/master: 'sched/core'")
>
> makes the build work again for me - so I have done that for today.
>
> Without the revert CONFIG_PREEMPT_RT=y, after the revert it is not set
> and spinlock_check is only defined for !defined(CONFIG_PREEMPT_RT).

Right, that moved PREEMPT_RT out of the preemption choice. Now I'm not
sure we want it =y for all{yes,mod}config. Is the below the right
incantation to avoid this?

---
diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
index 7c1b29a3a491..54ea59ff8fbe 100644
--- a/kernel/Kconfig.preempt
+++ b/kernel/Kconfig.preempt
@@ -88,7 +88,7 @@ endchoice

config PREEMPT_RT
bool "Fully Preemptible Kernel (Real-Time)"
- depends on EXPERT && ARCH_SUPPORTS_RT
+ depends on EXPERT && ARCH_SUPPORTS_RT && !COMPILE_TEST
select PREEMPTION
help
This option turns the kernel into a real-time kernel by replacing

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]