#include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/kmod.h>
+#include <linux/kthread.h>
 #include <linux/list.h>
 #include <linux/mempolicy.h>
 #include <linux/mm.h>
 {
        struct css_task_iter it;
        struct task_struct *task;
+       bool top_cs = cs == &top_cpuset;
 
        css_task_iter_start(&cs->css, 0, &it);
-       while ((task = css_task_iter_next(&it)))
+       while ((task = css_task_iter_next(&it))) {
+               /*
+                * Percpu kthreads in top_cpuset are ignored
+                */
+               if (top_cs && (task->flags & PF_KTHREAD) &&
+                   kthread_is_per_cpu(task))
+                       continue;
                set_cpus_allowed_ptr(task, cs->effective_cpus);
+       }
        css_task_iter_end(&it);
 }
 
                update_flag(CS_CPU_EXCLUSIVE, cs, 0);
        }
 
-       /*
-        * Update cpumask of parent's tasks except when it is the top
-        * cpuset as some system daemons cannot be mapped to other CPUs.
-        */
-       if (parent != &top_cpuset)
-               update_tasks_cpumask(parent);
+       update_tasks_cpumask(parent);
 
        if (parent->child_ecpus_count)
                update_sibling_cpumasks(parent, cs, &tmpmask);