aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cpuset.c3
-rw-r--r--kernel/sched/core.c40
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
7100static 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 */
7105static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, 7110static 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
7118static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, 7145static 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
7130void __init sched_init_smp(void) 7162void __init sched_init_smp(void)