Source-Changes-HG archive

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

[src/trunk]: src Change the NVMM API to reduce data movements. Sent to tech-k...



details:   https://anonhg.NetBSD.org/src/rev/8df04a0a8a81
branches:  trunk
changeset: 841924:8df04a0a8a81
user:      maxv <maxv%NetBSD.org@localhost>
date:      Sat Jun 08 07:27:44 2019 +0000

description:
Change the NVMM API to reduce data movements. Sent to tech-kern@.

diffstat:

 lib/libnvmm/libnvmm.3            |  114 ++++++++++++++++++--------
 lib/libnvmm/libnvmm.c            |   62 ++++++--------
 lib/libnvmm/libnvmm_x86.c        |  161 +++++++++++++++-----------------------
 lib/libnvmm/nvmm.h               |   30 ++++--
 tests/lib/libnvmm/h_io_assist.c  |   70 ++++++++--------
 tests/lib/libnvmm/h_mem_assist.c |   70 ++++++++--------
 6 files changed, 258 insertions(+), 249 deletions(-)

diffs (truncated from 1173 to 300 lines):

diff -r f36d879c244b -r 8df04a0a8a81 lib/libnvmm/libnvmm.3
--- a/lib/libnvmm/libnvmm.3     Fri Jun 07 23:35:52 2019 +0000
+++ b/lib/libnvmm/libnvmm.3     Sat Jun 08 07:27:44 2019 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: libnvmm.3,v 1.18 2019/05/11 07:44:00 maxv Exp $
+.\"    $NetBSD: libnvmm.3,v 1.19 2019/06/08 07:27:44 maxv Exp $
 .\"
 .\" Copyright (c) 2018, 2019 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd May 11, 2019
+.Dd May 30, 2019
 .Dt LIBNVMM 3
 .Os
 .Sh NAME
@@ -47,21 +47,20 @@
 .Fn nvmm_machine_configure "struct nvmm_machine *mach" "uint64_t op" \
     "void *conf"
 .Ft int
-.Fn nvmm_vcpu_create "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid"
+.Fn nvmm_vcpu_create "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
+    "struct nvmm_vcpu *vcpu"
 .Ft int
-.Fn nvmm_vcpu_destroy "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid"
-.Ft int
-.Fn nvmm_vcpu_getstate "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
-    "void *state" "uint64_t flags"
+.Fn nvmm_vcpu_destroy "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu"
 .Ft int
-.Fn nvmm_vcpu_setstate "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
-    "void *state" "uint64_t flags"
+.Fn nvmm_vcpu_getstate "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu" \
+    "uint64_t flags"
 .Ft int
-.Fn nvmm_vcpu_inject "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
-    "struct nvmm_event *event"
+.Fn nvmm_vcpu_setstate "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu" \
+    "uint64_t flags"
 .Ft int
-.Fn nvmm_vcpu_run "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
-    "struct nvmm_exit *exit"
+.Fn nvmm_vcpu_inject "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu"
+.Ft int
+.Fn nvmm_vcpu_run "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu"
 .Ft int
 .Fn nvmm_hva_map "struct nvmm_machine *mach" "uintptr_t hva" "size_t size"
 .Ft int
@@ -73,17 +72,15 @@
 .Fn nvmm_gpa_unmap "struct nvmm_machine *mach" "uintptr_t hva" "gpaddr_t gpa" \
     "size_t size"
 .Ft int
-.Fn nvmm_gva_to_gpa "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
+.Fn nvmm_gva_to_gpa "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu" \
     "gvaddr_t gva" "gpaddr_t *gpa" "nvmm_prot_t *prot"
 .Ft int
 .Fn nvmm_gpa_to_hva "struct nvmm_machine *mach" "gpaddr_t gpa" \
     "uintptr_t *hva" "nvmm_prot_t *prot"
 .Ft int
-.Fn nvmm_assist_io "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
-    "struct nvmm_exit *exit"
+.Fn nvmm_assist_io "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu"
 .Ft int
-.Fn nvmm_assist_mem "struct nvmm_machine *mach" "nvmm_cpuid_t cpuid" \
-    "struct nvmm_exit *exit"
+.Fn nvmm_assist_mem "struct nvmm_machine *mach" "struct nvmm_vcpu *vcpu"
 .Sh DESCRIPTION
 .Nm
 provides a library for emulator software to handle hardware-accelerated virtual
@@ -95,6 +92,8 @@
 should use the API provided by
 .Nm
 to manage virtual machines.
+A virtual CPU is described by a public structure,
+.Cd nvmm_vcpu .
 .Pp
 .Fn nvmm_capability
 gets the capabilities of NVMM.
@@ -124,61 +123,61 @@
 creates a virtual CPU in the machine
 .Fa mach ,
 giving it the CPU id
-.Fa cpuid .
+.Fa cpuid ,
+and initializes
+.Fa vcpu .
 .Pp
 .Fn nvmm_vcpu_destroy
 destroys the virtual CPU identified by
-.Fa cpuid
+.Fa vcpu
 in the machine
 .Fa mach .
 .Pp
 .Fn nvmm_vcpu_getstate
 gets the state of the virtual CPU identified by
-.Fa cpuid
+.Fa vcpu
 in the machine
 .Fa mach .
-The
-.Fa state
-argument is the address of a state area, and
 .Fa flags
 is the bitmap of the components that are to be retrieved.
+The components are located in
+.Fa vcpu->state .
 See
 .Sx VCPU State Area
 below for details.
 .Pp
 .Fn nvmm_vcpu_setstate
 sets the state of the virtual CPU identified by
-.Fa cpuid
+.Fa vcpu
 in the machine
 .Fa mach .
-The
-.Fa state
-argument is the address of a state area, and
 .Fa flags
 is the bitmap of the components that are to be set.
+The components are located in
+.Fa vcpu->state .
 See
 .Sx VCPU State Area
 below for details.
 .Pp
 .Fn nvmm_vcpu_inject
 injects into the CPU identified by
-.Fa cpuid
+.Fa vcpu
 of the machine
 .Fa mach
 an event described by
-.Fa event .
+.Fa vcpu->event .
 See
 .Sx Event Injection
 below for details.
 .Pp
 .Fn nvmm_vcpu_run
 runs the CPU identified by
-.Fa cpuid
+.Fa vcpu
 in the machine
 .Fa mach ,
 until a VM exit is triggered.
 The
-.Fa exit
+.Fa vcpu->exit
 structure is filled to indicate the exit reason, and the associated parameters
 if any.
 .Pp
@@ -220,7 +219,7 @@
 .Pp
 .Fn nvmm_gva_to_gpa
 translates, on the CPU
-.Fa cpuid
+.Fa vcpu
 from the machine
 .Fa mach ,
 the guest virtual address given in
@@ -246,9 +245,9 @@
 .Pp
 .Fn nvmm_assist_io
 emulates the I/O operation described in
-.Fa exit
+.Fa vcpu->exit
 on CPU
-.Fa cpuid
+.Fa vcpu
 from machine
 .Fa mach .
 See
@@ -257,9 +256,9 @@
 .Pp
 .Fn nvmm_assist_mem
 emulates the Mem operation described in
-.Fa exit
+.Fa vcpu->exit
 on CPU
-.Fa cpuid
+.Fa vcpu
 from machine
 .Fa mach .
 See
@@ -364,6 +363,7 @@
        struct nvmm_x64_state_intr intr;
        struct fxsave fpu;
 };
+#define nvmm_vcpu_state nvmm_x64_state
 .Ed
 .Pp
 Refer to functional examples to see precisely how to use this structure.
@@ -379,6 +379,46 @@
 see
 .Sx Exit Reasons
 below for details.
+.Ss VCPU Programming Model
+A VCPU is described by a public structure,
+.Cd nvmm_vcpu :
+.Bd -literal
+struct nvmm_vcpu {
+       nvmm_cpuid_t cpuid;
+       struct nvmm_vcpu_state *state;
+       struct nvmm_event *event;
+       struct nvmm_exit *exit;
+};
+.Ed
+.Pp
+This structure is used both publicly by emulator software and internally by
+.Nm .
+Emulator software should not modify the pointers of this structure, because
+they are initialized to special values by
+.Nm .
+.Pp
+A call to
+.Fn nvmm_vcpu_getstate
+will fetch the relevant parts of the VCPU state and put them in
+.Fa vcpu->state .
+A call to
+.Fn nvmm_vcpu_setstate
+will install in the VCPU the relevant parts of
+.Fa vcpu->state .
+A call to
+.Fn nvmm_vcpu_inject
+will inject in the VCPU the event in
+.Fa vcpu->event .
+A call to
+.Fn nvmm_vcpu_run
+will fill
+.Fa vcpu->exit
+with the VCPU exit information.
+.Pp
+If emulator software uses several threads, a VCPU should be associated with
+only one thread, and only this thread should perform VCPU modifications.
+Emulator software should not modify the state of a VCPU with several
+different threads.
 .Ss Exit Reasons
 The
 .Cd nvmm_exit
diff -r f36d879c244b -r 8df04a0a8a81 lib/libnvmm/libnvmm.c
--- a/lib/libnvmm/libnvmm.c     Fri Jun 07 23:35:52 2019 +0000
+++ b/lib/libnvmm/libnvmm.c     Sat Jun 08 07:27:44 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: libnvmm.c,v 1.13 2019/05/11 07:31:57 maxv Exp $        */
+/*     $NetBSD: libnvmm.c,v 1.14 2019/06/08 07:27:44 maxv Exp $        */
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -224,7 +224,6 @@
        memset(mach, 0, sizeof(*mach));
        mach->machid = args.machid;
        mach->pages = pages;
-       mach->npages = __capability.max_vcpus;
        mach->areas = areas;
 
        return 0;
@@ -272,7 +271,8 @@
 }
 
 int
-nvmm_vcpu_create(struct nvmm_machine *mach, nvmm_cpuid_t cpuid)
+nvmm_vcpu_create(struct nvmm_machine *mach, nvmm_cpuid_t cpuid,
+    struct nvmm_vcpu *vcpu)
 {
        struct nvmm_ioc_vcpu_create args;
        struct nvmm_comm_page *comm;
@@ -292,41 +292,42 @@
 
        mach->pages[cpuid] = comm;
 
+       vcpu->cpuid = cpuid;
+       vcpu->state = &comm->state;
+       vcpu->event = &comm->event;
+       vcpu->exit = malloc(sizeof(*vcpu->exit));
+
        return 0;
 }
 
 int
-nvmm_vcpu_destroy(struct nvmm_machine *mach, nvmm_cpuid_t cpuid)
+nvmm_vcpu_destroy(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu)
 {
        struct nvmm_ioc_vcpu_destroy args;
        struct nvmm_comm_page *comm;
        int ret;
 
        args.machid = mach->machid;
-       args.cpuid = cpuid;
+       args.cpuid = vcpu->cpuid;
 
        ret = ioctl(nvmm_fd, NVMM_IOC_VCPU_DESTROY, &args);
        if (ret == -1)
                return -1;
 
-       comm = mach->pages[cpuid];



Home | Main Index | Thread Index | Old Index