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 | 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 | 1155 | /* Cache last used pipe for splice(): */ |
| 1153 | 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 | 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 | 125 | #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT |
| 125 | 126 | extern int arch_task_struct_size __read_mostly; |