struct cpumask  mask;
 };
 
-static DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid);
+/*
+ * __x2apic_send_IPI_mask() possibly needs to read
+ * x86_cpu_to_logical_apicid for all online cpus in a sequential way.
+ * Using per cpu variable would cost one cache line per cpu.
+ */
+static u32 *x86_cpu_to_logical_apicid __read_mostly;
+
 static DEFINE_PER_CPU(cpumask_var_t, ipi_mask);
-static DEFINE_PER_CPU(struct cluster_mask *, cluster_masks);
+static DEFINE_PER_CPU_READ_MOSTLY(struct cluster_mask *, cluster_masks);
 static struct cluster_mask *cluster_hotplug_mask;
 
 static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 
 static void x2apic_send_IPI(int cpu, int vector)
 {
-       u32 dest = per_cpu(x86_cpu_to_logical_apicid, cpu);
+       u32 dest = x86_cpu_to_logical_apicid[cpu];
 
        /* x2apic MSRs are special and need a special fence: */
        weak_wrmsr_fence();
 
                dest = 0;
                for_each_cpu_and(clustercpu, tmpmsk, &cmsk->mask)
-                       dest |= per_cpu(x86_cpu_to_logical_apicid, clustercpu);
+                       dest |= x86_cpu_to_logical_apicid[clustercpu];
 
                if (!dest)
                        continue;
 
 static u32 x2apic_calc_apicid(unsigned int cpu)
 {
-       return per_cpu(x86_cpu_to_logical_apicid, cpu);
+       return x86_cpu_to_logical_apicid[cpu];
 }
 
 static void init_x2apic_ldr(void)
        u32 cluster, apicid = apic_read(APIC_LDR);
        unsigned int cpu;
 
-       this_cpu_write(x86_cpu_to_logical_apicid, apicid);
+       x86_cpu_to_logical_apicid[smp_processor_id()] = apicid;
 
        if (cmsk)
                goto update;
 
 static int x2apic_cluster_probe(void)
 {
+       u32 slots;
+
        if (!x2apic_mode)
                return 0;
 
+       slots = max_t(u32, L1_CACHE_BYTES/sizeof(u32), nr_cpu_ids);
+       x86_cpu_to_logical_apicid = kcalloc(slots, sizeof(u32), GFP_KERNEL);
+       if (!x86_cpu_to_logical_apicid)
+               return 0;
+
        if (cpuhp_setup_state(CPUHP_X2APIC_PREPARE, "x86/x2apic:prepare",
                              x2apic_prepare_cpu, x2apic_dead_cpu) < 0) {
                pr_err("Failed to register X2APIC_PREPARE\n");
+               kfree(x86_cpu_to_logical_apicid);
+               x86_cpu_to_logical_apicid = NULL;
                return 0;
        }
        init_x2apic_ldr();