Commit 9e5a9f1c authored by Tiwei Bie's avatar Tiwei Bie Committed by Johannes Berg
Browse files

um: Turn signals_* into thread-local variables



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: default avatarTiwei Bie <tiwei.btw@antgroup.com>
Link: https://patch.msgid.link/20251027001815.1666872-3-tiwei.bie@linux.dev


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6aaf00d1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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
+1 −2
Original line number Diff line number Diff line
@@ -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);		\
+1 −0
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);
+8 −3
Original line number Diff line number Diff line
@@ -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;