]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
um: Turn signals_* into thread-local variables
authorTiwei Bie <tiwei.btw@antgroup.com>
Mon, 27 Oct 2025 00:18:09 +0000 (08:18 +0800)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 27 Oct 2025 15:41:15 +0000 (16:41 +0100)
Turn signals_enabled, signals_pending and signals_active into
thread-local variables. This enables us to control and track
signals independently on each CPU thread. This is a preparation
for adding SMP support.

Signed-off-by: Tiwei Bie <tiwei.btw@antgroup.com>
Link: https://patch.msgid.link/20251027001815.1666872-3-tiwei.bie@linux.dev
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/um/include/asm/irqflags.h
arch/um/include/shared/longjmp.h
arch/um/include/shared/os.h
arch/um/kernel/ksyms.c
arch/um/os-Linux/signal.c

index 1e69ef5bc35e0021c55685e4856c93c94794eb82..31e49e0894c5e7ccf842ae81f9bfbe0af5958f49 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef __UM_IRQFLAGS_H
 #define __UM_IRQFLAGS_H
 
-extern int signals_enabled;
+int um_get_signals(void);
 int um_set_signals(int enable);
 void block_signals(void);
 void unblock_signals(void);
@@ -10,7 +10,7 @@ void unblock_signals(void);
 #define arch_local_save_flags arch_local_save_flags
 static inline unsigned long arch_local_save_flags(void)
 {
-       return signals_enabled;
+       return um_get_signals();
 }
 
 #define arch_local_irq_restore arch_local_irq_restore
index 8863319039f3def1c85b47358e207d88bed0583e..c53e43d980c85fd6f465288e7315cff8fbf957c5 100644 (file)
@@ -5,7 +5,6 @@
 #include <sysdep/archsetjmp.h>
 #include <os.h>
 
-extern int signals_enabled;
 extern int setjmp(jmp_buf);
 extern void longjmp(jmp_buf, int);
 
@@ -15,7 +14,7 @@ extern void longjmp(jmp_buf, int);
 
 #define UML_SETJMP(buf) ({                             \
        int n, enable;                                  \
-       enable = *(volatile int *)&signals_enabled;     \
+       enable = um_get_signals();                      \
        n = setjmp(*buf);                               \
        if(n != 0)                                      \
                um_set_signals_trace(enable);           \
index b35cc8ce333bb499ccb8ac1490ffccbf16c451e3..324d4eed338541b0e0a8d68b9969eff4e3a65c4a 100644 (file)
@@ -243,6 +243,7 @@ extern void send_sigio_to_self(void);
 extern int change_sig(int signal, int on);
 extern void block_signals(void);
 extern void unblock_signals(void);
+extern int um_get_signals(void);
 extern int um_set_signals(int enable);
 extern int um_set_signals_trace(int enable);
 extern void deliver_alarm(void);
index f2fb77da08cff0be3f34d4d34a9b6e58cbb04562..96314c31e61c1ed2ac6df3b78d145c25af75765f 100644 (file)
@@ -6,8 +6,8 @@
 #include <linux/module.h>
 #include <os.h>
 
+EXPORT_SYMBOL(um_get_signals);
 EXPORT_SYMBOL(um_set_signals);
-EXPORT_SYMBOL(signals_enabled);
 
 EXPORT_SYMBOL(os_stat_fd);
 EXPORT_SYMBOL(os_stat_file);
index 11f07f49827005b00e32d5153d8b54b1a077b6f2..58da8c6ece987d5b6a34193e9890609b437a0783 100644 (file)
@@ -68,12 +68,12 @@ static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc)
 #define SIGCHLD_BIT 2
 #define SIGCHLD_MASK (1 << SIGCHLD_BIT)
 
-int signals_enabled;
+static __thread int signals_enabled;
 #if IS_ENABLED(CONFIG_UML_TIME_TRAVEL_SUPPORT)
 static int signals_blocked, signals_blocked_pending;
 #endif
-static unsigned int signals_pending;
-static unsigned int signals_active = 0;
+static __thread unsigned int signals_pending;
+static __thread unsigned int signals_active;
 
 static void sig_handler(int sig, struct siginfo *si, mcontext_t *mc)
 {
@@ -342,6 +342,11 @@ void unblock_signals(void)
        }
 }
 
+int um_get_signals(void)
+{
+       return signals_enabled;
+}
+
 int um_set_signals(int enable)
 {
        int ret;