Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/x86/mp_x86.c
Show First 20 Lines • Show All 1,626 Lines • ▼ Show 20 Lines | #endif /* COUNT_IPIS */ | ||||
/* | /* | ||||
* Reading the generation here allows greater parallelism | * Reading the generation here allows greater parallelism | ||||
* since invalidating the TLB is a serializing operation. | * since invalidating the TLB is a serializing operation. | ||||
*/ | */ | ||||
generation = smp_tlb_generation; | generation = smp_tlb_generation; | ||||
if (smp_tlb_pmap == kernel_pmap) | if (smp_tlb_pmap == kernel_pmap) | ||||
invltlb_glob(); | invltlb_glob(); | ||||
#ifdef __amd64__ | |||||
else | else | ||||
invltlb(); | invltlb(); | ||||
#endif | |||||
PCPU_SET(smp_tlb_done, generation); | PCPU_SET(smp_tlb_done, generation); | ||||
} | } | ||||
void | void | ||||
invlpg_handler(void) | invlpg_handler(void) | ||||
{ | { | ||||
uint32_t generation; | uint32_t generation; | ||||
#ifdef COUNT_XINVLTLB_HITS | #ifdef COUNT_XINVLTLB_HITS | ||||
xhits_pg[PCPU_GET(cpuid)]++; | xhits_pg[PCPU_GET(cpuid)]++; | ||||
#endif /* COUNT_XINVLTLB_HITS */ | #endif /* COUNT_XINVLTLB_HITS */ | ||||
#ifdef COUNT_IPIS | #ifdef COUNT_IPIS | ||||
(*ipi_invlpg_counts[PCPU_GET(cpuid)])++; | (*ipi_invlpg_counts[PCPU_GET(cpuid)])++; | ||||
#endif /* COUNT_IPIS */ | #endif /* COUNT_IPIS */ | ||||
generation = smp_tlb_generation; /* Overlap with serialization */ | generation = smp_tlb_generation; /* Overlap with serialization */ | ||||
#ifdef __i386__ | |||||
if (smp_tlb_pmap == kernel_pmap) | |||||
#endif | |||||
invlpg(smp_tlb_addr1); | invlpg(smp_tlb_addr1); | ||||
PCPU_SET(smp_tlb_done, generation); | PCPU_SET(smp_tlb_done, generation); | ||||
} | } | ||||
void | void | ||||
invlrng_handler(void) | invlrng_handler(void) | ||||
{ | { | ||||
vm_offset_t addr, addr2; | vm_offset_t addr, addr2; | ||||
uint32_t generation; | uint32_t generation; | ||||
#ifdef COUNT_XINVLTLB_HITS | #ifdef COUNT_XINVLTLB_HITS | ||||
xhits_rng[PCPU_GET(cpuid)]++; | xhits_rng[PCPU_GET(cpuid)]++; | ||||
#endif /* COUNT_XINVLTLB_HITS */ | #endif /* COUNT_XINVLTLB_HITS */ | ||||
#ifdef COUNT_IPIS | #ifdef COUNT_IPIS | ||||
(*ipi_invlrng_counts[PCPU_GET(cpuid)])++; | (*ipi_invlrng_counts[PCPU_GET(cpuid)])++; | ||||
#endif /* COUNT_IPIS */ | #endif /* COUNT_IPIS */ | ||||
addr = smp_tlb_addr1; | addr = smp_tlb_addr1; | ||||
addr2 = smp_tlb_addr2; | addr2 = smp_tlb_addr2; | ||||
generation = smp_tlb_generation; /* Overlap with serialization */ | generation = smp_tlb_generation; /* Overlap with serialization */ | ||||
#ifdef __i386__ | |||||
if (smp_tlb_pmap == kernel_pmap) | |||||
#endif | |||||
do { | do { | ||||
invlpg(addr); | invlpg(addr); | ||||
addr += PAGE_SIZE; | addr += PAGE_SIZE; | ||||
} while (addr < addr2); | } while (addr < addr2); | ||||
PCPU_SET(smp_tlb_done, generation); | PCPU_SET(smp_tlb_done, generation); | ||||
} | } |