Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/bouyer-xenpvh]: src/sys/arch If possible, register a per-cpu callback vi...



details:   https://anonhg.NetBSD.org/src/rev/5d439561a1a7
branches:  bouyer-xenpvh
changeset: 930962:5d439561a1a7
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Sat Apr 18 20:03:02 2020 +0000

description:
If possible, register a per-cpu callback via HVMOP_set_evtchn_upcall_vector.
>From FreeBSD. This requires acking the interrupt in hypervisor_pvhvm_callback.

Don't try to use x86_cpu_idle_xen() for PVHVM, it cause the domU to hang.
FreeBSD doesn't seem to use it either.

diffstat:

 sys/arch/amd64/amd64/vector.S |  10 +++++++++-
 sys/arch/i386/i386/vector.S   |  12 ++++++++++--
 sys/arch/xen/xen/hypervisor.c |  43 ++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 57 insertions(+), 8 deletions(-)

diffs (155 lines):

diff -r 5fcdefca1dc2 -r 5d439561a1a7 sys/arch/amd64/amd64/vector.S
--- a/sys/arch/amd64/amd64/vector.S     Sat Apr 18 15:06:18 2020 +0000
+++ b/sys/arch/amd64/amd64/vector.S     Sat Apr 18 20:03:02 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vector.S,v 1.73.6.5 2020/04/16 17:50:51 bouyer Exp $   */
+/*     $NetBSD: vector.S,v 1.73.6.6 2020/04/18 20:03:02 bouyer Exp $   */
 
 /*
  * Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -772,6 +772,14 @@
        incl    CPUVAR(IDEPTH)
        movq    %rsp,%rdi
        call    do_hypervisor_callback
+#ifndef XENPV
+       movzbl  _C_LABEL(xenhvm_use_percpu_callback),%edi
+       testl   %edi, %edi
+       jz 1f
+       movq    _C_LABEL(local_apic_va),%rdi
+       movl    $0,LAPIC_EOI(%rdi)
+1:
+#endif
        jmp     _C_LABEL(Xdoreti)
 IDTVEC_END(hypervisor_pvhvm_callback)
        TEXT_USER_END
diff -r 5fcdefca1dc2 -r 5d439561a1a7 sys/arch/i386/i386/vector.S
--- a/sys/arch/i386/i386/vector.S       Sat Apr 18 15:06:18 2020 +0000
+++ b/sys/arch/i386/i386/vector.S       Sat Apr 18 20:03:02 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vector.S,v 1.85.6.6 2020/04/16 17:50:52 bouyer Exp $   */
+/*     $NetBSD: vector.S,v 1.85.6.7 2020/04/18 20:03:02 bouyer Exp $   */
 
 /*
  * Copyright 2002 (c) Wasabi Systems, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.85.6.6 2020/04/16 17:50:52 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.85.6.7 2020/04/18 20:03:02 bouyer Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -1019,6 +1019,14 @@
         * Xdoreti needs it too.
         */
        call    do_hypervisor_callback
+#ifndef XENPV
+       movzbl  _C_LABEL(xenhvm_use_percpu_callback),%eax
+       testl   %eax, %eax
+       jz      1f
+       movl    _C_LABEL(local_apic_va),%eax
+       movl    $0, LAPIC_EOI(%eax)
+1:
+#endif
        jmp     _C_LABEL(Xdoreti)
 IDTVEC_END(hypervisor_pvhvm_callback)
 END(hypervisor_callback)
diff -r 5fcdefca1dc2 -r 5d439561a1a7 sys/arch/xen/xen/hypervisor.c
--- a/sys/arch/xen/xen/hypervisor.c     Sat Apr 18 15:06:18 2020 +0000
+++ b/sys/arch/xen/xen/hypervisor.c     Sat Apr 18 20:03:02 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: hypervisor.c,v 1.73.2.6 2020/04/18 15:06:18 bouyer Exp $ */
+/* $NetBSD: hypervisor.c,v 1.73.2.7 2020/04/18 20:03:02 bouyer Exp $ */
 
 /*
  * Copyright (c) 2005 Manuel Bouyer.
@@ -53,7 +53,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.73.2.6 2020/04/18 15:06:18 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hypervisor.c,v 1.73.2.7 2020/04/18 20:03:02 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -207,6 +207,8 @@
 
 #ifdef XENPVHVM
 
+bool xenhvm_use_percpu_callback = 0;
+
 static bool
 xen_check_hypervisordev(void)
 {
@@ -373,7 +375,6 @@
        delay_func = xen_delay;
        x86_initclock_func = xen_initclocks;
        x86_cpu_initclock_func = xen_cpu_initclocks;
-       x86_cpu_idle_set(x86_cpu_idle_xen, "xen", true);
        vm_guest = VM_GUEST_XENPVHVM; /* Be more specific */
        return 1;
 }
@@ -383,6 +384,8 @@
 {
        u_int32_t descs[4];
        struct xen_hvm_param xen_hvm_param;
+       int error;
+       static bool again = 0;
 
        if (vm_guest != VM_GUEST_XENPVHVM)
                return 0;
@@ -410,13 +413,43 @@
        /* val[63:56] = 2, val[7:0] = vec */
        xen_hvm_param.value = ((int64_t)0x2 << 56) | xen_hvm_vec;
 
+       /* First try to set up a per-cpu vector. */
+       if (!again || xenhvm_use_percpu_callback) {
+               struct xen_hvm_evtchn_upcall_vector xen_hvm_uvec;
+               xen_hvm_uvec.vcpu = ci->ci_vcpuid;
+               xen_hvm_uvec.vector = xen_hvm_vec;
+
+               xenhvm_use_percpu_callback = 1;
+               error = HYPERVISOR_hvm_op(
+                   HVMOP_set_evtchn_upcall_vector, &xen_hvm_uvec);
+               if (error < 0) {
+                       aprint_error_dev(ci->ci_dev,
+                           "failed to set event upcall vector: %d\n", error);
+                       if (again)
+                               panic("event upcall vector");
+                       aprint_error_dev(ci->ci_dev,
+                           "falling back to global vector\n");
+               } else {
+                       /*
+                        * From FreeBSD:
+                        * Trick toolstack to think we are enlightened
+                        */
+                       aprint_verbose_dev(ci->ci_dev,
+                           "using event upcall vector: %d\n", xen_hvm_vec );
+                       xen_hvm_param.value = 1;
+               }
+       }
+
+       if (again)
+               return 1;
+
        if (HYPERVISOR_hvm_op(HVMOP_set_param, &xen_hvm_param) < 0) {
                aprint_error_dev(ci->ci_dev,
                    "Xen HVM: Unable to register event callback vector\n");
                vm_guest = VM_GUEST_XENHVM;
                return 0;
        }
-
+       again = 1;
        return 1;
 }
 
@@ -488,7 +521,7 @@
        bi.common.len = sizeof(struct btinfo_rootdevice);
 
        /* From i386/multiboot.c */
-       /*      $NetBSD: hypervisor.c,v 1.73.2.6 2020/04/18 15:06:18 bouyer Exp $       */
+       /*      $NetBSD: hypervisor.c,v 1.73.2.7 2020/04/18 20:03:02 bouyer Exp $       */
        int i, len;
        vaddr_t data;
        extern struct bootinfo  bootinfo;



Home | Main Index | Thread Index | Old Index