|
@@ -2249,27 +2249,18 @@ static inline void threadgroup_change_end(struct task_struct *tsk)
|
|
|
*
|
|
|
* 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
|
|
|
- * perform exec. This is useful for cases where the threadgroup needs to
|
|
|
- * stay stable across blockable operations.
|
|
|
+ * change ->group_leader/pid. This is useful for cases where the threadgroup
|
|
|
+ * needs to stay stable across blockable operations.
|
|
|
*
|
|
|
* 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.
|
|
|
*
|
|
|
- * During exec, a task goes and puts its thread group through unusual
|
|
|
- * changes. After de-threading, exclusive access is assumed to resources
|
|
|
- * which are usually shared by tasks in the same group - e.g. sighand may
|
|
|
- * be replaced with a new one. Also, the exec'ing task takes over group
|
|
|
- * leader role including its pid. Exclude these changes while locked by
|
|
|
- * grabbing cred_guard_mutex which is used to synchronize exec path.
|
|
|
+ * de_thread() does threadgroup_change_{begin|end}() when a non-leader
|
|
|
+ * sub-thread becomes a new leader.
|
|
|
*/
|
|
|
static inline void threadgroup_lock(struct task_struct *tsk)
|
|
|
{
|
|
|
- /*
|
|
|
- * exec uses exit for de-threading nesting group_rwsem inside
|
|
|
- * cred_guard_mutex. Grab cred_guard_mutex first.
|
|
|
- */
|
|
|
- mutex_lock(&tsk->signal->cred_guard_mutex);
|
|
|
down_write(&tsk->signal->group_rwsem);
|
|
|
}
|
|
|
|
|
@@ -2282,7 +2273,6 @@ static inline void threadgroup_lock(struct task_struct *tsk)
|
|
|
static inline void threadgroup_unlock(struct task_struct *tsk)
|
|
|
{
|
|
|
up_write(&tsk->signal->group_rwsem);
|
|
|
- mutex_unlock(&tsk->signal->cred_guard_mutex);
|
|
|
}
|
|
|
#else
|
|
|
static inline void threadgroup_change_begin(struct task_struct *tsk) {}
|