diff --git a/kernel/futex/core.c b/kernel/futex/core.c index 128c5752f225..a0b17d2f41da 100644 --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -1785,14 +1785,24 @@ static bool futex_pivot_pending(struct mm_struct *mm) { struct futex_mm_phash *mmph = &mm->futex.phash; struct futex_private_hash *fph; + unsigned int state; + bool ret; + + state = current->__state; + __set_current_state(TASK_RUNNING); + scoped_guard(mutex, &mmph->lock) { + if (!mmph->hash_new) { + ret = true; + goto out; + } - guard(mutex)(&mmph->lock); - - if (!mmph->hash_new) - return true; + fph = rcu_dereference_raw(mmph->hash); + ret = futex_ref_is_dead(fph); + } +out: + __set_current_state(state); + return ret; - fph = rcu_dereference_raw(mmph->hash); - return futex_ref_is_dead(fph); } static bool futex_hash_less(struct futex_private_hash *a,