mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: flushtlb: Reduce scope of barrier for the TLB range flush
At the moment, flush_xen_tlb_range_va{,_local}() are using system
wide memory barrier. This is quite expensive and unnecessary.
For the local version, a non-shareable barrier is sufficient.
For the SMP version, an inner-shareable barrier is sufficient.
Furthermore, the initial barrier only needs to a store barrier.
For the full explanation of the sequence see asm/arm{32,64}/flushtlb.h.
Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
Reviewed-by: Henry Wang <Henry.Wang@arm.com>
This commit is contained in:
1 parent
d56c70b6e1
commit
5e5d1a43e1
1 file changed
+6
-4
@@ -37,13 +37,14 @@ static inline void flush_xen_tlb_range_va_local(vaddr_t va,
|
||||
{
|
||||
vaddr_t end = va + size;
|
||||
|
||||
dsb(sy); /* Ensure preceding are visible */
|
||||
/* See asm/arm{32,64}/flushtlb.h for the explanation of the sequence. */
|
||||
dsb(nshst); /* Ensure prior page-tables updates have completed */
|
||||
while ( va < end )
|
||||
{
|
||||
__flush_xen_tlb_one_local(va);
|
||||
va += PAGE_SIZE;
|
||||
}
|
||||
dsb(sy); /* Ensure completion of the TLB flush */
|
||||
dsb(nsh); /* Ensure the TLB invalidation has completed */
|
||||
isb();
|
||||
}
|
||||
|
||||
@@ -56,13 +57,14 @@ static inline void flush_xen_tlb_range_va(vaddr_t va,
|
||||
{
|
||||
vaddr_t end = va + size;
|
||||
|
||||
dsb(sy); /* Ensure preceding are visible */
|
||||
/* See asm/arm{32,64}/flushtlb.h for the explanation of the sequence. */
|
||||
dsb(ishst); /* Ensure prior page-tables updates have completed */
|
||||
while ( va < end )
|
||||
{
|
||||
__flush_xen_tlb_one(va);
|
||||
va += PAGE_SIZE;
|
||||
}
|
||||
dsb(sy); /* Ensure completion of the TLB flush */
|
||||
dsb(ish); /* Ensure the TLB invalidation has completed */
|
||||
isb();
|
||||
}
|
||||
|
||||
|
||||