mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	[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
					
				
					 3 changed files with 49 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -258,6 +258,7 @@ extern void rcu_init(void);
 | 
			
		|||
extern void rcu_check_callbacks(int cpu, int user);
 | 
			
		||||
extern void rcu_restart_cpu(int cpu);
 | 
			
		||||
extern long rcu_batches_completed(void);
 | 
			
		||||
extern long rcu_batches_completed_bh(void);
 | 
			
		||||
 | 
			
		||||
/* Exported interfaces */
 | 
			
		||||
extern void FASTCALL(call_rcu(struct rcu_head *head, 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -182,6 +182,15 @@ long rcu_batches_completed(void)
 | 
			
		|||
	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)
 | 
			
		||||
{
 | 
			
		||||
	if (atomic_dec_and_test(&rcu_barrier_cpu_count))
 | 
			
		||||
| 
						 | 
				
			
			@ -619,6 +628,7 @@ module_param(qlowmark, int, 0);
 | 
			
		|||
module_param(rsinterval, int, 0);
 | 
			
		||||
#endif
 | 
			
		||||
EXPORT_SYMBOL_GPL(rcu_batches_completed);
 | 
			
		||||
EXPORT_SYMBOL_GPL(rcu_batches_completed_bh);
 | 
			
		||||
EXPORT_SYMBOL_GPL(call_rcu);
 | 
			
		||||
EXPORT_SYMBOL_GPL(call_rcu_bh);
 | 
			
		||||
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_PARM_DESC(shuffle_interval, "Number of seconds between shuffles");
 | 
			
		||||
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 PRINTK_STRING(s) \
 | 
			
		||||
| 
						 | 
				
			
			@ -246,8 +246,44 @@ static struct rcu_torture_ops rcu_ops = {
 | 
			
		|||
	.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[] =
 | 
			
		||||
	{ &rcu_ops, NULL };
 | 
			
		||||
	{ &rcu_ops, &rcu_bh_ops, NULL };
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * RCU torture writer kthread.  Repeatedly substitutes a new structure
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue