drm/edid/firmware: Add built-in edid/1280x720.bin firmware
[platform/kernel/linux-starfive.git] / kernel / pid_namespace.c
index f4f8cb0..fc21c5d 100644 (file)
@@ -244,7 +244,24 @@ 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);