--- /dev/null
+From 116d2f7496c51b2e02e8e4ecdd2bdf5fb9d5a641 Mon Sep 17 00:00:00 2001
+From: Prateek Sood <prsood@codeaurora.org>
+Date: Tue, 19 Dec 2017 12:56:57 +0530
+Subject: cgroup: Fix deadlock in cpu hotplug path
+
+From: Prateek Sood <prsood@codeaurora.org>
+
+commit 116d2f7496c51b2e02e8e4ecdd2bdf5fb9d5a641 upstream.
+
+Deadlock during cgroup migration from cpu hotplug path when a task T is
+being moved from source to destination cgroup.
+
+kworker/0:0
+cpuset_hotplug_workfn()
+ cpuset_hotplug_update_tasks()
+ hotplug_update_tasks_legacy()
+ remove_tasks_in_empty_cpuset()
+ cgroup_transfer_tasks() // stuck in iterator loop
+ cgroup_migrate()
+ cgroup_migrate_add_task()
+
+In cgroup_migrate_add_task() it checks for PF_EXITING flag of task T.
+Task T will not migrate to destination cgroup. css_task_iter_start()
+will keep pointing to task T in loop waiting for task T cg_list node
+to be removed.
+
+Task T
+do_exit()
+ exit_signals() // sets PF_EXITING
+ exit_task_namespaces()
+ switch_task_namespaces()
+ free_nsproxy()
+ put_mnt_ns()
+ drop_collected_mounts()
+ namespace_unlock()
+ synchronize_rcu()
+ _synchronize_rcu_expedited()
+ schedule_work() // on cpu0 low priority worker pool
+ wait_event() // waiting for work item to execute
+
+Task T inserted a work item in the worklist of cpu0 low priority
+worker pool. It is waiting for expedited grace period work item
+to execute. This work item will only be executed once kworker/0:0
+complete execution of cpuset_hotplug_workfn().
+
+kworker/0:0 ==> Task T ==>kworker/0:0
+
+In case of PF_EXITING task being migrated from source to destination
+cgroup, migrate next available task in source cgroup.
+
+Signed-off-by: Prateek Sood <prsood@codeaurora.org>
+Signed-off-by: Tejun Heo <tj@kernel.org>
+[AmitP: Upstream commit cherry-pick failed, so I picked the
+ backported changes from CAF/msm-4.9 tree instead:
+ https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=49b74f1696417b270c89cd893ca9f37088928078]
+Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+This patch can be cleanly applied and build tested on 4.4.y and 3.18.y
+as well but I couldn't find it in msm-4.4 and msm-3.18 trees. So this
+patch is really untested on those stable trees.
+Build tested on 4.9.131, 4.4.159 and 3.18.123 for ARCH=arm/arm64 allmodconfig.
+
+ kernel/cgroup.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -3669,7 +3669,11 @@ int cgroup_transfer_tasks(struct cgroup
+ */
+ do {
+ css_task_iter_start(&from->self, &it);
+- task = css_task_iter_next(&it);
++
++ do {
++ task = css_task_iter_next(&it);
++ } while (task && (task->flags & PF_EXITING));
++
+ if (task)
+ get_task_struct(task);
+ css_task_iter_end(&it);