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

Commit e1d893ef authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Gerrit - the friendly Code Review server
Browse files

futex: Simplify fixup_pi_state_owner()



commit f2dac39d93987f7de1e20b3988c8685523247ae2 upstream

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

Change-Id: I3bb8a7da18cebf2a95e1c8646a7f4242b017d537
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>
Git-commit: a4649185
Git-repo: https://android.googlesource.com/kernel/msm


Signed-off-by: default avatarPavanKumar S.R. <pavasr@codeaurora.org>
parent 44ff1374
Loading
Loading
Loading
Loading
+26 −27
Original line number Diff line number Diff line
@@ -2373,18 +2373,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;

@@ -2418,14 +2413,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;
		}

		/*
@@ -2452,8 +2445,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;
	}
@@ -2484,7 +2476,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;

@@ -2507,17 +2498,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;
	}

@@ -2527,17 +2517,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;
}