x86/hypervisor: pass flags to hypervisor_flush_tlb

Hyper-V's L0 assisted flush has fine-grained control over what gets
flushed. We need all the flags available to make the best decisions
possible.

No functional change because Xen's implementation doesn't care about
what is passed to it.

Signed-off-by: Wei Liu <liuwe@microsoft.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Paul Durrant <pdurrant@amazon.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Wei Liu committed 2020-04-29 10:32:18 +01:00
1 parent e9aca9470e
commit 3d2a0c7d58
4 files changed
+9 -9

No files matched your search

+2 -2
View File
@@ -79,10 +79,10 @@ void __init hypervisor_e820_fixup(struct e820map *e820)
}
int hypervisor_flush_tlb(const cpumask_t *mask, const void *va,
unsigned int order)
unsigned int flags)
{
if ( ops.flush_tlb )
return alternative_call(ops.flush_tlb, mask, va, order);
return alternative_call(ops.flush_tlb, mask, va, flags);
return -EOPNOTSUPP;
}
+1 -1
View File
@@ -324,7 +324,7 @@ static void __init e820_fixup(struct e820map *e820)
pv_shim_fixup_e820(e820);
}
static int flush_tlb(const cpumask_t *mask, const void *va, unsigned int order)
static int flush_tlb(const cpumask_t *mask, const void *va, unsigned int flags)
{
return xen_hypercall_hvm_op(HVMOP_flush_tlbs, NULL);
}
+1 -1
View File
@@ -272,7 +272,7 @@ void flush_area_mask(const cpumask_t *mask, const void *va, unsigned int flags)
if ( cpu_has_hypervisor &&
!(flags & ~(FLUSH_TLB | FLUSH_TLB_GLOBAL | FLUSH_VA_VALID |
FLUSH_ORDER_MASK)) &&
!hypervisor_flush_tlb(mask, va, (flags - 1) & FLUSH_ORDER_MASK) )
!hypervisor_flush_tlb(mask, va, flags) )
return;
spin_lock(&flush_lock);
+5 -5
View File
@@ -35,7 +35,7 @@ struct hypervisor_ops {
/* Fix up e820 map */
void (*e820_fixup)(struct e820map *e820);
/* L0 assisted TLB flush */
int (*flush_tlb)(const cpumask_t *mask, const void *va, unsigned int order);
int (*flush_tlb)(const cpumask_t *mask, const void *va, unsigned int flags);
};
#ifdef CONFIG_GUEST
@@ -48,11 +48,11 @@ void hypervisor_e820_fixup(struct e820map *e820);
/*
* L0 assisted TLB flush.
* mask: cpumask of the dirty vCPUs that should be flushed.
* va: linear address to flush, or NULL for global flushes.
* order: order of the linear address pointed by va.
* va: linear address to flush, or NULL for entire address space.
* flags: flags for flushing, including the order of va.
*/
int hypervisor_flush_tlb(const cpumask_t *mask, const void *va,
unsigned int order);
unsigned int flags);
#else
@@ -65,7 +65,7 @@ static inline int hypervisor_ap_setup(void) { return 0; }
static inline void hypervisor_resume(void) { ASSERT_UNREACHABLE(); }
static inline void hypervisor_e820_fixup(struct e820map *e820) {}
static inline int hypervisor_flush_tlb(const cpumask_t *mask, const void *va,
unsigned int order)
unsigned int flags)
{
return -EOPNOTSUPP;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.