| From foo@baz Mon Feb 1 04:21:37 PM CET 2021 |
| From: Lee Jones <lee.jones@linaro.org> |
| Date: Mon, 1 Feb 2021 15:12:13 +0000 |
| Subject: futex: Provide distinct return value when owner is exiting |
| To: stable@vger.kernel.org |
| Cc: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <peterz@infradead.org>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Lee Jones <lee.jones@linaro.org> |
| Message-ID: <20210201151214.2193508-12-lee.jones@linaro.org> |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit ac31c7ff8624409ba3c4901df9237a616c187a5d upstream. |
| |
| attach_to_pi_owner() returns -EAGAIN for various cases: |
| |
| - Owner task is exiting |
| - Futex value has changed |
| |
| The caller drops the held locks (hash bucket, mmap_sem) and retries the |
| operation. In case of the owner task exiting this can result in a live |
| lock. |
| |
| As a preparatory step for seperating those cases, provide a distinct return |
| value (EBUSY) for the owner exiting case. |
| |
| No functional change. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Reviewed-by: Ingo Molnar <mingo@kernel.org> |
| Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Link: https://lkml.kernel.org/r/20191106224556.935606117@linutronix.de |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| kernel/futex.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- a/kernel/futex.c |
| +++ b/kernel/futex.c |
| @@ -1909,12 +1909,13 @@ retry_private: |
| if (!ret) |
| goto retry; |
| goto out; |
| + case -EBUSY: |
| case -EAGAIN: |
| /* |
| * Two reasons for this: |
| - * - Owner is exiting and we just wait for the |
| + * - EBUSY: Owner is exiting and we just wait for the |
| * exit to complete. |
| - * - The user space value changed. |
| + * - EAGAIN: The user space value changed. |
| */ |
| free_pi_state(pi_state); |
| pi_state = NULL; |
| @@ -2580,12 +2581,13 @@ retry_private: |
| goto out_unlock_put_key; |
| case -EFAULT: |
| goto uaddr_faulted; |
| + case -EBUSY: |
| case -EAGAIN: |
| /* |
| * Two reasons for this: |
| - * - Task is exiting and we just wait for the |
| + * - EBUSY: Task is exiting and we just wait for the |
| * exit to complete. |
| - * - The user space value changed. |
| + * - EAGAIN: The user space value changed. |
| */ |
| queue_unlock(hb); |
| put_futex_key(&q.key); |