mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	rcu: Simplify unboosting checks
This is a port of commit #82e78d80 from TREE_PREEMPT_RCU to TINY_PREEMPT_RCU. This commit uses the fact that current->rcu_boost_mutex is set any time that the RCU_READ_UNLOCK_BOOSTED flag is set in the current->rcu_read_unlock_special bitmask. This allows tests of the bit to be changed to tests of the pointer, which in turn allows the RCU_READ_UNLOCK_BOOSTED flag to be eliminated. Please note that the check of current->rcu_read_unlock_special need not change because any time that RCU_READ_UNLOCK_BOOSTED was set, so was RCU_READ_UNLOCK_BLOCKED. Therefore, __rcu_read_unlock() can continue testing current->rcu_read_unlock_special for non-zero, as before. Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									8762705ad4
								
							
						
					
					
						commit
						1aa03f1188
					
				
					 2 changed files with 7 additions and 6 deletions
				
			
		|  | @ -1864,8 +1864,7 @@ extern void task_clear_jobctl_pending(struct task_struct *task, | |||
| #ifdef CONFIG_PREEMPT_RCU | ||||
| 
 | ||||
| #define RCU_READ_UNLOCK_BLOCKED (1 << 0) /* blocked while in RCU read-side. */ | ||||
| #define RCU_READ_UNLOCK_BOOSTED (1 << 1) /* boosted while in RCU read-side. */ | ||||
| #define RCU_READ_UNLOCK_NEED_QS (1 << 2) /* RCU core needs CPU response. */ | ||||
| #define RCU_READ_UNLOCK_NEED_QS (1 << 1) /* RCU core needs CPU response. */ | ||||
| 
 | ||||
| static inline void rcu_copy_process(struct task_struct *p) | ||||
| { | ||||
|  |  | |||
|  | @ -318,7 +318,6 @@ static int rcu_boost(void) | |||
| 	t = container_of(tb, struct task_struct, rcu_node_entry); | ||||
| 	rt_mutex_init_proxy_locked(&mtx, t); | ||||
| 	t->rcu_boost_mutex = &mtx; | ||||
| 	t->rcu_read_unlock_special |= RCU_READ_UNLOCK_BOOSTED; | ||||
| 	raw_local_irq_restore(flags); | ||||
| 	rt_mutex_lock(&mtx); | ||||
| 	rt_mutex_unlock(&mtx);  /* Keep lockdep happy. */ | ||||
|  | @ -550,6 +549,9 @@ static noinline void rcu_read_unlock_special(struct task_struct *t) | |||
| 	int empty_exp; | ||||
| 	unsigned long flags; | ||||
| 	struct list_head *np; | ||||
| #ifdef CONFIG_RCU_BOOST | ||||
| 	struct rt_mutex *rbmp = NULL; | ||||
| #endif /* #ifdef CONFIG_RCU_BOOST */ | ||||
| 	int special; | ||||
| 
 | ||||
| 	/*
 | ||||
|  | @ -615,10 +617,10 @@ static noinline void rcu_read_unlock_special(struct task_struct *t) | |||
| 	} | ||||
| #ifdef CONFIG_RCU_BOOST | ||||
| 	/* Unboost self if was boosted. */ | ||||
| 	if (special & RCU_READ_UNLOCK_BOOSTED) { | ||||
| 		t->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_BOOSTED; | ||||
| 		rt_mutex_unlock(t->rcu_boost_mutex); | ||||
| 	if (t->rcu_boost_mutex != NULL) { | ||||
| 		rbmp = t->rcu_boost_mutex; | ||||
| 		t->rcu_boost_mutex = NULL; | ||||
| 		rt_mutex_unlock(rbmp); | ||||
| 	} | ||||
| #endif /* #ifdef CONFIG_RCU_BOOST */ | ||||
| 	local_irq_restore(flags); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Paul E. McKenney
						Paul E. McKenney