Module Name: src Committed By: maxv Date: Sat Jan 26 15:25:51 UTC 2019
Modified Files: src/sys/dev/nvmm: nvmm.c nvmm_internal.h Log Message: Optimize: keep a per-VCPU buffer for the state, and copy in and out directly on it. The VCPUs are protected by mutexes, so nothing to worry about. This saves two kmem_allocs in {get,set}state. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/dev/nvmm/nvmm.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/nvmm/nvmm_internal.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/nvmm/nvmm.c diff -u src/sys/dev/nvmm/nvmm.c:1.5 src/sys/dev/nvmm/nvmm.c:1.6 --- src/sys/dev/nvmm/nvmm.c:1.5 Sun Jan 6 16:10:51 2019 +++ src/sys/dev/nvmm/nvmm.c Sat Jan 26 15:25:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm.c,v 1.5 2019/01/06 16:10:51 maxv Exp $ */ +/* $NetBSD: nvmm.c,v 1.6 2019/01/26 15:25:51 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.5 2019/01/06 16:10:51 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.6 2019/01/26 15:25:51 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -142,6 +142,7 @@ nvmm_vcpu_alloc(struct nvmm_machine *mac vcpu->present = true; vcpu->cpuid = i; + vcpu->state = kmem_zalloc(nvmm_impl->state_size, KM_SLEEP); *ret = vcpu; return 0; } @@ -154,6 +155,7 @@ nvmm_vcpu_free(struct nvmm_machine *mach { KASSERT(mutex_owned(&vcpu->lock)); vcpu->present = false; + kmem_free(vcpu->state, nvmm_impl->state_size); vcpu->hcpu_last = -1; } @@ -404,33 +406,27 @@ nvmm_vcpu_setstate(struct nvmm_ioc_vcpu_ { struct nvmm_machine *mach; struct nvmm_cpu *vcpu; - void *data; int error; - data = kmem_alloc(nvmm_impl->state_size, KM_SLEEP); - error = nvmm_machine_get(args->machid, &mach, false); - if (error) { - kmem_free(data, nvmm_impl->state_size); + if (error) return error; - } error = nvmm_vcpu_get(mach, args->cpuid, &vcpu); if (error) goto out; - error = copyin(args->state, data, nvmm_impl->state_size); + error = copyin(args->state, vcpu->state, nvmm_impl->state_size); if (error) { nvmm_vcpu_put(vcpu); goto out; } - (*nvmm_impl->vcpu_setstate)(vcpu, data, args->flags); + (*nvmm_impl->vcpu_setstate)(vcpu, vcpu->state, args->flags); nvmm_vcpu_put(vcpu); out: nvmm_machine_put(mach); - kmem_free(data, nvmm_impl->state_size); return error; } @@ -439,28 +435,22 @@ nvmm_vcpu_getstate(struct nvmm_ioc_vcpu_ { struct nvmm_machine *mach; struct nvmm_cpu *vcpu; - void *data; int error; - data = kmem_alloc(nvmm_impl->state_size, KM_SLEEP); - error = nvmm_machine_get(args->machid, &mach, false); - if (error) { - kmem_free(data, nvmm_impl->state_size); + if (error) return error; - } error = nvmm_vcpu_get(mach, args->cpuid, &vcpu); if (error) goto out; - (*nvmm_impl->vcpu_getstate)(vcpu, data, args->flags); + (*nvmm_impl->vcpu_getstate)(vcpu, vcpu->state, args->flags); nvmm_vcpu_put(vcpu); - error = copyout(data, args->state, nvmm_impl->state_size); + error = copyout(vcpu->state, args->state, nvmm_impl->state_size); out: nvmm_machine_put(mach); - kmem_free(data, nvmm_impl->state_size); return error; } Index: src/sys/dev/nvmm/nvmm_internal.h diff -u src/sys/dev/nvmm/nvmm_internal.h:1.2 src/sys/dev/nvmm/nvmm_internal.h:1.3 --- src/sys/dev/nvmm/nvmm_internal.h:1.2 Sat Dec 15 13:39:43 2018 +++ src/sys/dev/nvmm/nvmm_internal.h Sat Jan 26 15:25:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nvmm_internal.h,v 1.2 2018/12/15 13:39:43 maxv Exp $ */ +/* $NetBSD: nvmm_internal.h,v 1.3 2019/01/26 15:25:51 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -43,6 +43,9 @@ struct nvmm_cpu { nvmm_cpuid_t cpuid; kmutex_t lock; + /* State buffer. */ + void *state; + /* Last host CPU on which the VCPU ran. */ int hcpu_last;