Skip to content

Commit cfa92b6

Browse files
johnstultz-workingomolnar
authored andcommitted
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/895ef450-4fb3-5d29-a6ad-790657106a5a@intel.com/ Reported-by: Li Zhijian <zhijianx.li@intel.com> Signed-off-by: John Stultz <jstultz@google.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230922043616.19282-4-jstultz@google.com
1 parent bccdd80 commit cfa92b6

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

kernel/locking/test-ww_mutex.c

Lines changed: 5 additions & 4 deletions
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)