diff options
| -rw-r--r-- | kernel/cpuset.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index c27e53326bef..c08585ad996b 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -325,8 +325,7 @@ static struct file_system_type cpuset_fs_type = {  /*   * Return in pmask the portion of a cpusets's cpus_allowed that   * are online.  If none are online, walk up the cpuset hierarchy - * until we find one that does have some online cpus.  The top - * cpuset always has some cpus online. + * until we find one that does have some online cpus.   *   * One way or another, we guarantee to return some non-empty subset   * of cpu_online_mask. @@ -335,8 +334,20 @@ static struct file_system_type cpuset_fs_type = {   */  static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)  { -	while (!cpumask_intersects(cs->effective_cpus, cpu_online_mask)) +	while (!cpumask_intersects(cs->effective_cpus, cpu_online_mask)) {  		cs = parent_cs(cs); +		if (unlikely(!cs)) { +			/* +			 * The top cpuset doesn't have any online cpu as a +			 * consequence of a race between cpuset_hotplug_work +			 * and cpu hotplug notifier.  But we know the top +			 * cpuset's effective_cpus is on its way to to be +			 * identical to cpu_online_mask. +			 */ +			cpumask_copy(pmask, cpu_online_mask); +			return; +		} +	}  	cpumask_and(pmask, cs->effective_cpus, cpu_online_mask);  }  | 

