diff options
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r-- | kernel/sched/core.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 4603b9d8f30a..0533a688ce22 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -6405,16 +6405,26 @@ static void __sdt_free(const struct cpumask *cpu_map) | |||
6405 | struct sd_data *sdd = &tl->data; | 6405 | struct sd_data *sdd = &tl->data; |
6406 | 6406 | ||
6407 | for_each_cpu(j, cpu_map) { | 6407 | for_each_cpu(j, cpu_map) { |
6408 | struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j); | 6408 | struct sched_domain *sd; |
6409 | if (sd && (sd->flags & SD_OVERLAP)) | 6409 | |
6410 | free_sched_groups(sd->groups, 0); | 6410 | if (sdd->sd) { |
6411 | kfree(*per_cpu_ptr(sdd->sd, j)); | 6411 | sd = *per_cpu_ptr(sdd->sd, j); |
6412 | kfree(*per_cpu_ptr(sdd->sg, j)); | 6412 | if (sd && (sd->flags & SD_OVERLAP)) |
6413 | kfree(*per_cpu_ptr(sdd->sgp, j)); | 6413 | free_sched_groups(sd->groups, 0); |
6414 | kfree(*per_cpu_ptr(sdd->sd, j)); | ||
6415 | } | ||
6416 | |||
6417 | if (sdd->sg) | ||
6418 | kfree(*per_cpu_ptr(sdd->sg, j)); | ||
6419 | if (sdd->sgp) | ||
6420 | kfree(*per_cpu_ptr(sdd->sgp, j)); | ||
6414 | } | 6421 | } |
6415 | free_percpu(sdd->sd); | 6422 | free_percpu(sdd->sd); |
6423 | sdd->sd = NULL; | ||
6416 | free_percpu(sdd->sg); | 6424 | free_percpu(sdd->sg); |
6425 | sdd->sg = NULL; | ||
6417 | free_percpu(sdd->sgp); | 6426 | free_percpu(sdd->sgp); |
6427 | sdd->sgp = NULL; | ||
6418 | } | 6428 | } |
6419 | } | 6429 | } |
6420 | 6430 | ||