]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
s390/smp: Mark pcpu_delegate() and smp_call_ipl_cpu() as __noreturn
authorThorsten Blum <thorsten.blum@linux.dev>
Thu, 30 Oct 2025 13:42:41 +0000 (14:42 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Thu, 6 Nov 2025 13:17:28 +0000 (14:17 +0100)
pcpu_delegate() never returns to its caller. If the target CPU is the
current CPU, it calls __pcpu_delegate(), whose delegate function is not
supposed to return. In any case, even if __pcpu_delegate() unexpectedly
returns, pcpu_delegate() sends SIGP_STOP to the current CPU and waits
in an infinite loop. Annotate pcpu_delegate() with the __noreturn
attribute to improve compiler optimizations.

Also annotate smp_call_ipl_cpu() accordingly since it always calls
pcpu_delegate().

[hca: Merge two patches from Thorsten Blum]

Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/smp.h
arch/s390/kernel/smp.c

index 03f4d01664f8affe3c4119151afd49e227ff2144..fb2bdbf35da59211bb6be05c0b0deda7be68a925 100644 (file)
@@ -43,7 +43,7 @@ extern int __cpu_up(unsigned int cpu, struct task_struct *tidle);
 extern void arch_send_call_function_single_ipi(int cpu);
 extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
 
-extern void smp_call_ipl_cpu(void (*func)(void *), void *);
+extern void __noreturn smp_call_ipl_cpu(void (*func)(void *), void *data);
 extern void smp_emergency_stop(void);
 
 extern int smp_find_processor_id(u16 address);
index 70df4ca5d4436c11e3330048c58ddb7fa3aeb753..b0da25159f06c92c5e3328d792df0eb882164e64 100644 (file)
@@ -305,9 +305,9 @@ static void __pcpu_delegate(pcpu_delegate_fn *func, void *data)
        func(data);     /* should not return */
 }
 
-static void pcpu_delegate(struct pcpu *pcpu, int cpu,
-                         pcpu_delegate_fn *func,
-                         void *data, unsigned long stack)
+static void __noreturn pcpu_delegate(struct pcpu *pcpu, int cpu,
+                                    pcpu_delegate_fn *func,
+                                    void *data, unsigned long stack)
 {
        struct lowcore *lc, *abs_lc;
        unsigned int source_cpu;
@@ -370,7 +370,7 @@ static int pcpu_set_smt(unsigned int mtid)
 /*
  * Call function on the ipl CPU.
  */
-void smp_call_ipl_cpu(void (*func)(void *), void *data)
+void __noreturn smp_call_ipl_cpu(void (*func)(void *), void *data)
 {
        struct lowcore *lc = lowcore_ptr[0];