Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Josh Triplett and committed by
Linus Torvalds
4b6c2cca 11a14701

+42 -3
+3 -2
Documentation/RCU/torture.txt
··· 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
+39 -1
kernel/rcutorture.c
··· 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