diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-06-12 16:30:25 -0400 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2014-07-09 12:15:01 -0400 |
| commit | abaa93d9e1de2c29297e69ddba8ddd38f15064cf (patch) | |
| tree | 127f64c80be6f30fed7265d42cbfc5b449853618 /include/linux | |
| parent | 48bd8e9b82a750b983823f391c67e70553757afa (diff) | |
rcu: Simplify priority boosting by putting rt_mutex in rcu_node
RCU priority boosting currently checks for boosting via a pointer in
task_struct. However, this is not needed: As Oleg noted, if the
rt_mutex is placed in the rcu_node instead of on the booster's stack,
the boostee can simply check it see if it owns the lock. This commit
makes this change, shrinking task_struct by one pointer and the kernel
by thirteen lines.
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/init_task.h | 9 | ||||
| -rw-r--r-- | include/linux/sched.h | 6 |
2 files changed, 1 insertions, 14 deletions
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 6df7f9fe0d01..2bb4c4f3531a 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -102,12 +102,6 @@ extern struct group_info init_groups; | |||
| 102 | #define INIT_IDS | 102 | #define INIT_IDS |
| 103 | #endif | 103 | #endif |
| 104 | 104 | ||
| 105 | #ifdef CONFIG_RCU_BOOST | ||
| 106 | #define INIT_TASK_RCU_BOOST() \ | ||
| 107 | .rcu_boost_mutex = NULL, | ||
| 108 | #else | ||
| 109 | #define INIT_TASK_RCU_BOOST() | ||
| 110 | #endif | ||
| 111 | #ifdef CONFIG_TREE_PREEMPT_RCU | 105 | #ifdef CONFIG_TREE_PREEMPT_RCU |
| 112 | #define INIT_TASK_RCU_TREE_PREEMPT() \ | 106 | #define INIT_TASK_RCU_TREE_PREEMPT() \ |
| 113 | .rcu_blocked_node = NULL, | 107 | .rcu_blocked_node = NULL, |
| @@ -119,8 +113,7 @@ extern struct group_info init_groups; | |||
| 119 | .rcu_read_lock_nesting = 0, \ | 113 | .rcu_read_lock_nesting = 0, \ |
| 120 | .rcu_read_unlock_special = 0, \ | 114 | .rcu_read_unlock_special = 0, \ |
| 121 | .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \ | 115 | .rcu_node_entry = LIST_HEAD_INIT(tsk.rcu_node_entry), \ |
| 122 | INIT_TASK_RCU_TREE_PREEMPT() \ | 116 | INIT_TASK_RCU_TREE_PREEMPT() |
| 123 | INIT_TASK_RCU_BOOST() | ||
| 124 | #else | 117 | #else |
| 125 | #define INIT_TASK_RCU_PREEMPT(tsk) | 118 | #define INIT_TASK_RCU_PREEMPT(tsk) |
| 126 | #endif | 119 | #endif |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 306f4f0c987a..3cfbc05e66e6 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1270,9 +1270,6 @@ struct task_struct { | |||
| 1270 | #ifdef CONFIG_TREE_PREEMPT_RCU | 1270 | #ifdef CONFIG_TREE_PREEMPT_RCU |
| 1271 | struct rcu_node *rcu_blocked_node; | 1271 | struct rcu_node *rcu_blocked_node; |
| 1272 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 1272 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 1273 | #ifdef CONFIG_RCU_BOOST | ||
| 1274 | struct rt_mutex *rcu_boost_mutex; | ||
| 1275 | #endif /* #ifdef CONFIG_RCU_BOOST */ | ||
| 1276 | 1273 | ||
| 1277 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) | 1274 | #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) |
| 1278 | struct sched_info sched_info; | 1275 | struct sched_info sched_info; |
| @@ -2009,9 +2006,6 @@ static inline void rcu_copy_process(struct task_struct *p) | |||
| 2009 | #ifdef CONFIG_TREE_PREEMPT_RCU | 2006 | #ifdef CONFIG_TREE_PREEMPT_RCU |
| 2010 | p->rcu_blocked_node = NULL; | 2007 | p->rcu_blocked_node = NULL; |
| 2011 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 2008 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 2012 | #ifdef CONFIG_RCU_BOOST | ||
| 2013 | p->rcu_boost_mutex = NULL; | ||
| 2014 | #endif /* #ifdef CONFIG_RCU_BOOST */ | ||
| 2015 | INIT_LIST_HEAD(&p->rcu_node_entry); | 2009 | INIT_LIST_HEAD(&p->rcu_node_entry); |
| 2016 | } | 2010 | } |
| 2017 | 2011 | ||
