forked from Minki/linux
[PATCH] rcutorture: add call_rcu_bh() operations
Add operations for the call_rcu_bh() variant of RCU. Also add an rcu_batches_completed_bh() function, which is needed by rcutorture. Signed-off-by: Paul E. McKenney <paulmck@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
72e9bb5492
commit
c32e066057
@ -258,6 +258,7 @@ extern void rcu_init(void);
|
|||||||
extern void rcu_check_callbacks(int cpu, int user);
|
extern void rcu_check_callbacks(int cpu, int user);
|
||||||
extern void rcu_restart_cpu(int cpu);
|
extern void rcu_restart_cpu(int cpu);
|
||||||
extern long rcu_batches_completed(void);
|
extern long rcu_batches_completed(void);
|
||||||
|
extern long rcu_batches_completed_bh(void);
|
||||||
|
|
||||||
/* Exported interfaces */
|
/* Exported interfaces */
|
||||||
extern void FASTCALL(call_rcu(struct rcu_head *head,
|
extern void FASTCALL(call_rcu(struct rcu_head *head,
|
||||||
|
@ -182,6 +182,15 @@ long rcu_batches_completed(void)
|
|||||||
return rcu_ctrlblk.completed;
|
return rcu_ctrlblk.completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the number of RCU batches processed thus far. Useful
|
||||||
|
* for debug and statistics.
|
||||||
|
*/
|
||||||
|
long rcu_batches_completed_bh(void)
|
||||||
|
{
|
||||||
|
return rcu_bh_ctrlblk.completed;
|
||||||
|
}
|
||||||
|
|
||||||
static void rcu_barrier_callback(struct rcu_head *notused)
|
static void rcu_barrier_callback(struct rcu_head *notused)
|
||||||
{
|
{
|
||||||
if (atomic_dec_and_test(&rcu_barrier_cpu_count))
|
if (atomic_dec_and_test(&rcu_barrier_cpu_count))
|
||||||
@ -619,6 +628,7 @@ module_param(qlowmark, int, 0);
|
|||||||
module_param(rsinterval, int, 0);
|
module_param(rsinterval, int, 0);
|
||||||
#endif
|
#endif
|
||||||
EXPORT_SYMBOL_GPL(rcu_batches_completed);
|
EXPORT_SYMBOL_GPL(rcu_batches_completed);
|
||||||
|
EXPORT_SYMBOL_GPL(rcu_batches_completed_bh);
|
||||||
EXPORT_SYMBOL_GPL(call_rcu);
|
EXPORT_SYMBOL_GPL(call_rcu);
|
||||||
EXPORT_SYMBOL_GPL(call_rcu_bh);
|
EXPORT_SYMBOL_GPL(call_rcu_bh);
|
||||||
EXPORT_SYMBOL_GPL(synchronize_rcu);
|
EXPORT_SYMBOL_GPL(synchronize_rcu);
|
||||||
|
@ -66,7 +66,7 @@ MODULE_PARM_DESC(test_no_idle_hz, "Test support for tickless idle CPUs");
|
|||||||
module_param(shuffle_interval, int, 0);
|
module_param(shuffle_interval, int, 0);
|
||||||
MODULE_PARM_DESC(shuffle_interval, "Number of seconds between shuffles");
|
MODULE_PARM_DESC(shuffle_interval, "Number of seconds between shuffles");
|
||||||
module_param(torture_type, charp, 0);
|
module_param(torture_type, charp, 0);
|
||||||
MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu)");
|
MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu, rcu_bh)");
|
||||||
|
|
||||||
#define TORTURE_FLAG "-torture:"
|
#define TORTURE_FLAG "-torture:"
|
||||||
#define PRINTK_STRING(s) \
|
#define PRINTK_STRING(s) \
|
||||||
@ -246,8 +246,44 @@ static struct rcu_torture_ops rcu_ops = {
|
|||||||
.name = "rcu"
|
.name = "rcu"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Definitions for rcu_bh torture testing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int rcu_bh_torture_read_lock(void)
|
||||||
|
{
|
||||||
|
rcu_read_lock_bh();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rcu_bh_torture_read_unlock(int idx)
|
||||||
|
{
|
||||||
|
rcu_read_unlock_bh();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rcu_bh_torture_completed(void)
|
||||||
|
{
|
||||||
|
return rcu_batches_completed_bh();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rcu_bh_torture_deferred_free(struct rcu_torture *p)
|
||||||
|
{
|
||||||
|
call_rcu_bh(&p->rtort_rcu, rcu_torture_cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct rcu_torture_ops rcu_bh_ops = {
|
||||||
|
.init = NULL,
|
||||||
|
.cleanup = NULL,
|
||||||
|
.readlock = rcu_bh_torture_read_lock,
|
||||||
|
.readunlock = rcu_bh_torture_read_unlock,
|
||||||
|
.completed = rcu_bh_torture_completed,
|
||||||
|
.deferredfree = rcu_bh_torture_deferred_free,
|
||||||
|
.stats = NULL,
|
||||||
|
.name = "rcu_bh"
|
||||||
|
};
|
||||||
|
|
||||||
static struct rcu_torture_ops *torture_ops[] =
|
static struct rcu_torture_ops *torture_ops[] =
|
||||||
{ &rcu_ops, NULL };
|
{ &rcu_ops, &rcu_bh_ops, NULL };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RCU torture writer kthread. Repeatedly substitutes a new structure
|
* RCU torture writer kthread. Repeatedly substitutes a new structure
|
||||||
|
Loading…
Reference in New Issue
Block a user