|
@@ -459,16 +459,26 @@ u16 __read_mostly tlb_lld_4k[NR_INFO];
|
|
u16 __read_mostly tlb_lld_2m[NR_INFO];
|
|
u16 __read_mostly tlb_lld_2m[NR_INFO];
|
|
u16 __read_mostly tlb_lld_4m[NR_INFO];
|
|
u16 __read_mostly tlb_lld_4m[NR_INFO];
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * tlb_flushall_shift shows the balance point in replacing cr3 write
|
|
|
|
+ * with multiple 'invlpg'. It will do this replacement when
|
|
|
|
+ * flush_tlb_lines <= active_lines/2^tlb_flushall_shift.
|
|
|
|
+ * If tlb_flushall_shift is -1, means the replacement will be disabled.
|
|
|
|
+ */
|
|
|
|
+s8 __read_mostly tlb_flushall_shift = -1;
|
|
|
|
+
|
|
void __cpuinit cpu_detect_tlb(struct cpuinfo_x86 *c)
|
|
void __cpuinit cpu_detect_tlb(struct cpuinfo_x86 *c)
|
|
{
|
|
{
|
|
if (this_cpu->c_detect_tlb)
|
|
if (this_cpu->c_detect_tlb)
|
|
this_cpu->c_detect_tlb(c);
|
|
this_cpu->c_detect_tlb(c);
|
|
|
|
|
|
printk(KERN_INFO "Last level iTLB entries: 4KB %d, 2MB %d, 4MB %d\n" \
|
|
printk(KERN_INFO "Last level iTLB entries: 4KB %d, 2MB %d, 4MB %d\n" \
|
|
- "Last level dTLB entries: 4KB %d, 2MB %d, 4MB %d\n",
|
|
|
|
|
|
+ "Last level dTLB entries: 4KB %d, 2MB %d, 4MB %d\n" \
|
|
|
|
+ "tlb_flushall_shift is 0x%x\n",
|
|
tlb_lli_4k[ENTRIES], tlb_lli_2m[ENTRIES],
|
|
tlb_lli_4k[ENTRIES], tlb_lli_2m[ENTRIES],
|
|
tlb_lli_4m[ENTRIES], tlb_lld_4k[ENTRIES],
|
|
tlb_lli_4m[ENTRIES], tlb_lld_4k[ENTRIES],
|
|
- tlb_lld_2m[ENTRIES], tlb_lld_4m[ENTRIES]);
|
|
|
|
|
|
+ tlb_lld_2m[ENTRIES], tlb_lld_4m[ENTRIES],
|
|
|
|
+ tlb_flushall_shift);
|
|
}
|
|
}
|
|
|
|
|
|
void __cpuinit detect_ht(struct cpuinfo_x86 *c)
|
|
void __cpuinit detect_ht(struct cpuinfo_x86 *c)
|