mirror of
https://github.com/torvalds/linux.git
synced 2026-01-12 00:42:35 +08:00
Merge tag 'core-rseq-2025-09-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull rseq updates from Thomas Gleixner:
"Two fixes for RSEQ:
- Protect the event mask modification against the membarrier() IPI as
otherwise the RmW operation is unprotected and events might be lost
- Fix the weak symbol reference in rseq selftests
The current weak RSEQ symbols definitions which were added to allow
static linkage are not working correctly as they effectively
re-define the glibc symbols leading to multiple versions of the
symbols when compiled with -fno-common.
Mark them as 'extern' to convert them from weak symbol definitions
to weak symbol references. That works with static and dynamic
linkage independent of -fcommon and -fno-common"
* tag 'core-rseq-2025-09-29' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
rseq/selftests: Use weak symbol reference, not definition, to link with glibc
rseq: Protect event mask against membarrier IPI
This commit is contained in:
@@ -7,6 +7,12 @@
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#ifdef CONFIG_MEMBARRIER
|
||||
# define RSEQ_EVENT_GUARD irq
|
||||
#else
|
||||
# define RSEQ_EVENT_GUARD preempt
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Map the event mask on the user-space ABI enum rseq_cs_flags
|
||||
* for direct mask checks.
|
||||
@@ -41,9 +47,8 @@ static inline void rseq_handle_notify_resume(struct ksignal *ksig,
|
||||
static inline void rseq_signal_deliver(struct ksignal *ksig,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
preempt_disable();
|
||||
__set_bit(RSEQ_EVENT_SIGNAL_BIT, ¤t->rseq_event_mask);
|
||||
preempt_enable();
|
||||
scoped_guard(RSEQ_EVENT_GUARD)
|
||||
__set_bit(RSEQ_EVENT_SIGNAL_BIT, ¤t->rseq_event_mask);
|
||||
rseq_handle_notify_resume(ksig, regs);
|
||||
}
|
||||
|
||||
|
||||
@@ -342,12 +342,12 @@ static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
|
||||
|
||||
/*
|
||||
* Load and clear event mask atomically with respect to
|
||||
* scheduler preemption.
|
||||
* scheduler preemption and membarrier IPIs.
|
||||
*/
|
||||
preempt_disable();
|
||||
event_mask = t->rseq_event_mask;
|
||||
t->rseq_event_mask = 0;
|
||||
preempt_enable();
|
||||
scoped_guard(RSEQ_EVENT_GUARD) {
|
||||
event_mask = t->rseq_event_mask;
|
||||
t->rseq_event_mask = 0;
|
||||
}
|
||||
|
||||
return !!event_mask;
|
||||
}
|
||||
|
||||
@@ -40,9 +40,9 @@
|
||||
* Define weak versions to play nice with binaries that are statically linked
|
||||
* against a libc that doesn't support registering its own rseq.
|
||||
*/
|
||||
__weak ptrdiff_t __rseq_offset;
|
||||
__weak unsigned int __rseq_size;
|
||||
__weak unsigned int __rseq_flags;
|
||||
extern __weak ptrdiff_t __rseq_offset;
|
||||
extern __weak unsigned int __rseq_size;
|
||||
extern __weak unsigned int __rseq_flags;
|
||||
|
||||
static const ptrdiff_t *libc_rseq_offset_p = &__rseq_offset;
|
||||
static const unsigned int *libc_rseq_size_p = &__rseq_size;
|
||||
@@ -209,7 +209,7 @@ void rseq_init(void)
|
||||
* libc not having registered a restartable sequence. Try to find the
|
||||
* symbols if that's the case.
|
||||
*/
|
||||
if (!*libc_rseq_size_p) {
|
||||
if (!libc_rseq_size_p || !*libc_rseq_size_p) {
|
||||
libc_rseq_offset_p = dlsym(RTLD_NEXT, "__rseq_offset");
|
||||
libc_rseq_size_p = dlsym(RTLD_NEXT, "__rseq_size");
|
||||
libc_rseq_flags_p = dlsym(RTLD_NEXT, "__rseq_flags");
|
||||
|
||||
Reference in New Issue
Block a user