diff options
Diffstat (limited to 'kernel/rcutorture.c')
| -rw-r--r-- | kernel/rcutorture.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index c96b5edd6ed1..4d1c3d247127 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
| @@ -66,7 +66,7 @@ MODULE_PARM_DESC(test_no_idle_hz, "Test support for tickless idle CPUs"); | |||
| 66 | module_param(shuffle_interval, int, 0); | 66 | module_param(shuffle_interval, int, 0); |
| 67 | MODULE_PARM_DESC(shuffle_interval, "Number of seconds between shuffles"); | 67 | MODULE_PARM_DESC(shuffle_interval, "Number of seconds between shuffles"); |
| 68 | module_param(torture_type, charp, 0); | 68 | module_param(torture_type, charp, 0); |
| 69 | MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu)"); | 69 | MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu, rcu_bh)"); |
| 70 | 70 | ||
| 71 | #define TORTURE_FLAG "-torture:" | 71 | #define TORTURE_FLAG "-torture:" |
| 72 | #define PRINTK_STRING(s) \ | 72 | #define PRINTK_STRING(s) \ |
| @@ -246,8 +246,44 @@ static struct rcu_torture_ops rcu_ops = { | |||
| 246 | .name = "rcu" | 246 | .name = "rcu" |
| 247 | }; | 247 | }; |
| 248 | 248 | ||
| 249 | /* | ||
| 250 | * Definitions for rcu_bh torture testing. | ||
| 251 | */ | ||
| 252 | |||
| 253 | static int rcu_bh_torture_read_lock(void) | ||
| 254 | { | ||
| 255 | rcu_read_lock_bh(); | ||
| 256 | return 0; | ||
| 257 | } | ||
| 258 | |||
| 259 | static void rcu_bh_torture_read_unlock(int idx) | ||
| 260 | { | ||
| 261 | rcu_read_unlock_bh(); | ||
| 262 | } | ||
| 263 | |||
| 264 | static int rcu_bh_torture_completed(void) | ||
| 265 | { | ||
| 266 | return rcu_batches_completed_bh(); | ||
| 267 | } | ||
| 268 | |||
| 269 | static void rcu_bh_torture_deferred_free(struct rcu_torture *p) | ||
| 270 | { | ||
| 271 | call_rcu_bh(&p->rtort_rcu, rcu_torture_cb); | ||
| 272 | } | ||
| 273 | |||
| 274 | static struct rcu_torture_ops rcu_bh_ops = { | ||
| 275 | .init = NULL, | ||
| 276 | .cleanup = NULL, | ||
| 277 | .readlock = rcu_bh_torture_read_lock, | ||
| 278 | .readunlock = rcu_bh_torture_read_unlock, | ||
| 279 | .completed = rcu_bh_torture_completed, | ||
| 280 | .deferredfree = rcu_bh_torture_deferred_free, | ||
| 281 | .stats = NULL, | ||
| 282 | .name = "rcu_bh" | ||
| 283 | }; | ||
| 284 | |||
| 249 | static struct rcu_torture_ops *torture_ops[] = | 285 | static struct rcu_torture_ops *torture_ops[] = |
| 250 | { &rcu_ops, NULL }; | 286 | { &rcu_ops, &rcu_bh_ops, NULL }; |
| 251 | 287 | ||
| 252 | /* | 288 | /* |
| 253 | * RCU torture writer kthread. Repeatedly substitutes a new structure | 289 | * RCU torture writer kthread. Repeatedly substitutes a new structure |
