diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cpuset.c | 3 | ||||
-rw-r--r-- | kernel/sched/core.c | 40 |
2 files changed, 39 insertions, 4 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 8c8bd652dd12..746d1eeb5dbe 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -2054,6 +2054,9 @@ static void scan_for_empty_cpusets(struct cpuset *root) | |||
2054 | * (of no affect) on systems that are actively using CPU hotplug | 2054 | * (of no affect) on systems that are actively using CPU hotplug |
2055 | * but making no active use of cpusets. | 2055 | * but making no active use of cpusets. |
2056 | * | 2056 | * |
2057 | * The only exception to this is suspend/resume, where we don't | ||
2058 | * modify cpusets at all. | ||
2059 | * | ||
2057 | * This routine ensures that top_cpuset.cpus_allowed tracks | 2060 | * This routine ensures that top_cpuset.cpus_allowed tracks |
2058 | * cpu_active_mask on each CPU hotplug (cpuhp) event. | 2061 | * cpu_active_mask on each CPU hotplug (cpuhp) event. |
2059 | * | 2062 | * |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 468bdd44c1ba..4c1d80c6b318 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -7097,34 +7097,66 @@ match2: | |||
7097 | mutex_unlock(&sched_domains_mutex); | 7097 | mutex_unlock(&sched_domains_mutex); |
7098 | } | 7098 | } |
7099 | 7099 | ||
7100 | static int num_cpus_frozen; /* used to mark begin/end of suspend/resume */ | ||
7101 | |||
7100 | /* | 7102 | /* |
7101 | * Update cpusets according to cpu_active mask. If cpusets are | 7103 | * Update cpusets according to cpu_active mask. If cpusets are |
7102 | * disabled, cpuset_update_active_cpus() becomes a simple wrapper | 7104 | * disabled, cpuset_update_active_cpus() becomes a simple wrapper |
7103 | * around partition_sched_domains(). | 7105 | * around partition_sched_domains(). |
7106 | * | ||
7107 | * If we come here as part of a suspend/resume, don't touch cpusets because we | ||
7108 | * want to restore it back to its original state upon resume anyway. | ||
7104 | */ | 7109 | */ |
7105 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, | 7110 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, |
7106 | void *hcpu) | 7111 | void *hcpu) |
7107 | { | 7112 | { |
7108 | switch (action & ~CPU_TASKS_FROZEN) { | 7113 | switch (action) { |
7114 | case CPU_ONLINE_FROZEN: | ||
7115 | case CPU_DOWN_FAILED_FROZEN: | ||
7116 | |||
7117 | /* | ||
7118 | * num_cpus_frozen tracks how many CPUs are involved in suspend | ||
7119 | * resume sequence. As long as this is not the last online | ||
7120 | * operation in the resume sequence, just build a single sched | ||
7121 | * domain, ignoring cpusets. | ||
7122 | */ | ||
7123 | num_cpus_frozen--; | ||
7124 | if (likely(num_cpus_frozen)) { | ||
7125 | partition_sched_domains(1, NULL, NULL); | ||
7126 | break; | ||
7127 | } | ||
7128 | |||
7129 | /* | ||
7130 | * This is the last CPU online operation. So fall through and | ||
7131 | * restore the original sched domains by considering the | ||
7132 | * cpuset configurations. | ||
7133 | */ | ||
7134 | |||
7109 | case CPU_ONLINE: | 7135 | case CPU_ONLINE: |
7110 | case CPU_DOWN_FAILED: | 7136 | case CPU_DOWN_FAILED: |
7111 | cpuset_update_active_cpus(); | 7137 | cpuset_update_active_cpus(); |
7112 | return NOTIFY_OK; | 7138 | break; |
7113 | default: | 7139 | default: |
7114 | return NOTIFY_DONE; | 7140 | return NOTIFY_DONE; |
7115 | } | 7141 | } |
7142 | return NOTIFY_OK; | ||
7116 | } | 7143 | } |
7117 | 7144 | ||
7118 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, | 7145 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, |
7119 | void *hcpu) | 7146 | void *hcpu) |
7120 | { | 7147 | { |
7121 | switch (action & ~CPU_TASKS_FROZEN) { | 7148 | switch (action) { |
7122 | case CPU_DOWN_PREPARE: | 7149 | case CPU_DOWN_PREPARE: |
7123 | cpuset_update_active_cpus(); | 7150 | cpuset_update_active_cpus(); |
7124 | return NOTIFY_OK; | 7151 | break; |
7152 | case CPU_DOWN_PREPARE_FROZEN: | ||
7153 | num_cpus_frozen++; | ||
7154 | partition_sched_domains(1, NULL, NULL); | ||
7155 | break; | ||
7125 | default: | 7156 | default: |
7126 | return NOTIFY_DONE; | 7157 | return NOTIFY_DONE; |
7127 | } | 7158 | } |
7159 | return NOTIFY_OK; | ||
7128 | } | 7160 | } |
7129 | 7161 | ||
7130 | void __init sched_init_smp(void) | 7162 | void __init sched_init_smp(void) |