diff options
| author | Davidlohr Bueso <dave@stgolabs.net> | 2014-09-29 09:14:25 -0400 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-09-30 03:10:02 -0400 |
| commit | a1229491006a3d55cc0d7e6d496be39915ccefdd (patch) | |
| tree | fec585adeb011833630c936148f4cf722d62e96d /kernel/locking | |
| parent | 219f800f99db6f4e43a582cb9e0d98931f13c012 (diff) | |
locktorture: Cannot hold read and write lock
... trigger an error if so.
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/locking')
| -rw-r--r-- | kernel/locking/locktorture.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c index 9e9cd111fb0f..b05dc46c4297 100644 --- a/kernel/locking/locktorture.c +++ b/kernel/locking/locktorture.c | |||
| @@ -453,14 +453,19 @@ static int lock_torture_writer(void *arg) | |||
| 453 | do { | 453 | do { |
| 454 | if ((torture_random(&rand) & 0xfffff) == 0) | 454 | if ((torture_random(&rand) & 0xfffff) == 0) |
| 455 | schedule_timeout_uninterruptible(1); | 455 | schedule_timeout_uninterruptible(1); |
| 456 | |||
| 456 | cxt.cur_ops->writelock(); | 457 | cxt.cur_ops->writelock(); |
| 457 | if (WARN_ON_ONCE(lock_is_write_held)) | 458 | if (WARN_ON_ONCE(lock_is_write_held)) |
| 458 | lwsp->n_lock_fail++; | 459 | lwsp->n_lock_fail++; |
| 459 | lock_is_write_held = 1; | 460 | lock_is_write_held = 1; |
| 461 | if (WARN_ON_ONCE(lock_is_read_held)) | ||
| 462 | lwsp->n_lock_fail++; /* rare, but... */ | ||
| 463 | |||
| 460 | lwsp->n_lock_acquired++; | 464 | lwsp->n_lock_acquired++; |
| 461 | cxt.cur_ops->write_delay(&rand); | 465 | cxt.cur_ops->write_delay(&rand); |
| 462 | lock_is_write_held = 0; | 466 | lock_is_write_held = 0; |
| 463 | cxt.cur_ops->writeunlock(); | 467 | cxt.cur_ops->writeunlock(); |
| 468 | |||
| 464 | stutter_wait("lock_torture_writer"); | 469 | stutter_wait("lock_torture_writer"); |
| 465 | } while (!torture_must_stop()); | 470 | } while (!torture_must_stop()); |
| 466 | torture_kthread_stopping("lock_torture_writer"); | 471 | torture_kthread_stopping("lock_torture_writer"); |
| @@ -482,12 +487,17 @@ static int lock_torture_reader(void *arg) | |||
| 482 | do { | 487 | do { |
| 483 | if ((torture_random(&rand) & 0xfffff) == 0) | 488 | if ((torture_random(&rand) & 0xfffff) == 0) |
| 484 | schedule_timeout_uninterruptible(1); | 489 | schedule_timeout_uninterruptible(1); |
| 490 | |||
| 485 | cxt.cur_ops->readlock(); | 491 | cxt.cur_ops->readlock(); |
| 486 | lock_is_read_held = 1; | 492 | lock_is_read_held = 1; |
| 493 | if (WARN_ON_ONCE(lock_is_write_held)) | ||
| 494 | lrsp->n_lock_fail++; /* rare, but... */ | ||
| 495 | |||
| 487 | lrsp->n_lock_acquired++; | 496 | lrsp->n_lock_acquired++; |
| 488 | cxt.cur_ops->read_delay(&rand); | 497 | cxt.cur_ops->read_delay(&rand); |
| 489 | lock_is_read_held = 0; | 498 | lock_is_read_held = 0; |
| 490 | cxt.cur_ops->readunlock(); | 499 | cxt.cur_ops->readunlock(); |
| 500 | |||
| 491 | stutter_wait("lock_torture_reader"); | 501 | stutter_wait("lock_torture_reader"); |
| 492 | } while (!torture_must_stop()); | 502 | } while (!torture_must_stop()); |
| 493 | torture_kthread_stopping("lock_torture_reader"); | 503 | torture_kthread_stopping("lock_torture_reader"); |
