Add a count of the number of RCU users (currently 1) of the task struct so that we can later add the scheduler case and get rid of the very subtle task_rcu_dereference(), and just use rcu_dereference(). As suggested by Oleg have the count overlap rcu_head so that no additional space in task_struct is required.
Showing the changes to include/linux (2 of 4 files). Show all
Unified · Split
| @@ -1147,7 +1147,10 @@ struct task_struct { · 1146 unmodified lines | |||
| 1147 | 1147 | ||
| 1148 | struct tlbflush_unmap_batch tlb_ubc; | 1148 | struct tlbflush_unmap_batch tlb_ubc; |
| 1149 | 1149 | ||
| 1150 | struct rcu_head rcu; | 1150 | union { |
| 1151 | refcount_t rcu_users; | ||
| 1152 | struct rcu_head rcu; | ||
| 1153 | }; | ||
| 1151 | 1154 | ||
| 1152 | /* Cache last used pipe for splice(): */ | 1155 | /* Cache last used pipe for splice(): */ |
| 1153 | struct pipe_inode_info *splice_pipe; | 1156 | struct pipe_inode_info *splice_pipe; |
| @@ -120,6 +120,7 @@ static inline void put_task_struct(struct task_struct *t) · 119 unmodified lines | |||
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | struct task_struct *task_rcu_dereference(struct task_struct **ptask); | 122 | struct task_struct *task_rcu_dereference(struct task_struct **ptask); |
| 123 | void put_task_struct_rcu_user(struct task_struct *task); | ||
| 123 | 124 | ||
| 124 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT | 125 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT |
| 125 | extern int arch_task_struct_size __read_mostly; | 126 | extern int arch_task_struct_size __read_mostly; |