|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 01/18] xen/arm64: flushtlb: Reduce scope of barrier for local TLB flush
Hi Julien,
On 12/12/2022 10:55, Julien Grall wrote:
>
>
> From: Julien Grall <jgrall@xxxxxxxxxx>
>
> Per D5-4929 in ARM DDI 0487H.a:
> "A DSB NSH is sufficient to ensure completion of TLB maintenance
> instructions that apply to a single PE. A DSB ISH is sufficient to
> ensure completion of TLB maintenance instructions that apply to PEs
> in the same Inner Shareable domain.
> "
>
> This means barrier after local TLB flushes could be reduced to
> non-shareable.
>
> Note that the scope of the barrier in the workaround has not been
> changed because Linux v6.1-rc8 is also using 'ish' and I couldn't
> find anything in the Neoverse N1 suggesting that a 'nsh' would
> be sufficient.
>
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
>
> ---
>
> I have used an older version of the Arm Arm because the explanation
> in the latest (ARM DDI 0487I.a) is less obvious. I reckon the paragraph
> about DSB in D8.13.8 is missing the shareability. But this is implied
> in B2.3.11:
>
> "If the required access types of the DSB is reads and writes, the
> following instructions issued by PEe before the DSB are complete for
> the required shareability domain:
>
> [...]
>
> — All TLB maintenance instructions.
> "
>
> Changes in v3:
> - Patch added
> ---
> xen/arch/arm/include/asm/arm64/flushtlb.h | 27 ++++++++++++++---------
> 1 file changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/xen/arch/arm/include/asm/arm64/flushtlb.h
> b/xen/arch/arm/include/asm/arm64/flushtlb.h
> index 7c5431518741..39d429ace552 100644
> --- a/xen/arch/arm/include/asm/arm64/flushtlb.h
> +++ b/xen/arch/arm/include/asm/arm64/flushtlb.h
> @@ -12,8 +12,9 @@
> * ARM64_WORKAROUND_REPEAT_TLBI:
Before this line, in the same comment, we state DSB ISHST. This should also be
changed
to reflect the change done by this patch.
> * Modification of the translation table for a virtual address might lead to
> * read-after-read ordering violation.
> - * The workaround repeats TLBI+DSB operation for all the TLB flush
> operations.
> - * While this is stricly not necessary, we don't want to take any risk.
> + * The workaround repeats TLBI+DSB ISH operation for all the TLB flush
> + * operations. While this is stricly not necessary, we don't want to
s/stricly/strictly/
> + * take any risk.
> *
> * For Xen page-tables the ISB will discard any instructions fetched
> * from the old mappings.
> @@ -21,38 +22,42 @@
> * For the Stage-2 page-tables the ISB ensures the completion of the DSB
> * (and therefore the TLB invalidation) before continuing. So we know
> * the TLBs cannot contain an entry for a mapping we may have removed.
> + *
> + * Note that for local TLB flush, using non-shareable (nsh) is sufficient
> + * (see D5-4929 in ARM DDI 0487H.a). Althougth, the memory barrier in
s/Althougth/Although/
> + * for the workaround is left as inner-shareable to match with Linux.
So for the workaround we stay with DSB ISH. But ...
> */
> -#define TLB_HELPER(name, tlbop) \
> +#define TLB_HELPER(name, tlbop, sh) \
> static inline void name(void) \
> { \
> asm volatile( \
> - "dsb ishst;" \
> + "dsb " # sh "st;" \
> "tlbi " # tlbop ";" \
> ALTERNATIVE( \
> "nop; nop;", \
> - "dsb ish;" \
> + "dsb " # sh ";" \
... you do not adhere to this.
> "tlbi " # tlbop ";", \
> ARM64_WORKAROUND_REPEAT_TLBI, \
> CONFIG_ARM64_WORKAROUND_REPEAT_TLBI) \
> - "dsb ish;" \
> + "dsb " # sh ";" \
> "isb;" \
> : : : "memory"); \
> }
>
> /* Flush local TLBs, current VMID only. */
> -TLB_HELPER(flush_guest_tlb_local, vmalls12e1);
> +TLB_HELPER(flush_guest_tlb_local, vmalls12e1, nsh);
>
> /* Flush innershareable TLBs, current VMID only */
> -TLB_HELPER(flush_guest_tlb, vmalls12e1is);
> +TLB_HELPER(flush_guest_tlb, vmalls12e1is, ish);
>
> /* Flush local TLBs, all VMIDs, non-hypervisor mode */
> -TLB_HELPER(flush_all_guests_tlb_local, alle1);
> +TLB_HELPER(flush_all_guests_tlb_local, alle1, nsh);
>
> /* Flush innershareable TLBs, all VMIDs, non-hypervisor mode */
> -TLB_HELPER(flush_all_guests_tlb, alle1is);
> +TLB_HELPER(flush_all_guests_tlb, alle1is, ish);
>
> /* Flush all hypervisor mappings from the TLB of the local processor. */
> -TLB_HELPER(flush_xen_tlb_local, alle2);
> +TLB_HELPER(flush_xen_tlb_local, alle2, nsh);
>
> /* Flush TLB of local processor for address va. */
> static inline void __flush_xen_tlb_one_local(vaddr_t va)
> --
> 2.38.1
>
With the remarks fixed:
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |