From: Thomas Gleixner <tglx@linutronix.de> To: LKML <linux-kernel@vger.kernel.org> Cc: Peter Zijlstra <peterz@infradead.org>, Ingo Molnar <mingo@kernel.org>, Darren Hart <darren@dvhart.com>, Yi Wang <wang.yi59@zte.com.cn>, Yang Tao <yang.tao172@zte.com.cn>, Oleg Nesterov <oleg@redhat.com>, Florian Weimer <fweimer@redhat.com>, Carlos O'Donell <carlos@redhat.com>, Alexander Viro <viro@zeniv.linux.org.uk> Subject: [patch 10/12] futex: Add mutex around futex exit Date: Wed, 06 Nov 2019 22:55:44 +0100 Message-ID: <20191106224556.845798895@linutronix.de> (raw) In-Reply-To: <20191106215534.241796846@linutronix.de> The mutex will be used in subsequent changes to replace the busy looping of a waiter when the futex owner is currently executing the exit cleanup to prevent a potential live lock. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- include/linux/futex.h | 1 + include/linux/sched.h | 1 + kernel/futex.c | 16 ++++++++++++++++ 3 files changed, 18 insertions(+) --- a/include/linux/futex.h +++ b/include/linux/futex.h @@ -63,6 +63,7 @@ static inline void futex_init_task(struc INIT_LIST_HEAD(&tsk->pi_state_list); tsk->pi_state_cache = NULL; tsk->futex_state = FUTEX_STATE_OK; + mutex_init(&tsk->futex_exit_mutex); } void futex_exit_recursive(struct task_struct *tsk); --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1054,6 +1054,7 @@ struct task_struct { #endif struct list_head pi_state_list; struct futex_pi_state *pi_state_cache; + struct mutex futex_exit_mutex; unsigned int futex_state; #endif #ifdef CONFIG_PERF_EVENTS --- a/kernel/futex.c +++ b/kernel/futex.c @@ -3698,12 +3698,23 @@ static void futex_cleanup(struct task_st */ void futex_exit_recursive(struct task_struct *tsk) { + /* If the state is FUTEX_STATE_EXITING then futex_exit_mutex is held */ + if (tsk->futex_state == FUTEX_STATE_EXITING) + mutex_unlock(&tsk->futex_exit_mutex); tsk->futex_state = FUTEX_STATE_DEAD; } static void futex_cleanup_begin(struct task_struct *tsk) { /* + * Prevent various race issues against a concurrent incoming waiter + * including live locks by forcing the waiter to block on + * tsk->futex_exit_mutex when it observes FUTEX_STATE_EXITING in + * attach_to_pi_owner(). + */ + mutex_lock(&tsk->futex_exit_mutex); + + /* * Switch the state to FUTEX_STATE_EXITING under tsk->pi_lock. * * This ensures that all subsequent checks of tsk->futex_state in @@ -3726,6 +3737,11 @@ static void futex_cleanup_end(struct tas * take another loop until it becomes visible. */ tsk->futex_state = state; + /* + * Drop the exit protection. This unblocks waiters which observed + * FUTEX_STATE_EXITING to reevaluate the state. + */ + mutex_unlock(&tsk->futex_exit_mutex); } void futex_exec_release(struct task_struct *tsk)
next prev parent reply index Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-11-06 21:55 [patch 00/12] futex: Cure robust/PI futex exit races Thomas Gleixner 2019-11-06 21:55 ` [patch 01/12] futex: Prevent robust futex exit race Thomas Gleixner 2019-11-06 21:55 ` [patch 02/12] futex: Move futex exit handling into futex code Thomas Gleixner 2019-11-07 9:24 ` Peter Zijlstra 2019-11-07 9:38 ` Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-16 20:53 ` Borislav Petkov 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 03/12] futex: Replace PF_EXITPIDONE with a state Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 04/12] exit/exec: Seperate mm_release() Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 05/12] futex: Split futex_mm_release() for exit/exec Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 06/12] futex: Set task::futex state to DEAD right after handling futex exit Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] futex: Set task::futex_state " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 07/12] futex: Mark the begin of futex exit explicitly Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 08/12] futex: Sanitize exit state handling Thomas Gleixner 2019-11-07 9:38 ` Peter Zijlstra 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 09/12] futex: Provide state handling for exec() as well Thomas Gleixner 2019-11-07 9:49 ` Peter Zijlstra 2019-11-07 9:54 ` Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` Thomas Gleixner [this message] 2019-11-15 18:19 ` [tip: locking/core] futex: Add mutex around futex exit tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 11/12] futex: Provide distinct return value when owner is exiting Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-06 21:55 ` [patch 12/12] futex: Prevent exit livelock Thomas Gleixner 2019-11-15 18:19 ` [tip: locking/core] " tip-bot2 for Thomas Gleixner 2019-11-20 9:38 ` tip-bot2 for Thomas Gleixner 2019-11-07 8:29 ` [patch 00/12] futex: Cure robust/PI futex exit races Ingo Molnar 2019-11-07 8:41 ` Ingo Molnar 2019-11-07 9:40 ` Peter Zijlstra 2019-11-07 15:03 ` Oleg Nesterov 2019-11-07 22:29 ` Florian Weimer 2019-11-07 22:40 ` Florian Weimer 2019-11-08 7:38 ` Florian Weimer 2019-11-08 9:18 ` Thomas Gleixner 2019-11-08 10:17 ` Florian Weimer 2019-11-08 10:37 ` Thomas Gleixner 2019-11-08 11:51 ` Thomas Gleixner 2019-11-11 9:48 ` Florian Weimer
Reply instructions: You may reply publically to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191106224556.845798895@linutronix.de \ --to=tglx@linutronix.de \ --cc=carlos@redhat.com \ --cc=darren@dvhart.com \ --cc=fweimer@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@kernel.org \ --cc=oleg@redhat.com \ --cc=peterz@infradead.org \ --cc=viro@zeniv.linux.org.uk \ --cc=wang.yi59@zte.com.cn \ --cc=yang.tao172@zte.com.cn \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
LKML Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \ linux-kernel@vger.kernel.org public-inbox-index lkml Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git