*/
 static const struct cpumask *shared_cache_mask(int cpu)
 {
-       return cpu_l2_cache_mask(cpu);
+       return per_cpu(cpu_l2_cache_map, cpu);
 }
 
 #ifdef CONFIG_SCHED_SMT
 void start_secondary(void *unused)
 {
        unsigned int cpu = smp_processor_id();
-       struct cpumask *(*sibling_mask)(int) = cpu_sibling_mask;
 
        mmgrab(&init_mm);
        current->active_mm = &init_mm;
        /* Update topology CPU masks */
        add_cpu_to_masks(cpu);
 
-       if (has_big_cores)
-               sibling_mask = cpu_smallcore_mask;
        /*
         * Check for any shared caches. Note that this must be done on a
         * per-core basis because one core in the pair might be disabled.
         */
-       if (!cpumask_equal(cpu_l2_cache_mask(cpu), sibling_mask(cpu)))
-               shared_caches = true;
+       if (!shared_caches) {
+               struct cpumask *(*sibling_mask)(int) = cpu_sibling_mask;
+               struct cpumask *mask = cpu_l2_cache_mask(cpu);
+
+               if (has_big_cores)
+                       sibling_mask = cpu_smallcore_mask;
+
+               if (cpumask_weight(mask) > cpumask_weight(sibling_mask(cpu)))
+                       shared_caches = true;
+       }
 
        set_numa_node(numa_cpu_lookup_table[cpu]);
        set_numa_mem(local_memory_node(numa_cpu_lookup_table[cpu]));