|
@@ -9,6 +9,7 @@
|
|
|
#include <linux/device.h>
|
|
|
#include <linux/bootmem.h>
|
|
|
#include <linux/sched.h>
|
|
|
+#include <linux/kthread.h>
|
|
|
#include <linux/workqueue.h>
|
|
|
#include <linux/cpu.h>
|
|
|
#include <linux/smp.h>
|
|
@@ -229,9 +230,20 @@ void arch_update_cpu_topology(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void topology_work_fn(struct work_struct *work)
|
|
|
+static int topology_kthread(void *data)
|
|
|
{
|
|
|
arch_reinit_sched_domains();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void topology_work_fn(struct work_struct *work)
|
|
|
+{
|
|
|
+ /* We can't call arch_reinit_sched_domains() from a multi-threaded
|
|
|
+ * workqueue context since it may deadlock in case of cpu hotplug.
|
|
|
+ * So we have to create a kernel thread in order to call
|
|
|
+ * arch_reinit_sched_domains().
|
|
|
+ */
|
|
|
+ kthread_run(topology_kthread, NULL, "topology_update");
|
|
|
}
|
|
|
|
|
|
void topology_schedule_update(void)
|