From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6A126C48BC3 for ; Tue, 20 Feb 2024 14:00:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E89026B0074; Tue, 20 Feb 2024 09:00:39 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E38E86B0075; Tue, 20 Feb 2024 09:00:39 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D01676B0078; Tue, 20 Feb 2024 09:00:39 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id BD3076B0074 for ; Tue, 20 Feb 2024 09:00:39 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 6F3A81606B8 for ; Tue, 20 Feb 2024 14:00:39 +0000 (UTC) X-FDA: 81812342598.26.EA897C0 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) by imf24.hostedemail.com (Postfix) with ESMTP id 9C706180025 for ; Tue, 20 Feb 2024 14:00:36 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=EHhnONSY; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf24.hostedemail.com: domain of dvyukov@google.com designates 209.85.208.46 as permitted sender) smtp.mailfrom=dvyukov@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1708437636; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=spBbznPNh4TAfNFhlhyDDg2OGTaBiEYUcTEdGHDr3/k=; b=GWwNOxudMZZH1MvOAcwdaAHNfy1qHRQZXL6kyShDZNnH4uYawN8uzy38WTg+tqOhCKVtaY gfvOxlBGG9shMinPHbAFsfnEZiOf0/r91oVrwkzS2mh/saWnLyWJ1XOHjB2mOIKkM2YGVw wdUdrzlz257kQTJTDnnJJF3hGtDXCFU= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=EHhnONSY; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf24.hostedemail.com: domain of dvyukov@google.com designates 209.85.208.46 as permitted sender) smtp.mailfrom=dvyukov@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1708437636; a=rsa-sha256; cv=none; b=dob2Xr9SpLM2mN6N4hCIqzA6mREUWSllWCmECt1C2G1coevYiEPtWTA/NCLYoNOrpWLDYi H9AXDmXb624ExMbfE/Bx44VXISpB+w3QBbPA3o8hw2KpPEevJXnFuQd/IKWRWsd1zs7bw6 pqJe0fKnUyPRIRCZPCsKfcqqzg2/xnI= Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-563dd5bd382so28975a12.1 for ; Tue, 20 Feb 2024 06:00:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708437635; x=1709042435; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=spBbznPNh4TAfNFhlhyDDg2OGTaBiEYUcTEdGHDr3/k=; b=EHhnONSYGB/P3Zm3et0jGANqROco5eaTn+UgpnzkwRX4TVwH+Mrw2jiTbBvkDC25Hd JP35oL3C45B3oA49nNECgbtiYY7DSDyF6Qd3wL6klaSwHP40OgzZ8rQrhM1n9v38APch oL5QvDNX2M7Ifye4lJT/BA2vTTIGKNxPbdNMppmFy0ZUfTCURfYoTCDz0DMxTxSlY3ds qwe1JjVmGjfKKis9pQQdKDrTaOdZ2bWdvv6XBv5RPdj6oIsEiL6CZoAIzCkZIjP+aavv rxoVeAainOnbPy77kP+KtOdmFsYl49b/UKvScE8b6DBhUxl2t6KfUj61Z3RbRxwtNCCN ZblQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708437635; x=1709042435; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=spBbznPNh4TAfNFhlhyDDg2OGTaBiEYUcTEdGHDr3/k=; b=EAA2hCdDylhbjeESiTtjGYe2vzLYCwwa2WtmAQFLRSX8oKCGwLmzs1E1O5jqUr5563 kyeDQOPEkjogdsUkJEvV4J0p3ochLmHJcvOSCYL+zRJ5rbFBtFO8UEjl7JNVRx/9RvDk qZmBiTWmfUzHqoIrO8gStouiSS2ssU0tjQBvamndCXnaxZNdFvgw9WZpmHLzOgrqmXXK 0x2J8a0u9MUN7viXA3CSW4h0GkA2o1CxVsw6YYnwsmBs1K02kmKSG2GkOe1dKBbYP8EZ ctc4U8cCWfRbPhIvsYgkWs+307uuGNFUXWB2Qr9+JocmlbMXYXZKBdzt5rK0b3VRtwF6 Js/w== X-Forwarded-Encrypted: i=1; AJvYcCUjCGgYtLdQoPqbgXWaz+mrVkpGlLHLdygATovvU64P7Q0hwfYnf288lcQroZl0fPrR9f/IloQxOsEGbjE0qoEq4dw= X-Gm-Message-State: AOJu0YyHk2ZmCLZIQk0nBTF8ulUjc6DYsXfAbONXW2mmMZjVoRn7C5VD 9UwAV3DuvZ4nEn2EF+X/o4fr+9FLP+3Il5ukTYNTDoN6MUptm63w4OsBWaXF3LZY+9UH1XtJWGJ TBrbeurpgX+PSuT59CNiOH2P9q6Iz8DLW2ZHZvnw3GRPA/Nx/kCkztL4= X-Google-Smtp-Source: AGHT+IEKAtHicKOoEx0Jg0gKmaOHpOZTxdYbilWRQkEuKn8HSulbu0wo4VaGO+BR1K5BnT4XXuiTDbO/AV7mYFvsB6Q= X-Received: by 2002:aa7:d848:0:b0:564:5c91:10be with SMTP id f8-20020aa7d848000000b005645c9110bemr291420eds.4.1708437232547; Tue, 20 Feb 2024 05:53:52 -0800 (PST) MIME-Version: 1.0 References: <20240215191402.681674-1-mathieu.desnoyers@efficios.com> In-Reply-To: <20240215191402.681674-1-mathieu.desnoyers@efficios.com> From: Dmitry Vyukov Date: Tue, 20 Feb 2024 14:53:37 +0100 Message-ID: Subject: Re: [RFC PATCH 1/1] sched/rseq: Consider rseq abort in page fault handler To: Mathieu Desnoyers Cc: linux-kernel@vger.kernel.org, Peter Oskolkov , Peter Zijlstra , "Paul E. McKenney" , Boqun Feng , Chris Kennelly , Andrew Morton , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 9C706180025 X-Stat-Signature: ubifwxzkjzzf3gbabybo7gw1478xirt9 X-Rspam-User: X-HE-Tag: 1708437636-703198 X-HE-Meta: U2FsdGVkX19o5hM+KuYyY+S3sogj1mPXiAz1VSGUvh3ogvbkKT613l1k6QyyiVzv86lyP2TZfgyFMLZxwNfbdPmP3LcHLytqjpcW8Ey6MtEAh8KjPABvd4n0JOpeOACRwhkf5Pg1p/RLKC0sPvrf9k4W+nqs+fZb8A6ZRzE8wJGgeb2FlQItRBp/NOq/AK7c+58woheKSRQje/RrhWy0t1gC1XGHmxkX+rydSInhL9B+7gyO3b5UXp2up36+PtO+avKnCp9cPwWgWxHS8vnRpIaYElzSn8+XhrEuE1G2dWfJ2jNlKZNynblOOjmh22L6FG8wrFk7xHXscvLC7FeG8U6oF0U3ot7EOAcBXo/4/i8X4XjEwIVnLMmzaEv0mp6OL1DKgeJ3piLJNw1KGGeje9sm01A+gnUO90rVDW2wjU99bSFSm7U1X4Zzh9cKWF14F34zCQappjWW/AobbrVg/CY0r2FPpzMWx/ZFGPaDxUHP8EtGSfftIHtVGscFDo4jEShBhu7zpAPdw+i8av8I5oAAlQpEoRE4n5OQn97OGb8UBPBTvGk0uBReJYyk1RPXHp6gkwX0exq6KBPD1IK+3P0UCXC0SjNBCu3ImvuvFhO4e2uYxb+5fbI7zjLj7+ocls88k/o1QdLoSMd9aSbQ2g/NXOhq5seqroz8UZvYGp6uPsysUyc3rILBOWi4dH82eAIJ3VxOsFtDq3oVcVGGhnJQCbSkwdeKgNDnrDQtJuFbVv4YRrRYNsqrb+zE1QbtnecolcPpHZvS46OML9mo4M/UHbVcnRb8kciBXF4qJQbXTUqxo0cz09LMudgSNQE3XQ1yTSO3dUZ89E/M6KkoTFRhnFmWuw7E/kw8la1i41eLx3GEXEniP76fbhTLUNqVLigMY7CU2/hFMs/eRdc5cN8cl1fdsIaOYum1/4RnOKtTRpY4qwPIiMZ1njicok1fjIuAr1Nr+WJaKRLfswr AYXowOVJ 4TbrpogZSkDFWJgh+lLftvYwbvsYAtc6ADtxweMwnu0KNWTKIumnKh+mMrZtgBJ4sfWR2E0yCws9EDxXk7LMqhRf1aGkr6CE4oQqX6BkDmGQ4AtA2VnixbujfjwIymL2s7z4ujaEUiLYsXmWRX93vg0nsUE/KOErZcTB3ffttufd8y+B1PLjC9H27pKMh1Avs2Ov7tEvHlvBz63fjDL2emq9d8sk4Ft4eC3Ldw969FauMADEn+e2ms+9pcm43TcK9kQmKju9LR97FG4SXYw3CuWvssUIRm/eg2eXklPnqs0tV+j3OoyNT8dEhFuRHESHeiTknlZxT/0DHvO27bNTlwFyrYP3hay8T+oBImTx9efjRY+Z5kTxNQs2UN3cMGihLOw4muxirQS5uJYYcVrv9Z0sW8t/Fa4yQDzFVX8Q9oM4g9igxR7h+I9tcu1U2JwGRtUZLuwcUXmGi281LxpPsiaoZYs1bPyLCnXL0CzAfo6om3jg/wMwle7HVM1XemaUlZGGDw3V+UTpfqaaFY3FK9HQvhwcS7oTjIzTKX0Ca13MuUA6CeLboqb4/l5dIY2X2zR6xpfVLL77C3N9mKxA9JmVZ8/t9EFE47aKRUzdicT8TIIwc1l9MrqGbsFKFxcgDj3//Gyw2Zxq7xZqtpJO3HwQBZk7Il+mQdZVeIhvSrLW+CXQbNPP5OYRqluYG6fF5uyqpWo+XCM0fpVQIMDey3833pogSc0KzNijDaQfEIqLEv4dam9+h/m9Zbw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Thu, 15 Feb 2024 at 20:14, Mathieu Desnoyers wrote: > > Consider rseq abort before emitting the SIGSEGV or SIGBUS signals from > the page fault handler. > > This allows using membarrier MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ > to abort rseq critical sections which include memory accesses to > memory which mapping can be munmap'd or mprotect'd after the > membarrier "rseq fence" without causing SIGSEGV or SIGBUS when the page > fault handler triggered by a faulting memory access within a rseq > critical section is preempted before handling the page fault. > > The problematic scenario is: > > CPU 0 CPU 1 > ------------------------------------------------------------------ > old_p = P > P = NULL > - rseq c.s. begins > - x = P > - if (x != NULL) > - v = *x > - page fault > - preempted > membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ) > munmap(old_p) (or mprotect(old_p)) > - handle page fault > - force_sig_fault(SIGSEGV) > - rseq resume notifier > - move IP to abort IP > -> SIGSEGV handler runs. > > This is solved by postponing the force_sig_fault() to return to > user-space when the page fault handler detects that rseq events will > cause the thread to call the rseq resume notifier before going back to > user-space. This allows the rseq resume notifier to load the userspace > memory pointed by rseq->rseq_cs to compare the IP with the rseq c.s. > range before either moving the IP to the abort handler or calling > force_sig_fault() with the parameters previously saved by the page fault > handler. > > Add a new AT_RSEQ_FEATURE_FLAGS getauxval(3) to allow user-space to > query whether the kernel implements this behavior (flag: > RSEQ_FEATURE_PAGE_FAULT_ABORT). > > Untested implementation submitted for early feedback. > > Only x86 is implemented in this PoC. > > Link: https://lore.kernel.org/lkml/CACT4Y+bXfekygoyhO7pCctjnL15=E=Zs31BUGXU0dk8d4rc1Cw@mail.gmail.com/ > Signed-off-by: Mathieu Desnoyers > Cc: Dmitry Vyukov > Cc: Peter Oskolkov > Cc: Peter Zijlstra > Cc: "Paul E. McKenney" > Cc: Boqun Feng > Cc: Chris Kennelly > Cc: Andrew Morton > Cc: Andy Lutomirski > Cc: Thomas Gleixner > Cc: Ingo Molnar > Cc: Borislav Petkov > Cc: Dave Hansen > Cc: "H. Peter Anvin" > Cc: linux-mm@kvack.org Hi Mathieu, Thanks for the quick fix. I can try to test this, but I can't apply this. What's the base commit for the patch? On top of latest upstream head v6.8-rc5: $ patch -p1 < /tmp/patch patching file arch/x86/mm/fault.c patching file fs/binfmt_elf.c patching file include/linux/sched.h Hunk #1 succeeded at 745 (offset 2 lines). Hunk #2 succeeded at 1329 (offset 3 lines). Hunk #3 succeeded at 2143 with fuzz 2 (offset -197 lines). Hunk #4 FAILED at 2402. Hunk #5 FAILED at 2417. 2 out of 5 hunks FAILED -- saving rejects to file include/linux/sched.h.rej patching file include/linux/sched/signal.h Hunk #1 succeeded at 784 (offset 3 lines). patching file include/uapi/linux/auxvec.h patching file include/uapi/linux/rseq.h patching file kernel/rseq.c Hunk #2 succeeded at 299 with fuzz 1. > --- > arch/x86/mm/fault.c | 4 ++-- > fs/binfmt_elf.c | 1 + > include/linux/sched.h | 16 ++++++++++++++++ > include/linux/sched/signal.h | 24 ++++++++++++++++++++++++ > include/uapi/linux/auxvec.h | 1 + > include/uapi/linux/rseq.h | 7 +++++++ > kernel/rseq.c | 36 +++++++++++++++++++++++++++++++----- > 7 files changed, 82 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c > index 679b09cfe241..42ac39680cb6 100644 > --- a/arch/x86/mm/fault.c > +++ b/arch/x86/mm/fault.c > @@ -854,7 +854,7 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, > if (si_code == SEGV_PKUERR) > force_sig_pkuerr((void __user *)address, pkey); > else > - force_sig_fault(SIGSEGV, si_code, (void __user *)address); > + rseq_lazy_force_sig_fault(SIGSEGV, si_code, (void __user *)address); > > local_irq_disable(); > } > @@ -973,7 +973,7 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, > return; > } > #endif > - force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address); > + rseq_lazy_force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address); > } > > static int spurious_kernel_fault_check(unsigned long error_code, pte_t *pte) > diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c > index 5397b552fbeb..8fece0911c7d 100644 > --- a/fs/binfmt_elf.c > +++ b/fs/binfmt_elf.c > @@ -273,6 +273,7 @@ create_elf_tables(struct linux_binprm *bprm, const struct elfhdr *exec, > #ifdef CONFIG_RSEQ > NEW_AUX_ENT(AT_RSEQ_FEATURE_SIZE, offsetof(struct rseq, end)); > NEW_AUX_ENT(AT_RSEQ_ALIGN, __alignof__(struct rseq)); > + NEW_AUX_ENT(AT_RSEQ_FEATURE_FLAGS, RSEQ_FEATURE_FLAGS); > #endif > #undef NEW_AUX_ENT > /* AT_NULL is zero; clear the rest too */ > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 292c31697248..39aa585ba2a3 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -743,6 +743,15 @@ struct kmap_ctrl { > #endif > }; > > +#ifdef CONFIG_RSEQ > +struct rseq_lazy_sig { > + bool pending; > + int sig; > + int code; > + void __user *addr; > +}; > +#endif > + > struct task_struct { > #ifdef CONFIG_THREAD_INFO_IN_TASK > /* > @@ -1317,6 +1326,7 @@ struct task_struct { > * with respect to preemption. > */ > unsigned long rseq_event_mask; > + struct rseq_lazy_sig rseq_lazy_sig; > #endif > > #ifdef CONFIG_SCHED_MM_CID > @@ -2330,6 +2340,8 @@ unsigned long sched_cpu_util(int cpu); > > #ifdef CONFIG_RSEQ > > +#define RSEQ_FEATURE_FLAGS RSEQ_FEATURE_PAGE_FAULT_ABORT > + > /* > * Map the event mask on the user-space ABI enum rseq_cs_flags > * for direct mask checks. > @@ -2390,6 +2402,8 @@ static inline void rseq_migrate(struct task_struct *t) > */ > static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) > { > + WARN_ON_ONCE(current->rseq_lazy_sig.pending); > + > if (clone_flags & CLONE_VM) { > t->rseq = NULL; > t->rseq_len = 0; > @@ -2405,6 +2419,8 @@ static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) > > static inline void rseq_execve(struct task_struct *t) > { > + WARN_ON_ONCE(current->rseq_lazy_sig.pending); > + > t->rseq = NULL; > t->rseq_len = 0; > t->rseq_sig = 0; > diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h > index 3499c1a8b929..0d75dfde2f9b 100644 > --- a/include/linux/sched/signal.h > +++ b/include/linux/sched/signal.h > @@ -781,4 +781,28 @@ static inline unsigned long rlimit_max(unsigned int limit) > return task_rlimit_max(current, limit); > } > > +#ifdef CONFIG_RSEQ > + > +static inline int rseq_lazy_force_sig_fault(int sig, int code, void __user *addr) > +{ > + struct task_struct *t = current; > + > + if (!t->rseq_event_mask) > + return force_sig_fault(sig, code, addr); > + t->rseq_lazy_sig.pending = true; > + t->rseq_lazy_sig.sig = sig; > + t->rseq_lazy_sig.code = code; > + t->rseq_lazy_sig.addr = addr; > + return 0; > +} > + > +#else > + > +static inline int rseq_lazy_force_sig_fault(int sig, int code, void __user *addr) > +{ > + return force_sig_fault(sig, code, addr); > +} > + > +#endif > + > #endif /* _LINUX_SCHED_SIGNAL_H */ > diff --git a/include/uapi/linux/auxvec.h b/include/uapi/linux/auxvec.h > index 6991c4b8ab18..5044f367a219 100644 > --- a/include/uapi/linux/auxvec.h > +++ b/include/uapi/linux/auxvec.h > @@ -32,6 +32,7 @@ > #define AT_HWCAP2 26 /* extension of AT_HWCAP */ > #define AT_RSEQ_FEATURE_SIZE 27 /* rseq supported feature size */ > #define AT_RSEQ_ALIGN 28 /* rseq allocation alignment */ > +#define AT_RSEQ_FEATURE_FLAGS 29 /* rseq feature flags */ > > #define AT_EXECFN 31 /* filename of program */ > > diff --git a/include/uapi/linux/rseq.h b/include/uapi/linux/rseq.h > index c233aae5eac9..0fdb192e3cd3 100644 > --- a/include/uapi/linux/rseq.h > +++ b/include/uapi/linux/rseq.h > @@ -37,6 +37,13 @@ enum rseq_cs_flags { > (1U << RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT), > }; > > +/* > + * rseq feature flags. Query with getauxval(AT_RSEQ_FEATURE_FLAGS). > + */ > +enum rseq_feature_flags { > + RSEQ_FEATURE_PAGE_FAULT_ABORT = (1U << 0), > +}; > + > /* > * struct rseq_cs is aligned on 4 * 8 bytes to ensure it is always > * contained within a single cache-line. It is usually declared as > diff --git a/kernel/rseq.c b/kernel/rseq.c > index 9de6e35fe679..f686a97abb45 100644 > --- a/kernel/rseq.c > +++ b/kernel/rseq.c > @@ -271,6 +271,25 @@ static bool in_rseq_cs(unsigned long ip, struct rseq_cs *rseq_cs) > return ip - rseq_cs->start_ip < rseq_cs->post_commit_offset; > } > > +static void rseq_clear_lazy_sig_fault(struct task_struct *t) > +{ > + if (!t->rseq_lazy_sig.pending) > + return; > + t->rseq_lazy_sig.pending = false; > + t->rseq_lazy_sig.sig = 0; > + t->rseq_lazy_sig.code = 0; > + t->rseq_lazy_sig.addr = NULL; > +} > + > +static void rseq_force_lazy_sig_fault(struct task_struct *t) > +{ > + if (!t->rseq_lazy_sig.pending) > + return; > + force_sig_fault(t->rseq_lazy_sig.sig, t->rseq_lazy_sig.code, > + t->rseq_lazy_sig.addr); > + rseq_clear_lazy_sig_fault(t); > +} > + > static int rseq_ip_fixup(struct pt_regs *regs) > { > unsigned long ip = instruction_pointer(regs); > @@ -280,25 +299,32 @@ static int rseq_ip_fixup(struct pt_regs *regs) > > ret = rseq_get_rseq_cs(t, &rseq_cs); > if (ret) > - return ret; > + goto nofixup; > > /* > * Handle potentially not being within a critical section. > * If not nested over a rseq critical section, restart is useless. > * Clear the rseq_cs pointer and return. > */ > - if (!in_rseq_cs(ip, &rseq_cs)) > - return clear_rseq_cs(t); > + if (!in_rseq_cs(ip, &rseq_cs)) { > + ret = clear_rseq_cs(t); > + goto nofixup; > + } > ret = rseq_need_restart(t, rseq_cs.flags); > if (ret <= 0) > - return ret; > + goto nofixup; > ret = clear_rseq_cs(t); > if (ret) > - return ret; > + goto nofixup; > + rseq_clear_lazy_sig_fault(t); > trace_rseq_ip_fixup(ip, rseq_cs.start_ip, rseq_cs.post_commit_offset, > rseq_cs.abort_ip); > instruction_pointer_set(regs, (unsigned long)rseq_cs.abort_ip); > return 0; > + > +nofixup: > + rseq_force_lazy_sig_fault(t); > + return ret; > } > > /* > -- > 2.39.2 >