|
@@ -58,6 +58,7 @@ struct sched_param {
|
|
|
#include <linux/uidgid.h>
|
|
|
#include <linux/gfp.h>
|
|
|
#include <linux/magic.h>
|
|
|
+#include <linux/cgroup-defs.h>
|
|
|
|
|
|
#include <asm/processor.h>
|
|
|
|
|
@@ -2648,53 +2649,33 @@ static inline void unlock_task_sighand(struct task_struct *tsk,
|
|
|
spin_unlock_irqrestore(&tsk->sighand->siglock, *flags);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_CGROUPS
|
|
|
-static inline void threadgroup_change_begin(struct task_struct *tsk)
|
|
|
-{
|
|
|
- down_read(&tsk->signal->group_rwsem);
|
|
|
-}
|
|
|
-static inline void threadgroup_change_end(struct task_struct *tsk)
|
|
|
-{
|
|
|
- up_read(&tsk->signal->group_rwsem);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
- * threadgroup_lock - lock threadgroup
|
|
|
- * @tsk: member task of the threadgroup to lock
|
|
|
- *
|
|
|
- * Lock the threadgroup @tsk belongs to. No new task is allowed to enter
|
|
|
- * and member tasks aren't allowed to exit (as indicated by PF_EXITING) or
|
|
|
- * change ->group_leader/pid. This is useful for cases where the threadgroup
|
|
|
- * needs to stay stable across blockable operations.
|
|
|
+ * threadgroup_change_begin - mark the beginning of changes to a threadgroup
|
|
|
+ * @tsk: task causing the changes
|
|
|
*
|
|
|
- * fork and exit paths explicitly call threadgroup_change_{begin|end}() for
|
|
|
- * synchronization. While held, no new task will be added to threadgroup
|
|
|
- * and no existing live task will have its PF_EXITING set.
|
|
|
- *
|
|
|
- * de_thread() does threadgroup_change_{begin|end}() when a non-leader
|
|
|
- * sub-thread becomes a new leader.
|
|
|
+ * All operations which modify a threadgroup - a new thread joining the
|
|
|
+ * group, death of a member thread (the assertion of PF_EXITING) and
|
|
|
+ * exec(2) dethreading the process and replacing the leader - are wrapped
|
|
|
+ * by threadgroup_change_{begin|end}(). This is to provide a place which
|
|
|
+ * subsystems needing threadgroup stability can hook into for
|
|
|
+ * synchronization.
|
|
|
*/
|
|
|
-static inline void threadgroup_lock(struct task_struct *tsk)
|
|
|
+static inline void threadgroup_change_begin(struct task_struct *tsk)
|
|
|
{
|
|
|
- down_write(&tsk->signal->group_rwsem);
|
|
|
+ might_sleep();
|
|
|
+ cgroup_threadgroup_change_begin(tsk);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * threadgroup_unlock - unlock threadgroup
|
|
|
- * @tsk: member task of the threadgroup to unlock
|
|
|
+ * threadgroup_change_end - mark the end of changes to a threadgroup
|
|
|
+ * @tsk: task causing the changes
|
|
|
*
|
|
|
- * Reverse threadgroup_lock().
|
|
|
+ * See threadgroup_change_begin().
|
|
|
*/
|
|
|
-static inline void threadgroup_unlock(struct task_struct *tsk)
|
|
|
+static inline void threadgroup_change_end(struct task_struct *tsk)
|
|
|
{
|
|
|
- up_write(&tsk->signal->group_rwsem);
|
|
|
+ cgroup_threadgroup_change_end(tsk);
|
|
|
}
|
|
|
-#else
|
|
|
-static inline void threadgroup_change_begin(struct task_struct *tsk) {}
|
|
|
-static inline void threadgroup_change_end(struct task_struct *tsk) {}
|
|
|
-static inline void threadgroup_lock(struct task_struct *tsk) {}
|
|
|
-static inline void threadgroup_unlock(struct task_struct *tsk) {}
|
|
|
-#endif
|
|
|
|
|
|
#ifndef __HAVE_THREAD_FUNCTIONS
|
|
|
|