aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/locking/test-ww_mutex.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/locking/test-ww_mutex.c')
-rw-r--r--kernel/locking/test-ww_mutex.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/locking/test-ww_mutex.c b/kernel/locking/test-ww_mutex.c
index 0be047dbd897..65a3b7e55b9f 100644
--- a/kernel/locking/test-ww_mutex.c
+++ b/kernel/locking/test-ww_mutex.c
@@ -260,7 +260,7 @@ static void test_cycle_work(struct work_struct *work)
260{ 260{
261 struct test_cycle *cycle = container_of(work, typeof(*cycle), work); 261 struct test_cycle *cycle = container_of(work, typeof(*cycle), work);
262 struct ww_acquire_ctx ctx; 262 struct ww_acquire_ctx ctx;
263 int err; 263 int err, erra = 0;
264 264
265 ww_acquire_init(&ctx, &ww_class); 265 ww_acquire_init(&ctx, &ww_class);
266 ww_mutex_lock(&cycle->a_mutex, &ctx); 266 ww_mutex_lock(&cycle->a_mutex, &ctx);
@@ -270,17 +270,19 @@ static void test_cycle_work(struct work_struct *work)
270 270
271 err = ww_mutex_lock(cycle->b_mutex, &ctx); 271 err = ww_mutex_lock(cycle->b_mutex, &ctx);
272 if (err == -EDEADLK) { 272 if (err == -EDEADLK) {
273 err = 0;
273 ww_mutex_unlock(&cycle->a_mutex); 274 ww_mutex_unlock(&cycle->a_mutex);
274 ww_mutex_lock_slow(cycle->b_mutex, &ctx); 275 ww_mutex_lock_slow(cycle->b_mutex, &ctx);
275 err = ww_mutex_lock(&cycle->a_mutex, &ctx); 276 erra = ww_mutex_lock(&cycle->a_mutex, &ctx);
276 } 277 }
277 278
278 if (!err) 279 if (!err)
279 ww_mutex_unlock(cycle->b_mutex); 280 ww_mutex_unlock(cycle->b_mutex);
280 ww_mutex_unlock(&cycle->a_mutex); 281 if (!erra)
282 ww_mutex_unlock(&cycle->a_mutex);
281 ww_acquire_fini(&ctx); 283 ww_acquire_fini(&ctx);
282 284
283 cycle->result = err; 285 cycle->result = err ?: erra;
284} 286}
285 287
286static int __test_cycle(unsigned int nthreads) 288static int __test_cycle(unsigned int nthreads)