mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-11 17:10:13 +00:00
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: 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>
This commit is contained in:
parent
6aaf00d14e
commit
9e5a9f1c9b
@ -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
|
||||
|
||||
@ -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); \
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user