|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/6] x86: support cache-writeback in flush_area_local() et al
On Wed, May 03, 2023 at 11:44:39AM +0200, Jan Beulich wrote:
> The majority of the present callers really aren't after invalidating
> cache contents, but only after writeback. Make this available by simply
> extending the FLUSH_CACHE handling accordingly. No feature checks are
> required here: cache_writeback() falls back to cache_flush() as
> necessary, while WBNOINVD degenerates to WBINVD on older hardware.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> v2: FLUSH_WRITEBACK -> FLUSH_CACHE_WRITEBACK.
>
> --- a/xen/arch/x86/flushtlb.c
> +++ b/xen/arch/x86/flushtlb.c
> @@ -232,7 +232,7 @@ unsigned int flush_area_local(const void
> if ( flags & FLUSH_HVM_ASID_CORE )
> hvm_flush_guest_tlbs();
>
> - if ( flags & FLUSH_CACHE )
> + if ( flags & (FLUSH_CACHE | FLUSH_CACHE_WRITEBACK) )
> {
> const struct cpuinfo_x86 *c = ¤t_cpu_data;
> unsigned long sz = 0;
> @@ -245,13 +245,16 @@ unsigned int flush_area_local(const void
> c->x86_clflush_size && c->x86_cache_size && sz &&
> ((sz >> 10) < c->x86_cache_size) )
> {
> - cache_flush(va, sz);
> - flags &= ~FLUSH_CACHE;
> + if ( flags & FLUSH_CACHE )
> + cache_flush(va, sz);
> + else
> + cache_writeback(va, sz);
> + flags &= ~(FLUSH_CACHE | FLUSH_CACHE_WRITEBACK);
> }
> - else
> - {
> + else if ( flags & FLUSH_CACHE )
> wbinvd();
> - }
> + else
> + wbnoinvd();
> }
>
> if ( flags & FLUSH_ROOT_PGTBL )
> --- a/xen/arch/x86/include/asm/flushtlb.h
> +++ b/xen/arch/x86/include/asm/flushtlb.h
> @@ -135,6 +135,8 @@ void switch_cr3_cr4(unsigned long cr3, u
> #else
> # define FLUSH_NO_ASSIST 0
> #endif
> + /* Write back data cache contents */
> +#define FLUSH_CACHE_WRITEBACK 0x10000
>
> /* Flush local TLBs/caches. */
> unsigned int flush_area_local(const void *va, unsigned int flags);
> @@ -194,7 +196,11 @@ static inline int clean_and_invalidate_d
> }
> static inline int clean_dcache_va_range(const void *p, unsigned long size)
> {
> - return clean_and_invalidate_dcache_va_range(p, size);
> + unsigned int order = get_order_from_bytes(size);
> +
> + /* sub-page granularity support needs to be added if necessary */
> + flush_area_local(p, FLUSH_CACHE_WRITEBACK | FLUSH_ORDER(order));
> + return 0;
> }
I'm planning to get rid of the clean_dcache_va_range() helper on x86,
but I don't want to force you to rebase on top of that.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |