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 4603b9d8f30..0533a688ce2 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6405,16 +6405,26 @@ static void __sdt_free(const struct cpumask *cpu_map)  		struct sd_data *sdd = &tl->data;  		for_each_cpu(j, cpu_map) { -			struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j); -			if (sd && (sd->flags & SD_OVERLAP)) -				free_sched_groups(sd->groups, 0); -			kfree(*per_cpu_ptr(sdd->sd, j)); -			kfree(*per_cpu_ptr(sdd->sg, j)); -			kfree(*per_cpu_ptr(sdd->sgp, j)); +			struct sched_domain *sd; + +			if (sdd->sd) { +				sd = *per_cpu_ptr(sdd->sd, j); +				if (sd && (sd->flags & SD_OVERLAP)) +					free_sched_groups(sd->groups, 0); +				kfree(*per_cpu_ptr(sdd->sd, j)); +			} + +			if (sdd->sg) +				kfree(*per_cpu_ptr(sdd->sg, j)); +			if (sdd->sgp) +				kfree(*per_cpu_ptr(sdd->sgp, j));  		}  		free_percpu(sdd->sd); +		sdd->sd = NULL;  		free_percpu(sdd->sg); +		sdd->sg = NULL;  		free_percpu(sdd->sgp); +		sdd->sgp = NULL;  	}  }  |