]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
KVM: x86/xen: Implement HVMOP_flush_tlbs xen-evtchn-kernel
authorDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 11 Mar 2022 20:01:51 +0000 (20:01 +0000)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 11 Mar 2022 20:01:51 +0000 (20:01 +0000)
AFAICT there isn't a way for the VMM to do this from userspace.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
arch/x86/kvm/xen.c
arch/x86/kvm/xen.h

index 7e7c8a5bff52a3f5d003941261e7576726549ff1..e031a29ed0a9bc2bc72a784201b5076b04a0988a 100644 (file)
@@ -1212,6 +1212,12 @@ static bool kvm_xen_hcall_set_timer_op(struct kvm_vcpu *vcpu, uint64_t timeout,
        return true;
 }
 
+static bool kvm_xen_hcall_hvm_flush_tlbs(struct kvm_vcpu *vcpu)
+{
+       kvm_flush_remote_tlbs(vcpu->kvm);
+       return true;
+}
+
 int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
 {
        bool longmode;
@@ -1266,6 +1272,10 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
                handled = kvm_xen_hcall_vcpu_op(vcpu, longmode, params[0], params[1],
                                                params[2], &r);
                break;
+       case __HYPERVISOR_hvm_op:
+               if (params[0] == HVMOP_flush_tlbs)
+                       handled = kvm_xen_hcall_hvm_flush_tlbs(vcpu);
+               break;
        case __HYPERVISOR_set_timer_op: {
                u64 timeout = params[0];
                /* In 32-bit mode, the 64-bit timeout is in two 32-bit params. */
index ee5c4ae0755cddeec1db69e951bb14f28fc42c65..414133c329038caefeaf526265b9516ad32ef02a 100644 (file)
@@ -205,4 +205,8 @@ struct compat_vcpu_runstate_info {
     uint64_t time[4];
 } __attribute__((packed));
 
+#ifndef HVMOP_flush_tlbs
+#define HVMOP_flush_tlbs       5
+#endif
+
 #endif /* __ARCH_X86_KVM_XEN_H__ */