locking/ww_mutex: Improve test to cover acquire context changes
authorPeter Zijlstra <peterz@infradead.org>
Fri, 3 Mar 2017 12:57:56 +0000 (13:57 +0100)
committerIngo Molnar <mingo@kernel.org>
Thu, 16 Mar 2017 08:57:09 +0000 (09:57 +0100)
Currently each thread starts an acquire context only once, and
performs all its loop iterations under it.

This means that the Wound/Wait relations between threads are fixed.

To make things a little more realistic and cover more of the
functionality with the test, open a new acquire context for each loop.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/locking/test-ww_mutex.c

index 6b7abb334ca6027dd2b189a211671fa98a33be82..90d8d8879969b9c73b592885ac32634b70770023 100644 (file)
@@ -398,12 +398,11 @@ static void stress_inorder_work(struct work_struct *work)
        if (!order)
                return;
 
-       ww_acquire_init(&ctx, &ww_class);
-
        do {
                int contended = -1;
                int n, err;
 
+               ww_acquire_init(&ctx, &ww_class);
 retry:
                err = 0;
                for (n = 0; n < nlocks; n++) {
@@ -433,9 +432,9 @@ retry:
                                    __func__, err);
                        break;
                }
-       } while (--stress->nloops);
 
-       ww_acquire_fini(&ctx);
+               ww_acquire_fini(&ctx);
+       } while (--stress->nloops);
 
        kfree(order);
        kfree(stress);
@@ -470,9 +469,9 @@ static void stress_reorder_work(struct work_struct *work)
        kfree(order);
        order = NULL;
 
-       ww_acquire_init(&ctx, &ww_class);
-
        do {
+               ww_acquire_init(&ctx, &ww_class);
+
                list_for_each_entry(ll, &locks, link) {
                        err = ww_mutex_lock(ll->lock, &ctx);
                        if (!err)
@@ -495,9 +494,9 @@ static void stress_reorder_work(struct work_struct *work)
                dummy_load(stress);
                list_for_each_entry(ll, &locks, link)
                        ww_mutex_unlock(ll->lock);
-       } while (--stress->nloops);
 
-       ww_acquire_fini(&ctx);
+               ww_acquire_fini(&ctx);
+       } while (--stress->nloops);
 
 out:
        list_for_each_entry_safe(ll, ln, &locks, link)