Skip to content

Commit cfa92b6

Browse files
johnstultz-workIngo Molnar
authored and
Ingo Molnar
committed
locking/ww_mutex/test: Make sure we bail out instead of livelock
I've seen what appears to be livelocks in the stress_inorder_work() function, and looking at the code it is clear we can have a case where we continually retry acquiring the locks and never check to see if we have passed the specified timeout. This patch reworks that function so we always check the timeout before iterating through the loop again. I believe others may have hit this previously here: https://lore.kernel.org/lkml/[email protected]/ Reported-by: Li Zhijian <[email protected]> Signed-off-by: John Stultz <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent bccdd80 commit cfa92b6

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

kernel/locking/test-ww_mutex.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -465,17 +465,18 @@ static void stress_inorder_work(struct work_struct *work)
465465
ww_mutex_unlock(&locks[order[n]]);
466466

467467
if (err == -EDEADLK) {
468-
ww_mutex_lock_slow(&locks[order[contended]], &ctx);
469-
goto retry;
468+
if (!time_after(jiffies, stress->timeout)) {
469+
ww_mutex_lock_slow(&locks[order[contended]], &ctx);
470+
goto retry;
471+
}
470472
}
471473

474+
ww_acquire_fini(&ctx);
472475
if (err) {
473476
pr_err_once("stress (%s) failed with %d\n",
474477
__func__, err);
475478
break;
476479
}
477-
478-
ww_acquire_fini(&ctx);
479480
} while (!time_after(jiffies, stress->timeout));
480481

481482
kfree(order);

0 commit comments

Comments
 (0)