Properly serialize the global shootdown with the instruction
stream of the local processor. Also explicitly invalidate the ALAT. This is done on the other CPUs in the coherence domain by virtue of the ptc.ga instruction, but does not apply to the local CPU.
This commit is contained in:
parent
ff13f23f84
commit
acd1d4d28e
@ -559,10 +559,14 @@ pmap_invalidate_page(vm_offset_t va)
|
||||
} while (sem != tag);
|
||||
|
||||
ia64_ptc_ga(va, PAGE_SHIFT << 2);
|
||||
ia64_mf();
|
||||
ia64_srlz_i();
|
||||
|
||||
/* PTC.G leave exclusive */
|
||||
atomic_store_rel_long(&pmap_ptc_g_sem, 0);
|
||||
|
||||
ia64_invala();
|
||||
|
||||
intr_restore(is);
|
||||
critical_exit();
|
||||
}
|
||||
|
@ -266,7 +266,7 @@ ia64_ptc_e(uint64_t v)
|
||||
static __inline void
|
||||
ia64_ptc_g(uint64_t va, uint64_t log2size)
|
||||
{
|
||||
__asm __volatile("ptc.g %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size));
|
||||
__asm __volatile("ptc.g %0,%1;;" :: "r"(va), "r"(log2size));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -275,7 +275,7 @@ ia64_ptc_g(uint64_t va, uint64_t log2size)
|
||||
static __inline void
|
||||
ia64_ptc_ga(uint64_t va, uint64_t log2size)
|
||||
{
|
||||
__asm __volatile("ptc.ga %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size));
|
||||
__asm __volatile("ptc.ga %0,%1;;" :: "r"(va), "r"(log2size));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -287,6 +287,15 @@ ia64_ptc_l(uint64_t va, uint64_t log2size)
|
||||
__asm __volatile("ptc.l %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size));
|
||||
}
|
||||
|
||||
/*
|
||||
* Invalidate the ALAT on the local processor.
|
||||
*/
|
||||
static __inline void
|
||||
ia64_invala(void)
|
||||
{
|
||||
__asm __volatile("invala;;");
|
||||
}
|
||||
|
||||
/*
|
||||
* Unordered memory load.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user