Commit-ID:  2fe3d4b149ccebbb384062fbbe6634439f2bf120
Gitweb:     http://git.kernel.org/tip/2fe3d4b149ccebbb384062fbbe6634439f2bf120
Author:     Maarten Lankhorst <maarten.lankho...@canonical.com>
AuthorDate: Thu, 20 Jun 2013 13:31:30 +0200
Committer:  Ingo Molnar <mi...@kernel.org>
CommitDate: Wed, 26 Jun 2013 12:10:57 +0200

mutex: Add more tests to lib/locking-selftest.c

None of the ww_mutex codepaths should be taken in the 'normal'
mutex calls. The easiest way to verify this is by using the
normal mutex calls, and making sure o.ctx is unmodified.

Signed-off-by: Maarten Lankhorst <maarten.lankho...@canonical.com>
Acked-by: Peter Zijlstra <a.p.zijls...@chello.nl>
Cc: dri-de...@lists.freedesktop.org
Cc: linaro-mm-...@lists.linaro.org
Cc: robcl...@gmail.com
Cc: rost...@goodmis.org
Cc: dan...@ffwll.ch
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Link: http://lkml.kernel.org/r/20130620113130.4001.45423.stgit@patser
Signed-off-by: Ingo Molnar <mi...@kernel.org>
---
 lib/locking-selftest.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
index 9962262..37faefd 100644
--- a/lib/locking-selftest.c
+++ b/lib/locking-selftest.c
@@ -1162,6 +1162,67 @@ static void ww_test_fail_acquire(void)
 #endif
 }
 
+static void ww_test_normal(void)
+{
+       int ret;
+
+       WWAI(&t);
+
+       /*
+        * None of the ww_mutex codepaths should be taken in the 'normal'
+        * mutex calls. The easiest way to verify this is by using the
+        * normal mutex calls, and making sure o.ctx is unmodified.
+        */
+
+       /* mutex_lock (and indirectly, mutex_lock_nested) */
+       o.ctx = (void *)~0UL;
+       mutex_lock(&o.base);
+       mutex_unlock(&o.base);
+       WARN_ON(o.ctx != (void *)~0UL);
+
+       /* mutex_lock_interruptible (and *_nested) */
+       o.ctx = (void *)~0UL;
+       ret = mutex_lock_interruptible(&o.base);
+       if (!ret)
+               mutex_unlock(&o.base);
+       else
+               WARN_ON(1);
+       WARN_ON(o.ctx != (void *)~0UL);
+
+       /* mutex_lock_killable (and *_nested) */
+       o.ctx = (void *)~0UL;
+       ret = mutex_lock_killable(&o.base);
+       if (!ret)
+               mutex_unlock(&o.base);
+       else
+               WARN_ON(1);
+       WARN_ON(o.ctx != (void *)~0UL);
+
+       /* trylock, succeeding */
+       o.ctx = (void *)~0UL;
+       ret = mutex_trylock(&o.base);
+       WARN_ON(!ret);
+       if (ret)
+               mutex_unlock(&o.base);
+       else
+               WARN_ON(1);
+       WARN_ON(o.ctx != (void *)~0UL);
+
+       /* trylock, failing */
+       o.ctx = (void *)~0UL;
+       mutex_lock(&o.base);
+       ret = mutex_trylock(&o.base);
+       WARN_ON(ret);
+       mutex_unlock(&o.base);
+       WARN_ON(o.ctx != (void *)~0UL);
+
+       /* nest_lock */
+       o.ctx = (void *)~0UL;
+       mutex_lock_nest_lock(&o.base, &t);
+       mutex_unlock(&o.base);
+       WARN_ON(o.ctx != (void *)~0UL);
+}
+
 static void ww_test_two_contexts(void)
 {
        WWAI(&t);
@@ -1415,6 +1476,7 @@ static void ww_tests(void)
 
        print_testname("ww api failures");
        dotest(ww_test_fail_acquire, SUCCESS, LOCKTYPE_WW);
+       dotest(ww_test_normal, SUCCESS, LOCKTYPE_WW);
        dotest(ww_test_unneeded_slow, FAILURE, LOCKTYPE_WW);
        printk("\n");
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to