Commit 4b6c2cca6eef9cc4a15350bf1c61839e12e08b84

Authored by Josh Triplett
Committed by Linus Torvalds
1 parent 11a147013e

[PATCH] rcu: add sched torture type to rcutorture

Implement torture testing for the "sched" variant of RCU, which uses
preempt_disable, preempt_enable, and synchronize_sched.

Signed-off-by: Josh Triplett <josh@freedesktop.org>
Acked-by: Paul E. McKenney <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 2 changed files with 42 additions and 3 deletions Side-by-side Diff

Documentation/RCU/torture.txt
... ... @@ -56,8 +56,9 @@
56 56 torture_type The type of RCU to test: "rcu" for the rcu_read_lock() API,
57 57 "rcu_sync" for rcu_read_lock() with synchronous reclamation,
58 58 "rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for
59   - rcu_read_lock_bh() with synchronous reclamation, and "srcu"
60   - for the "srcu_read_lock()" API.
  59 + rcu_read_lock_bh() with synchronous reclamation, "srcu" for
  60 + the "srcu_read_lock()" API, and "sched" for the use of
  61 + preempt_disable() together with synchronize_sched().
61 62  
62 63 verbose Enable debug printk()s. Default is disabled.
63 64  
... ... @@ -464,9 +464,47 @@
464 464 .name = "srcu"
465 465 };
466 466  
  467 +/*
  468 + * Definitions for sched torture testing.
  469 + */
  470 +
  471 +static int sched_torture_read_lock(void)
  472 +{
  473 + preempt_disable();
  474 + return 0;
  475 +}
  476 +
  477 +static void sched_torture_read_unlock(int idx)
  478 +{
  479 + preempt_enable();
  480 +}
  481 +
  482 +static int sched_torture_completed(void)
  483 +{
  484 + return 0;
  485 +}
  486 +
  487 +static void sched_torture_synchronize(void)
  488 +{
  489 + synchronize_sched();
  490 +}
  491 +
  492 +static struct rcu_torture_ops sched_ops = {
  493 + .init = rcu_sync_torture_init,
  494 + .cleanup = NULL,
  495 + .readlock = sched_torture_read_lock,
  496 + .readdelay = rcu_read_delay, /* just reuse rcu's version. */
  497 + .readunlock = sched_torture_read_unlock,
  498 + .completed = sched_torture_completed,
  499 + .deferredfree = rcu_sync_torture_deferred_free,
  500 + .sync = sched_torture_synchronize,
  501 + .stats = NULL,
  502 + .name = "sched"
  503 +};
  504 +
467 505 static struct rcu_torture_ops *torture_ops[] =
468 506 { &rcu_ops, &rcu_sync_ops, &rcu_bh_ops, &rcu_bh_sync_ops, &srcu_ops,
469   - NULL };
  507 + &sched_ops, NULL };
470 508  
471 509 /*
472 510 * RCU torture writer kthread. Repeatedly substitutes a new structure