diff options
Diffstat (limited to 'kernel/cpuset.c')
| -rw-r--r-- | kernel/cpuset.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 647c77a88fcb..f76db9dcaa05 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -61,6 +61,14 @@ | |||
| 61 | #include <linux/cgroup.h> | 61 | #include <linux/cgroup.h> |
| 62 | 62 | ||
| 63 | /* | 63 | /* |
| 64 | * Workqueue for cpuset related tasks. | ||
| 65 | * | ||
| 66 | * Using kevent workqueue may cause deadlock when memory_migrate | ||
| 67 | * is set. So we create a separate workqueue thread for cpuset. | ||
| 68 | */ | ||
| 69 | static struct workqueue_struct *cpuset_wq; | ||
| 70 | |||
| 71 | /* | ||
| 64 | * Tracks how many cpusets are currently defined in system. | 72 | * Tracks how many cpusets are currently defined in system. |
| 65 | * When there is only one cpuset (the root cpuset) we can | 73 | * When there is only one cpuset (the root cpuset) we can |
| 66 | * short circuit some hooks. | 74 | * short circuit some hooks. |
| @@ -568,7 +576,7 @@ update_domain_attr_tree(struct sched_domain_attr *dattr, struct cpuset *c) | |||
| 568 | * load balancing domains (sched domains) as specified by that partial | 576 | * load balancing domains (sched domains) as specified by that partial |
| 569 | * partition. | 577 | * partition. |
| 570 | * | 578 | * |
| 571 | * See "What is sched_load_balance" in Documentation/cpusets.txt | 579 | * See "What is sched_load_balance" in Documentation/cgroups/cpusets.txt |
| 572 | * for a background explanation of this. | 580 | * for a background explanation of this. |
| 573 | * | 581 | * |
| 574 | * Does not return errors, on the theory that the callers of this | 582 | * Does not return errors, on the theory that the callers of this |
| @@ -831,7 +839,7 @@ static DECLARE_WORK(rebuild_sched_domains_work, do_rebuild_sched_domains); | |||
| 831 | */ | 839 | */ |
| 832 | static void async_rebuild_sched_domains(void) | 840 | static void async_rebuild_sched_domains(void) |
| 833 | { | 841 | { |
| 834 | schedule_work(&rebuild_sched_domains_work); | 842 | queue_work(cpuset_wq, &rebuild_sched_domains_work); |
| 835 | } | 843 | } |
| 836 | 844 | ||
| 837 | /* | 845 | /* |
| @@ -2111,6 +2119,9 @@ void __init cpuset_init_smp(void) | |||
| 2111 | 2119 | ||
| 2112 | hotcpu_notifier(cpuset_track_online_cpus, 0); | 2120 | hotcpu_notifier(cpuset_track_online_cpus, 0); |
| 2113 | hotplug_memory_notifier(cpuset_track_online_nodes, 10); | 2121 | hotplug_memory_notifier(cpuset_track_online_nodes, 10); |
| 2122 | |||
| 2123 | cpuset_wq = create_singlethread_workqueue("cpuset"); | ||
| 2124 | BUG_ON(!cpuset_wq); | ||
| 2114 | } | 2125 | } |
| 2115 | 2126 | ||
| 2116 | /** | 2127 | /** |
