Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dddad862 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Greg Kroah-Hartman
Browse files

UPSTREAM: futex: Simplify fixup_pi_state_owner()



commit f2dac39d93987f7de1e20b3988c8685523247ae2 upstream

Too many gotos already and an upcoming fix would make it even more
unreadable.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit f2dac39d93987f7de1e20b3988c8685523247ae2)
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
Change-Id: I5a97587c0f696d4f4b849f7f106990a5587fa402
parent d245cfa1
Loading
Loading
Loading
Loading
+26 −27
Original line number Diff line number Diff line
@@ -2466,18 +2466,13 @@ static void unqueue_me_pi(struct futex_q *q)
	spin_unlock(q->lock_ptr);
}

static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
static int __fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
				  struct task_struct *argowner)
{
	u32 uval, uninitialized_var(curval), newval, newtid;
	struct futex_pi_state *pi_state = q->pi_state;
	u32 uval, uninitialized_var(curval), newval;
	struct task_struct *oldowner, *newowner;
	u32 newtid;
	int ret, err = 0;

	lockdep_assert_held(q->lock_ptr);

	raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
	int err = 0;

	oldowner = pi_state->owner;

@@ -2511,14 +2506,12 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
			 * We raced against a concurrent self; things are
			 * already fixed up. Nothing to do.
			 */
			ret = 0;
			goto out_unlock;
			return 0;
		}

		if (__rt_mutex_futex_trylock(&pi_state->pi_mutex)) {
			/* We got the lock. pi_state is correct. Tell caller. */
			ret = 1;
			goto out_unlock;
			return 1;
		}

		/*
@@ -2545,8 +2538,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
			 * We raced against a concurrent self; things are
			 * already fixed up. Nothing to do.
			 */
			ret = 1;
			goto out_unlock;
			return 1;
		}
		newowner = argowner;
	}
@@ -2577,7 +2569,6 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
	 * itself.
	 */
	pi_state_update_owner(pi_state, newowner);
	raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);

	return argowner == current;

@@ -2600,17 +2591,16 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,

	switch (err) {
	case -EFAULT:
		ret = fault_in_user_writeable(uaddr);
		err = fault_in_user_writeable(uaddr);
		break;

	case -EAGAIN:
		cond_resched();
		ret = 0;
		err = 0;
		break;

	default:
		WARN_ON_ONCE(1);
		ret = err;
		break;
	}

@@ -2620,17 +2610,26 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
	/*
	 * Check if someone else fixed it for us:
	 */
	if (pi_state->owner != oldowner) {
		ret = argowner == current;
		goto out_unlock;
	if (pi_state->owner != oldowner)
		return argowner == current;

	/* Retry if err was -EAGAIN or the fault in succeeded */
	if (!err)
		goto retry;

	return err;
}

	if (ret)
		goto out_unlock;
static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
				struct task_struct *argowner)
{
	struct futex_pi_state *pi_state = q->pi_state;
	int ret;

	goto retry;
	lockdep_assert_held(q->lock_ptr);

out_unlock:
	raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
	ret = __fixup_pi_state_owner(uaddr, q, argowner);
	raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
	return ret;
}