hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/include/linux/sched/task.h
....@@ -61,7 +61,9 @@
6161 extern void sched_dead(struct task_struct *p);
6262
6363 void __noreturn do_task_dead(void);
64
+void __noreturn make_task_dead(int signr);
6465
66
+extern void mm_cache_init(void);
6567 extern void proc_caches_init(void);
6668
6769 extern void fork_init(void);
....@@ -88,7 +90,6 @@
8890 extern pid_t kernel_clone(struct kernel_clone_args *kargs);
8991 struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node);
9092 struct task_struct *fork_idle(int);
91
-struct mm_struct *copy_init_mm(void);
9293 extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
9394 extern long kernel_wait4(pid_t, int __user *, int, struct rusage *);
9495 int kernel_wait(pid_t pid, int *stat);
....@@ -109,10 +110,36 @@
109110 }
110111
111112 extern void __put_task_struct(struct task_struct *t);
113
+extern void __put_task_struct_rcu_cb(struct rcu_head *rhp);
112114
113115 static inline void put_task_struct(struct task_struct *t)
114116 {
115
- if (refcount_dec_and_test(&t->usage))
117
+ if (!refcount_dec_and_test(&t->usage))
118
+ return;
119
+
120
+ /*
121
+ * under PREEMPT_RT, we can't call put_task_struct
122
+ * in atomic context because it will indirectly
123
+ * acquire sleeping locks.
124
+ *
125
+ * call_rcu() will schedule delayed_put_task_struct_rcu()
126
+ * to be called in process context.
127
+ *
128
+ * __put_task_struct() is called when
129
+ * refcount_dec_and_test(&t->usage) succeeds.
130
+ *
131
+ * This means that it can't "conflict" with
132
+ * put_task_struct_rcu_user() which abuses ->rcu the same
133
+ * way; rcu_users has a reference so task->usage can't be
134
+ * zero after rcu_users 1 -> 0 transition.
135
+ *
136
+ * delayed_free_task() also uses ->rcu, but it is only called
137
+ * when it fails to fork a process. Therefore, there is no
138
+ * way it can conflict with put_task_struct().
139
+ */
140
+ if (IS_ENABLED(CONFIG_PREEMPT_RT) && !preemptible())
141
+ call_rcu(&t->rcu, __put_task_struct_rcu_cb);
142
+ else
116143 __put_task_struct(t);
117144 }
118145