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

Commit c22fb380 authored by Chris Wilson's avatar Chris Wilson Committed by Ingo Molnar
Browse files

locking/ww_mutex: Add kselftests for ww_mutex AA deadlock detection



Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Maarten Lankhorst <dev@mblankhorst.nl>
Cc: Nicolai Hähnle <nhaehnle@gmail.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20161201114711.28697-5-chris@chris-wilson.co.uk


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent f2a5fec1
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -118,6 +118,41 @@ static int test_mutex(void)
	return 0;
}

static int test_aa(void)
{
	struct ww_mutex mutex;
	struct ww_acquire_ctx ctx;
	int ret;

	ww_mutex_init(&mutex, &ww_class);
	ww_acquire_init(&ctx, &ww_class);

	ww_mutex_lock(&mutex, &ctx);

	if (ww_mutex_trylock(&mutex))  {
		pr_err("%s: trylocked itself!\n", __func__);
		ww_mutex_unlock(&mutex);
		ret = -EINVAL;
		goto out;
	}

	ret = ww_mutex_lock(&mutex, &ctx);
	if (ret != -EALREADY) {
		pr_err("%s: missed deadlock for recursing, ret=%d\n",
		       __func__, ret);
		if (!ret)
			ww_mutex_unlock(&mutex);
		ret = -EINVAL;
		goto out;
	}

	ret = 0;
out:
	ww_mutex_unlock(&mutex);
	ww_acquire_fini(&ctx);
	return ret;
}

static int __init test_ww_mutex_init(void)
{
	int ret;
@@ -126,6 +161,10 @@ static int __init test_ww_mutex_init(void)
	if (ret)
		return ret;

	ret = test_aa();
	if (ret)
		return ret;

	return 0;
}