diff options
Diffstat (limited to 'drivers/base/cacheinfo.c')
| -rw-r--r-- | drivers/base/cacheinfo.c | 26 | 
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index bba3482ddeb8..cbae8be1fe52 100644 --- a/drivers/base/cacheinfo.c +++ b/drivers/base/cacheinfo.c @@ -388,6 +388,16 @@ static int cache_shared_cpu_map_setup(unsigned int cpu)  				continue;/* skip if itself or no cacheinfo */  			for (sib_index = 0; sib_index < cache_leaves(i); sib_index++) {  				sib_leaf = per_cpu_cacheinfo_idx(i, sib_index); + +				/* +				 * Comparing cache IDs only makes sense if the leaves +				 * belong to the same cache level of same type. Skip +				 * the check if level and type do not match. +				 */ +				if (sib_leaf->level != this_leaf->level || +				    sib_leaf->type != this_leaf->type) +					continue; +  				if (cache_leaves_are_shared(this_leaf, sib_leaf)) {  					cpumask_set_cpu(cpu, &sib_leaf->shared_cpu_map);  					cpumask_set_cpu(i, &this_leaf->shared_cpu_map); @@ -400,11 +410,14 @@ static int cache_shared_cpu_map_setup(unsigned int cpu)  			coherency_max_size = this_leaf->coherency_line_size;  	} +	/* shared_cpu_map is now populated for the cpu */ +	this_cpu_ci->cpu_map_populated = true;  	return 0;  }  static void cache_shared_cpu_map_remove(unsigned int cpu)  { +	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);  	struct cacheinfo *this_leaf, *sib_leaf;  	unsigned int sibling, index, sib_index; @@ -419,6 +432,16 @@ static void cache_shared_cpu_map_remove(unsigned int cpu)  			for (sib_index = 0; sib_index < cache_leaves(sibling); sib_index++) {  				sib_leaf = per_cpu_cacheinfo_idx(sibling, sib_index); + +				/* +				 * Comparing cache IDs only makes sense if the leaves +				 * belong to the same cache level of same type. Skip +				 * the check if level and type do not match. +				 */ +				if (sib_leaf->level != this_leaf->level || +				    sib_leaf->type != this_leaf->type) +					continue; +  				if (cache_leaves_are_shared(this_leaf, sib_leaf)) {  					cpumask_clear_cpu(cpu, &sib_leaf->shared_cpu_map);  					cpumask_clear_cpu(sibling, &this_leaf->shared_cpu_map); @@ -427,6 +450,9 @@ static void cache_shared_cpu_map_remove(unsigned int cpu)  			}  		}  	} + +	/* cpu is no longer populated in the shared map */ +	this_cpu_ci->cpu_map_populated = false;  }  static void free_cache_attributes(unsigned int cpu)  | 
