rcu: refine structure rcu_node field for rcu boost
PATCH 1/1 rcu: refine structure rcu_node field for rcu boost
Do not allocate space for rcu boost field when
RCU BOOST is not configured.
kernel/rcu/tree.h +3 -0
@@ -129,6 +129,7 @@ struct rcu_node {/* if there is no such task. If there */ /* is no current expedited grace period, */ /* then there can cannot be any such task. */ +#ifdef CONFIG_RCU_BOOST struct list_head *boost_tasks;/* Pointer to first task that needs to be */ /* priority boosted, or NULL if no priority */
@@ -153,6 +154,8 @@ struct rcu_node {/* Number of tasks boosted for expedited GP. */ unsigned long n_normal_boosts;/* Number of tasks boosted for normal GP. */ +#endif /* #ifdef CONFIG_RCU_BOOST*/ +#ifdef CONFIG_RCU_NOCB_CPU struct swait_queue_head nocb_gp_wq[2 ];/* Place for rcu_nocb_kthread() to wait GP. */
kernel/rcu/tree_plugin.h +2 -0
@@ -506,8 +506,10 @@ void rcu_read_unlock_special(struct task_struct *t)if (IS_ENABLED (CONFIG_RCU_BOOST )) {/* Snapshot ->boost_mtx ownership w/rnp->lock held. */ drop_boost_mutex =rt_mutex_owner (&rnp->boost_mtx) == t; +#ifdef CONFIG_RCU_BOOST if (&t->rcu_node_entry == rnp->boost_tasks) rnp->boost_tasks = np; +#endif }/*
Signature · 1 line
2.7.4
Quoted 4 lines · Changcheng
Do not allocate space for rcu boost field when
RCU BOOST is not configured.Signed-off-by Liu Changcheng <[email protected]>
The added #ifdef in rcu_read_unlock_special() is a deal-breaker. Just out of curiosity, is this decrease in storage measurable at the system level?
Thanx, Paul
Quoted 39 lines
kernel/rcu/tree.h +3
-0@@ -129,6 +129,7 @@ struct rcu_node {/* if there is no such task. If there */ /* is no current expedited grace period, */ /* then there can cannot be any such task. */ +#ifdef CONFIG_RCU_BOOST struct list_head *boost_tasks;/* Pointer to first task that needs to be */ /* priority boosted, or NULL if no priority */ @@ -153,6 +154,8 @@ struct rcu_node {/* Number of tasks boosted for expedited GP. */ unsigned long n_normal_boosts;/* Number of tasks boosted for normal GP. */ +#endif /* #ifdef CONFIG_RCU_BOOST*/ +#ifdef CONFIG_RCU_NOCB_CPU struct swait_queue_head nocb_gp_wq[2 ];/* Place for rcu_nocb_kthread() to wait GP. */ kernel/rcu/tree_plugin.h +2
-0@@ -506,8 +506,10 @@ void rcu_read_unlock_special(struct task_struct *t)if (IS_ENABLED (CONFIG_RCU_BOOST )) {/* Snapshot ->boost_mtx ownership w/rnp->lock held. */ drop_boost_mutex =rt_mutex_owner (&rnp->boost_mtx) == t; +#ifdef CONFIG_RCU_BOOST if (&t->rcu_node_entry == rnp->boost_tasks) rnp->boost_tasks = np; +#endif }/* Signature · 1 line
2.7.4
Hi Paul,
This patch is optional.
1. It's true that the added #ifdef in rcu_read_unlock_special is a bad breaker. The patch follows the current code e.g. CONFIG_PROVE_RCU
2. Haven't evaluated the performance in system. Studying RCU and found that boost feature field is allocated in in the rcu_node structure even rcu boost isn't enabled.
B.R.
Changcheng
Quoted 53 lines · Paul E. McKenney
Quoted 4 lines · Changcheng
Do not allocate space for rcu boost field when
RCU BOOST is not configured.Signed-off-by Liu Changcheng <[email protected]>The added #ifdef in
rcu_read_unlock_special()is a deal-breaker. Just out of curiosity, is this decrease in storage measurable at the system level?Thanx, Paul
Quoted 39 lines
kernel/rcu/tree.h +3
-0@@ -129,6 +129,7 @@ struct rcu_node {/* if there is no such task. If there */ /* is no current expedited grace period, */ /* then there can cannot be any such task. */ +#ifdef CONFIG_RCU_BOOST struct list_head *boost_tasks;/* Pointer to first task that needs to be */ /* priority boosted, or NULL if no priority */ @@ -153,6 +154,8 @@ struct rcu_node {/* Number of tasks boosted for expedited GP. */ unsigned long n_normal_boosts;/* Number of tasks boosted for normal GP. */ +#endif /* #ifdef CONFIG_RCU_BOOST*/ +#ifdef CONFIG_RCU_NOCB_CPU struct swait_queue_head nocb_gp_wq[2 ];/* Place for rcu_nocb_kthread() to wait GP. */ kernel/rcu/tree_plugin.h +2
-0@@ -506,8 +506,10 @@ void rcu_read_unlock_special(struct task_struct *t)if (IS_ENABLED (CONFIG_RCU_BOOST )) {/* Snapshot ->boost_mtx ownership w/rnp->lock held. */ drop_boost_mutex =rt_mutex_owner (&rnp->boost_mtx) == t; +#ifdef CONFIG_RCU_BOOST if (&t->rcu_node_entry == rnp->boost_tasks) rnp->boost_tasks = np; +#endif }/* Signature · 1 line
2.7.4