diff options
Diffstat (limited to 'kernel/pid_namespace.c')
| -rw-r--r-- | kernel/pid_namespace.c | 19 | 
1 files changed, 1 insertions, 18 deletions
| diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index 25f3cf679b35..d70ab49d5b4a 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -249,24 +249,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)  		set_current_state(TASK_INTERRUPTIBLE);  		if (pid_ns->pid_allocated == init_pids)  			break; -		/* -		 * Release tasks_rcu_exit_srcu to avoid following deadlock: -		 * -		 * 1) TASK A unshare(CLONE_NEWPID) -		 * 2) TASK A fork() twice -> TASK B (child reaper for new ns) -		 *    and TASK C -		 * 3) TASK B exits, kills TASK C, waits for TASK A to reap it -		 * 4) TASK A calls synchronize_rcu_tasks() -		 *                   -> synchronize_srcu(tasks_rcu_exit_srcu) -		 * 5) *DEADLOCK* -		 * -		 * It is considered safe to release tasks_rcu_exit_srcu here -		 * because we assume the current task can not be concurrently -		 * reaped at this point. -		 */ -		exit_tasks_rcu_stop();  		schedule(); -		exit_tasks_rcu_start();  	}  	__set_current_state(TASK_RUNNING); @@ -278,7 +261,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)  }  #ifdef CONFIG_CHECKPOINT_RESTORE -static int pid_ns_ctl_handler(struct ctl_table *table, int write, +static int pid_ns_ctl_handler(const struct ctl_table *table, int write,  		void *buffer, size_t *lenp, loff_t *ppos)  {  	struct pid_namespace *pid_ns = task_active_pid_ns(current); |