Move vcpu_load and vcpu_put calls to arch code
v3 cover Move vcpu_load and vcpu_put calls to arch code
From: Christoffer Dall <[email protected]>
Some architectures may decide to do different things during kvm_arch_vcpu_load depending on the ioctl being executed. For example, arm64 is about to do significant work in vcpu load/put when running a vcpu, but it's problematic to do this for any other vcpu ioctl than KVM_RUN.
Further, while it may be possible to call kvm_arch_vcpu_load() for a number of non-KVM_RUN ioctls, it makes the KVM/ARM code more difficult to reason about, especially after my optimization series, because a lot of things can now happen, where we have to consider if we're really in the process of running a vcpu or not.
This series will first move the vcpu_load() and vcpu_put() calls in the arch generic dispatch function into each case of the switch statement and then, one-by-one, pushed the calls down into the architecture specific code making the changes for each ioctl as required.
Based on v4.15-rc1
Patches also available at:git://git.kernel.org/pub/scm/linux/kernel/git/cdall/linux.git vcpu-load-put-v3
Changes since v2:
- Clarified commit message on patch 1
- Initialized ret to -EINVAL at declaration on patch 9
- Added David Hildenbrand's reviewed-by tag
Changes since v1:
- Fix PPC and S390 bugs from v1
- Take the mutex in the main disaptcher function and make vcpu_load a void, which simplifies the patches overall.
- Add a patch that moves vcpu_load for arm/arm64 after the first-run init function.
Thanks,
-Christoffer
Christoffer Dall (16):
KVM: Take vcpu->mutex outside vcpu_load
KVM: Prepare for moving vcpu_load/vcpu_put into arch specific code
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_run
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_regs
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_regs
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_sregs
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_sregs
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_mpstate
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_mpstate
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_translate
KVM: Move vcpu_load to arch-specific
kvm_arch_vcpu_ioctl_set_guest_debug
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_fpu
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_fpu
KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl
KVM: arm/arm64: Avoid vcpu_load for other vcpu ioctls than KVM_RUN
KVM: arm/arm64: Move vcpu_load call after kvm_vcpu_first_run_init
arch/arm64/kvm/guest.c | 12 +++-- arch/mips/kvm/mips.c | 58 +++++++++++++++-------- arch/powerpc/kvm/book3s.c | 24 +++++++++- arch/powerpc/kvm/booke.c | 51 +++++++++++++++----- arch/powerpc/kvm/powerpc.c | 19 +++++--- arch/s390/kvm/kvm-s390.c | 90 +++++++++++++++++++++++++++-------- arch/x86/kvm/vmx.c | 4 +- arch/x86/kvm/x86.c | 106 ++++++++++++++++++++++++++++++------------ include/linux/kvm_host.h | 2 +- virt/kvm/arm/arch_timer.c | 4 -- virt/kvm/arm/arm.c | 68 ++++++++++++++++++--------- virt/kvm/arm/vgic/vgic-init.c | 11 ----- virt/kvm/kvm_main.c | 17 ++----- 13 files changed, 322 insertions(+), 144 deletions(-)
Signature · 1 line
2.14.2
PATCH v3 1/16 KVM: Take vcpu->mutex outside vcpu_load
From: Christoffer Dall <[email protected]>
As we're about to call vcpu_load() from architecture-specific implementations of the KVM vcpu ioctls, but yet we access data structures protected by the vcpu->mutex in the generic code, factor this logic out from vcpu_load().
x86 is the only architecture which calls vcpu_load() outside of the main vcpu ioctl function, and these calls will no longer take the vcpu mutex following this patch. However, with the exception of kvm_arch_vcpu_postcreate (see below), the callers are either in the creation or destruction path of the VCPU, which means there cannot be any concurrent access to the data structure, because the file descriptor is not yet accessible, or is already gone.
kvm_arch_vcpu_postcreate makes the newly created vcpu potentially accessible by other in-kernel threads through the kvm->vcpus array, and we therefore take the vcpu mutex in this case directly.
--- arch/x86/kvm/vmx.c | 4 +--- arch/x86/kvm/x86.c | 20 +++++++------------- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 17 ++++++----------- 4 files changed, 15 insertions(+), 28 deletions(-)
arch/x86/kvm/vmx.c +1 -3
@@ -9559,10 +9559,8 @@ static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs)static void vmx_free_vcpu_nested (struct kvm_vcpu *vcpu) {struct vcpu_vmx *vmx =to_vmx (vcpu); -int r; - r =vcpu_load (vcpu); -BUG_ON (r); +vcpu_load (vcpu);vmx_switch_vmcs (vcpu, &vmx->vmcs01);free_nested (vmx);vcpu_put (vcpu);
arch/x86/kvm/x86.c +7 -13
@@ -7747,16 +7747,12 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,int kvm_arch_vcpu_setup (struct kvm_vcpu *vcpu) { -int r; -kvm_vcpu_mtrr_init (vcpu); - r =vcpu_load (vcpu); -if (r) -return r; +vcpu_load (vcpu);kvm_vcpu_reset (vcpu, false);kvm_mmu_setup (vcpu);vcpu_put (vcpu); -return r; +return 0 ; }void kvm_arch_vcpu_postcreate (struct kvm_vcpu *vcpu)
@@ -7766,13 +7762,15 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)kvm_hv_vcpu_postcreate (vcpu); -if (vcpu_load (vcpu)) +if (mutex_lock_killable (&vcpu->mutex))return ; +vcpu_load (vcpu); msr.data =0x0 ; msr.index =MSR_IA32_TSC ; msr.host_initiated = true;kvm_write_tsc (vcpu, &msr);vcpu_put (vcpu); +mutex_unlock (&vcpu->mutex);if (!kvmclock_periodic_sync)return ;
@@ -7783,11 +7781,9 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)void kvm_arch_vcpu_destroy (struct kvm_vcpu *vcpu) { -int r; vcpu->arch.apf.msr_val =0 ; - r =vcpu_load (vcpu); -BUG_ON (r); +vcpu_load (vcpu);kvm_mmu_unload (vcpu);vcpu_put (vcpu);
@@ -8155,9 +8151,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)static void kvm_unload_vcpu_mmu (struct kvm_vcpu *vcpu) { -int r; - r =vcpu_load (vcpu); -BUG_ON (r); +vcpu_load (vcpu);kvm_mmu_unload (vcpu);vcpu_put (vcpu); }
include/linux/kvm_host.h +1 -1
@@ -533,7 +533,7 @@ static inline int kvm_vcpu_get_idx(struct kvm_vcpu *vcpu)int kvm_vcpu_init (struct kvm_vcpu *vcpu,struct kvm *kvm,unsigned id);void kvm_vcpu_uninit (struct kvm_vcpu *vcpu); -int __must_check vcpu_load (struct kvm_vcpu *vcpu); +void vcpu_load (struct kvm_vcpu *vcpu);void vcpu_put (struct kvm_vcpu *vcpu);#ifdef __KVM_HAVE_IOAPIC
virt/kvm/kvm_main.c +6 -11
@@ -146,17 +146,12 @@ bool kvm_is_reserved_pfn(kvm_pfn_t pfn)/* * Switches to specified vcpu, until a matching vcpu_put() */ -int vcpu_load (struct kvm_vcpu *vcpu) +void vcpu_load (struct kvm_vcpu *vcpu) { -int cpu; - -if (mutex_lock_killable (&vcpu->mutex)) -return -EINTR ; - cpu =get_cpu (); +int cpu =get_cpu ();preempt_notifier_register (&vcpu->preempt_notifier);kvm_arch_vcpu_load (vcpu, cpu);put_cpu (); -return 0 ; }EXPORT_SYMBOL_GPL (vcpu_load);
@@ -166,7 +161,6 @@ void vcpu_put(struct kvm_vcpu *vcpu)kvm_arch_vcpu_put (vcpu);preempt_notifier_unregister (&vcpu->preempt_notifier);preempt_enable (); -mutex_unlock (&vcpu->mutex); }EXPORT_SYMBOL_GPL (vcpu_put);
@@ -2529,9 +2523,9 @@ static long kvm_vcpu_ioctl(struct file *filp,#endif - r =vcpu_load (vcpu); -if (r) -return r; +if (mutex_lock_killable (&vcpu->mutex)) +return -EINTR ; +vcpu_load (vcpu);switch (ioctl) {case KVM_RUN : {struct pid *oldpid;
@@ -2704,6 +2698,7 @@ static long kvm_vcpu_ioctl(struct file *filp, } out:vcpu_put (vcpu); +mutex_unlock (&vcpu->mutex);kfree (fpu);kfree (kvm_sregs);return r;
Signature · 1 line
2.14.2
Re: [PATCH v3 01/16] KVM: Take vcpu->mutex outside vcpu_load
Quoted 15 lines · Christoffer Dall
From: Christoffer Dall <[email protected]>
As we're about to call
vcpu_load()from architecture-specific implementations of the KVM vcpu ioctls, but yet we access data structures protected by thevcpu->mutexin the generic code, factor this logic out fromvcpu_load().x86 is the only architecture which calls
vcpu_load()outside of the main vcpu ioctl function, and these calls will no longer take the vcpu mutex following this patch. However, with the exception ofkvm_arch_vcpu_postcreate(see below), the callers are either in the creation or destruction path of the VCPU, which means there cannot be any concurrent access to the data structure, because the file descriptor is not yet accessible, or is already gone.
Quoted 5 lines
kvm_arch_vcpu_postcreatemakes the newly created vcpu potentially accessible by other in-kernel threads through thekvm->vcpusarray, and we therefore take the vcpu mutex in this case directly.Signed-off-by Christoffer Dall <[email protected]>
Looks good to me.
Re: [PATCH v3 01/16] KVM: Take vcpu->mutex outside vcpu_load
In reply to Christoffer DallQuoted 19 lines · On Mon, 4 Dec 2017 21:35:23 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
As we're about to call
vcpu_load()from architecture-specific implementations of the KVM vcpu ioctls, but yet we access data structures protected by thevcpu->mutexin the generic code, factor this logic out fromvcpu_load().x86 is the only architecture which calls
vcpu_load()outside of the main vcpu ioctl function, and these calls will no longer take the vcpu mutex following this patch. However, with the exception ofkvm_arch_vcpu_postcreate(see below), the callers are either in the creation or destruction path of the VCPU, which means there cannot be any concurrent access to the data structure, because the file descriptor is not yet accessible, or is already gone.
kvm_arch_vcpu_postcreatemakes the newly created vcpu potentially accessible by other in-kernel threads through thekvm->vcpusarray, and we therefore take the vcpu mutex in this case directly.
Quoted 7 lines
Signed-off-by Christoffer Dall <[email protected]>--- arch/x86/kvm/vmx.c | 4 +--- arch/x86/kvm/x86.c | 20 +++++++------------- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 17 ++++++----------- 4 files changed, 15 insertions(+), 28 deletions(-)
PATCH v3 2/16 KVM: Prepare for moving vcpu_load/vcpu_put into arch specific code
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
In preparation for moving calls to vcpu_load() and vcpu_put() into the architecture specific implementations of the KVM vcpu ioctls, move the calls in the main kvm_vcpu_ioctl() dispatcher function to each case of the ioctl select statement. This allows us to move the vcpu_load() and vcpu_put() calls into architecture specific implementations of vcpu ioctls, one by one.
--- virt/kvm/kvm_main.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
virt/kvm/kvm_main.c +24 -2
@@ -2525,13 +2525,13 @@ static long kvm_vcpu_ioctl(struct file *filp,if (mutex_lock_killable (&vcpu->mutex))return -EINTR ; -vcpu_load (vcpu);switch (ioctl) {case KVM_RUN : {struct pid *oldpid; r = -EINVAL ;if (arg) goto out; +vcpu_load (vcpu); oldpid =rcu_access_pointer (vcpu->pid);if (unlikely (oldpid != current->pids[PIDTYPE_PID ].pid)) {/* The thread running this VCPU changed. */
@@ -2543,6 +2543,7 @@ static long kvm_vcpu_ioctl(struct file *filp,put_pid (oldpid); } r =kvm_arch_vcpu_ioctl_run (vcpu, vcpu->run); +vcpu_put (vcpu);trace_kvm_userspace_exit (vcpu->run->exit_reason, r);break ; }
@@ -2553,7 +2554,9 @@ static long kvm_vcpu_ioctl(struct file *filp, kvm_regs =kzalloc (sizeof (struct kvm_regs ),GFP_KERNEL );if (!kvm_regs) goto out; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_regs (vcpu, kvm_regs); +vcpu_put (vcpu);if (r) goto out_free1; r = -EFAULT ;
@@ -2573,7 +2576,9 @@ static long kvm_vcpu_ioctl(struct file *filp, r =PTR_ERR (kvm_regs); goto out; } +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_regs (vcpu, kvm_regs); +vcpu_put (vcpu);kfree (kvm_regs);break ; }
@@ -2582,7 +2587,9 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -ENOMEM ;if (!kvm_sregs) goto out; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_sregs (vcpu, kvm_sregs); +vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
@@ -2598,13 +2605,17 @@ static long kvm_vcpu_ioctl(struct file *filp, kvm_sregs =NULL ; goto out; } +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_sregs (vcpu, kvm_sregs); +vcpu_put (vcpu);break ; }case KVM_GET_MP_STATE : {struct kvm_mp_state mp_state; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_mpstate (vcpu, &mp_state); +vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
@@ -2619,7 +2630,9 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EFAULT ;if (copy_from_user (&mp_state, argp,sizeof (mp_state))) goto out; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_mpstate (vcpu, &mp_state); +vcpu_put (vcpu);break ; }case KVM_TRANSLATE : {
@@ -2628,7 +2641,9 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EFAULT ;if (copy_from_user (&tr, argp,sizeof (tr))) goto out; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_translate (vcpu, &tr); +vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
@@ -2643,7 +2658,9 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EFAULT ;if (copy_from_user (&dbg, argp,sizeof (dbg))) goto out; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_guest_debug (vcpu, &dbg); +vcpu_put (vcpu);break ; }case KVM_SET_SIGNAL_MASK : {
@@ -2674,7 +2691,9 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -ENOMEM ;if (!fpu) goto out; +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_fpu (vcpu, fpu); +vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
@@ -2690,14 +2709,17 @@ static long kvm_vcpu_ioctl(struct file *filp, fpu =NULL ; goto out; } +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_fpu (vcpu, fpu); +vcpu_put (vcpu);break ; }default : +vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl (filp, ioctl, arg); +vcpu_put (vcpu); } out: -vcpu_put (vcpu);mutex_unlock (&vcpu->mutex);kfree (fpu);kfree (kvm_sregs);
Signature · 1 line
2.14.2
Re: [PATCH v3 02/16] KVM: Prepare for moving vcpu_load/vcpu_put into arch specific code
Quoted 9 lines · On Mon, 4 Dec 2017 21:35:24 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
In preparation for moving calls to
vcpu_load()andvcpu_put()into the architecture specific implementations of the KVM vcpu ioctls, move the calls in the mainkvm_vcpu_ioctl()dispatcher function to each case of the ioctl select statement. This allows us to move thevcpu_load()andvcpu_put()calls into architecture specific implementations of vcpu ioctls, one by one.
Quoted 5 lines
Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- virt/kvm/kvm_main.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
PATCH v3 3/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_run
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_run().
--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/powerpc.c | 6 +++++- arch/s390/kvm/kvm-s390.c | 10 ++++++++-- arch/x86/kvm/x86.c | 3 +++ virt/kvm/arm/arm.c | 15 +++++++++++---- virt/kvm/kvm_main.c | 2 -- 6 files changed, 30 insertions(+), 9 deletions(-)
arch/mips/kvm/mips.c +3 -0
@@ -447,6 +447,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)int r = -EINTR ;sigset_t sigsaved; +vcpu_load (vcpu); +if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &vcpu->sigset, &sigsaved);
@@ -483,6 +485,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &sigsaved,NULL ); +vcpu_put (vcpu);return r; }
arch/powerpc/kvm/powerpc.c +5 -1
@@ -1409,6 +1409,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)int r;sigset_t sigsaved; +vcpu_load (vcpu); +if (vcpu->mmio_needed) { vcpu->mmio_needed =0 ;if (!vcpu->mmio_is_write)
@@ -1423,7 +1425,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) r =kvmppc_emulate_mmio_vsx_loadstore (vcpu, run);if (r ==RESUME_HOST ) { vcpu->mmio_needed =1 ; -return r; + goto out; } }#endif
@@ -1459,6 +1461,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &sigsaved,NULL ); +out: +vcpu_put (vcpu);return r; }
arch/s390/kvm/kvm-s390.c +8 -2
@@ -3377,9 +3377,12 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)if (kvm_run->immediate_exit)return -EINTR ; +vcpu_load (vcpu); +if (guestdbg_exit_pending (vcpu)) {kvm_s390_prepare_debug_exit (vcpu); -return 0 ; + rc =0 ; + goto out; }if (vcpu->sigset_active)
@@ -3390,7 +3393,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) }else if (is_vcpu_stopped (vcpu)) {pr_err_ratelimited ("can't run stopped vcpu %d\n" , vcpu->vcpu_id); -return -EINVAL ; + rc = -EINVAL ; + goto out; }sync_regs (vcpu, kvm_run);
@@ -3421,6 +3425,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)sigprocmask (SIG_SETMASK , &sigsaved,NULL ); vcpu->stat.exit_userspace++; +out: +vcpu_put (vcpu);return rc; }
arch/x86/kvm/x86.c +3 -0
@@ -7252,6 +7252,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)int r;sigset_t sigsaved; +vcpu_load (vcpu); +fpu__initialize (fpu);if (vcpu->sigset_active)
@@ -7301,6 +7303,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &sigsaved,NULL ); +vcpu_put (vcpu);return r; }
virt/kvm/arm/arm.c +11 -4
@@ -620,18 +620,22 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)if (unlikely (!kvm_vcpu_initialized (vcpu)))return -ENOEXEC ; +vcpu_load (vcpu); + ret =kvm_vcpu_first_run_init (vcpu);if (ret) -return ret; + goto out;if (run->exit_reason ==KVM_EXIT_MMIO ) { ret =kvm_handle_mmio_return (vcpu, vcpu->run);if (ret) -return ret; + goto out; } -if (run->immediate_exit) -return -EINTR ; +if (run->immediate_exit) { + ret = -EINTR ; + goto out; + }if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &vcpu->sigset, &sigsaved);
@@ -771,6 +775,9 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &sigsaved,NULL ); + +out: +vcpu_put (vcpu);return ret; }
virt/kvm/kvm_main.c +0 -2
@@ -2531,7 +2531,6 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EINVAL ;if (arg) goto out; -vcpu_load (vcpu); oldpid =rcu_access_pointer (vcpu->pid);if (unlikely (oldpid != current->pids[PIDTYPE_PID ].pid)) {/* The thread running this VCPU changed. */
@@ -2543,7 +2542,6 @@ static long kvm_vcpu_ioctl(struct file *filp,put_pid (oldpid); } r =kvm_arch_vcpu_ioctl_run (vcpu, vcpu->run); -vcpu_put (vcpu);trace_kvm_userspace_exit (vcpu->run->exit_reason, r);break ; }
Signature · 1 line
2.14.2
Re: [PATCH v3 03/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_run
Quoted 6 lines · Christoffer Dall
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_run().Signed-off-by Christoffer Dall <[email protected]>
Quoted 1 line
---
Re: [PATCH v3 03/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_run
In reply to Christoffer DallQuoted 6 lines · On Mon, 4 Dec 2017 21:35:25 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_run().Signed-off-by Christoffer Dall <[email protected]>
Quoted 8 lines
--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/powerpc.c | 6 +++++- arch/s390/kvm/kvm-s390.c | 10 ++++++++-- arch/x86/kvm/x86.c | 3 +++ virt/kvm/arm/arm.c | 15 +++++++++++---- virt/kvm/kvm_main.c | 2 -- 6 files changed, 30 insertions(+), 9 deletions(-)
PATCH v3 4/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_regs
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_get_regs().
--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/book3s.c | 3 +++ arch/powerpc/kvm/booke.c | 3 +++ arch/s390/kvm/kvm-s390.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 6 files changed, 14 insertions(+), 2 deletions(-)
arch/mips/kvm/mips.c +3 -0
@@ -1165,6 +1165,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); +for (i =0 ; i <ARRAY_SIZE (vcpu->arch.gprs); i++) regs->gpr[i] = vcpu->arch.gprs[i];
@@ -1172,6 +1174,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) regs->lo = vcpu->arch.lo; regs->pc = vcpu->arch.pc; +vcpu_put (vcpu);return 0 ; }
arch/powerpc/kvm/book3s.c +3 -0
@@ -497,6 +497,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); + regs->pc =kvmppc_get_pc (vcpu); regs->cr =kvmppc_get_cr (vcpu); regs->ctr =kvmppc_get_ctr (vcpu);
@@ -518,6 +520,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++) regs->gpr[i] =kvmppc_get_gpr (vcpu, i); +vcpu_put (vcpu);return 0 ; }
arch/powerpc/kvm/booke.c +3 -0
@@ -1431,6 +1431,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); + regs->pc = vcpu->arch.pc; regs->cr =kvmppc_get_cr (vcpu); regs->ctr = vcpu->arch.ctr;
@@ -1452,6 +1454,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++) regs->gpr[i] =kvmppc_get_gpr (vcpu, i); +vcpu_put (vcpu);return 0 ; }
arch/s390/kvm/kvm-s390.c +2 -0
@@ -2718,7 +2718,9 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_get_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu);memcpy (®s->gprs, &vcpu->run->s.regs.gprs,sizeof (regs->gprs)); +vcpu_put (vcpu);return 0 ; }
arch/x86/kvm/x86.c +3 -0
@@ -7309,6 +7309,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)int kvm_arch_vcpu_ioctl_get_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu); +if (vcpu->arch.emulate_regs_need_sync_to_vcpu) {/* * We are here if userspace calls get_regs() in the middle of
@@ -7342,6 +7344,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) regs->rip =kvm_rip_read (vcpu); regs->rflags =kvm_get_rflags (vcpu); +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2552,9 +2552,7 @@ static long kvm_vcpu_ioctl(struct file *filp, kvm_regs =kzalloc (sizeof (struct kvm_regs ),GFP_KERNEL );if (!kvm_regs) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_regs (vcpu, kvm_regs); -vcpu_put (vcpu);if (r) goto out_free1; r = -EFAULT ;
Signature · 1 line
2.14.2
Re: [PATCH v3 04/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_regs
Quoted 119 lines · Christoffer Dall
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_get_regs().Signed-off-by Christoffer Dall <[email protected]>--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/book3s.c | 3 +++ arch/powerpc/kvm/booke.c | 3 +++ arch/s390/kvm/kvm-s390.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 6 files changed, 14 insertions(+), 2 deletions(-)arch/mips/kvm/mips.c +3
-0@@ -1165,6 +1165,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); +for (i =0 ; i <ARRAY_SIZE (vcpu->arch.gprs); i++) regs->gpr[i] = vcpu->arch.gprs[i];@@ -1172,6 +1174,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) regs->lo = vcpu->arch.lo; regs->pc = vcpu->arch.pc; +vcpu_put (vcpu);return 0 ; }arch/powerpc/kvm/book3s.c +3
-0@@ -497,6 +497,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); + regs->pc =kvmppc_get_pc (vcpu); regs->cr =kvmppc_get_cr (vcpu); regs->ctr =kvmppc_get_ctr (vcpu);@@ -518,6 +520,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++) regs->gpr[i] =kvmppc_get_gpr (vcpu, i); +vcpu_put (vcpu);return 0 ; }arch/powerpc/kvm/booke.c +3
-0@@ -1431,6 +1431,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); + regs->pc = vcpu->arch.pc; regs->cr =kvmppc_get_cr (vcpu); regs->ctr = vcpu->arch.ctr;@@ -1452,6 +1454,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++) regs->gpr[i] =kvmppc_get_gpr (vcpu, i); +vcpu_put (vcpu);return 0 ; }arch/s390/kvm/kvm-s390.c +2
-0@@ -2718,7 +2718,9 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_get_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu);memcpy (®s->gprs, &vcpu->run->s.regs.gprs,sizeof (regs->gprs)); +vcpu_put (vcpu);return 0 ; }arch/x86/kvm/x86.c +3
-0@@ -7309,6 +7309,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)int kvm_arch_vcpu_ioctl_get_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu); +if (vcpu->arch.emulate_regs_need_sync_to_vcpu) {/* * We are here if userspace calls get_regs() in the middle of @@ -7342,6 +7344,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) regs->rip =kvm_rip_read (vcpu); regs->rflags =kvm_get_rflags (vcpu); +vcpu_put (vcpu);return 0 ; }virt/kvm/kvm_main.c +0
-0
virt/kvm/kvm_main.c static long kvm_vcpu_ioctl(struct file *filp, · line 2558
Quoted 9 lines
virt/kvm/kvm_main.c +0
-2@@ -2552,9 +2552,7 @@ static long kvm_vcpu_ioctl(struct file *filp, kvm_regs =kzalloc (sizeof (struct kvm_regs ),GFP_KERNEL );if (!kvm_regs) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_regs (vcpu, kvm_regs); -vcpu_put (vcpu);if (r) goto out_free1; r = -EFAULT ;
Signature · 3 lines
Thanks, David / dhildenb
Re: [PATCH v3 04/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_regs
In reply to Christoffer DallQuoted 6 lines · On Mon, 4 Dec 2017 21:35:26 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_get_regs().Signed-off-by Christoffer Dall <[email protected]>
Quoted 8 lines
--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/book3s.c | 3 +++ arch/powerpc/kvm/booke.c | 3 +++ arch/s390/kvm/kvm-s390.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 6 files changed, 14 insertions(+), 2 deletions(-)
PATCH v3 5/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_regs
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_set_regs().
--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/book3s.c | 3 +++ arch/powerpc/kvm/booke.c | 3 +++ arch/s390/kvm/kvm-s390.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 6 files changed, 14 insertions(+), 2 deletions(-)
arch/mips/kvm/mips.c +3 -0
@@ -1151,6 +1151,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); +for (i =1 ; i <ARRAY_SIZE (vcpu->arch.gprs); i++) vcpu->arch.gprs[i] = regs->gpr[i]; vcpu->arch.gprs[0 ] =0 ;/* zero is special, and cannot be set. */
@@ -1158,6 +1160,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) vcpu->arch.lo = regs->lo; vcpu->arch.pc = regs->pc; +vcpu_put (vcpu);return 0 ; }
arch/powerpc/kvm/book3s.c +3 -0
@@ -528,6 +528,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); +kvmppc_set_pc (vcpu, regs->pc);kvmppc_set_cr (vcpu, regs->cr);kvmppc_set_ctr (vcpu, regs->ctr);
@@ -548,6 +550,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++)kvmppc_set_gpr (vcpu, i, regs->gpr[i]); +vcpu_put (vcpu);return 0 ; }
arch/powerpc/kvm/booke.c +3 -0
@@ -1462,6 +1462,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); + vcpu->arch.pc = regs->pc;kvmppc_set_cr (vcpu, regs->cr); vcpu->arch.ctr = regs->ctr;
@@ -1483,6 +1485,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++)kvmppc_set_gpr (vcpu, i, regs->gpr[i]); +vcpu_put (vcpu);return 0 ; }
arch/s390/kvm/kvm-s390.c +2 -0
@@ -2712,7 +2712,9 @@ static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)int kvm_arch_vcpu_ioctl_set_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu);memcpy (&vcpu->run->s.regs.gprs, ®s->gprs,sizeof (regs->gprs)); +vcpu_put (vcpu);return 0 ; }
arch/x86/kvm/x86.c +3 -0
@@ -7350,6 +7350,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_set_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu); + vcpu->arch.emulate_regs_need_sync_from_vcpu = true; vcpu->arch.emulate_regs_need_sync_to_vcpu = false;
@@ -7379,6 +7381,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)kvm_make_request (KVM_REQ_EVENT , vcpu); +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2572,9 +2572,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r =PTR_ERR (kvm_regs); goto out; } -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_regs (vcpu, kvm_regs); -vcpu_put (vcpu);kfree (kvm_regs);break ; }
Signature · 1 line
2.14.2
Re: [PATCH v3 05/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_regs
Quoted 119 lines · Christoffer Dall
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_regs().Signed-off-by Christoffer Dall <[email protected]>--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/book3s.c | 3 +++ arch/powerpc/kvm/booke.c | 3 +++ arch/s390/kvm/kvm-s390.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 6 files changed, 14 insertions(+), 2 deletions(-)arch/mips/kvm/mips.c +3
-0@@ -1151,6 +1151,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); +for (i =1 ; i <ARRAY_SIZE (vcpu->arch.gprs); i++) vcpu->arch.gprs[i] = regs->gpr[i]; vcpu->arch.gprs[0 ] =0 ;/* zero is special, and cannot be set. */ @@ -1158,6 +1160,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) vcpu->arch.lo = regs->lo; vcpu->arch.pc = regs->pc; +vcpu_put (vcpu);return 0 ; }arch/powerpc/kvm/book3s.c +3
-0@@ -528,6 +528,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); +kvmppc_set_pc (vcpu, regs->pc);kvmppc_set_cr (vcpu, regs->cr);kvmppc_set_ctr (vcpu, regs->ctr);@@ -548,6 +550,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++)kvmppc_set_gpr (vcpu, i, regs->gpr[i]); +vcpu_put (vcpu);return 0 ; }arch/powerpc/kvm/booke.c +3
-0@@ -1462,6 +1462,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) {int i; +vcpu_load (vcpu); + vcpu->arch.pc = regs->pc;kvmppc_set_cr (vcpu, regs->cr); vcpu->arch.ctr = regs->ctr;@@ -1483,6 +1485,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)for (i =0 ; i <ARRAY_SIZE (regs->gpr); i++)kvmppc_set_gpr (vcpu, i, regs->gpr[i]); +vcpu_put (vcpu);return 0 ; }arch/s390/kvm/kvm-s390.c +2
-0@@ -2712,7 +2712,9 @@ static int kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)int kvm_arch_vcpu_ioctl_set_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu);memcpy (&vcpu->run->s.regs.gprs, ®s->gprs,sizeof (regs->gprs)); +vcpu_put (vcpu);return 0 ; }arch/x86/kvm/x86.c +3
-0@@ -7350,6 +7350,8 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_set_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs) { +vcpu_load (vcpu); + vcpu->arch.emulate_regs_need_sync_from_vcpu = true; vcpu->arch.emulate_regs_need_sync_to_vcpu = false;@@ -7379,6 +7381,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)kvm_make_request (KVM_REQ_EVENT , vcpu); +vcpu_put (vcpu);return 0 ; }virt/kvm/kvm_main.c +0
-0
virt/kvm/kvm_main.c static long kvm_vcpu_ioctl(struct file *filp, · line 2578
Quoted 9 lines
virt/kvm/kvm_main.c +0
-2@@ -2572,9 +2572,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r =PTR_ERR (kvm_regs); goto out; } -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_regs (vcpu, kvm_regs); -vcpu_put (vcpu);kfree (kvm_regs);break ; }
Signature · 3 lines
Thanks, David / dhildenb
Re: [PATCH v3 05/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_regs
In reply to Christoffer DallQuoted 6 lines · On Mon, 4 Dec 2017 21:35:27 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_regs().Signed-off-by Christoffer Dall <[email protected]>
Quoted 8 lines
--- arch/mips/kvm/mips.c | 3 +++ arch/powerpc/kvm/book3s.c | 3 +++ arch/powerpc/kvm/booke.c | 3 +++ arch/s390/kvm/kvm-s390.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 6 files changed, 14 insertions(+), 2 deletions(-)
PATCH v3 6/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_sregs
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_get_sregs().
--- arch/powerpc/kvm/book3s.c | 8 +++++++- arch/powerpc/kvm/booke.c | 9 ++++++++- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 5 files changed, 22 insertions(+), 4 deletions(-)
arch/powerpc/kvm/book3s.c +7 -1
@@ -484,7 +484,13 @@ void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu)int kvm_arch_vcpu_ioctl_get_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { -return vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); +int ret; + +vcpu_load (vcpu); + ret = vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); +vcpu_put (vcpu); + +return ret; } int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
arch/powerpc/kvm/booke.c +8 -1
@@ -1613,11 +1613,18 @@ int kvmppc_set_sregs_ivor(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)int kvm_arch_vcpu_ioctl_get_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +int ret; + +vcpu_load (vcpu); + sregs->pvr = vcpu->arch.pvr;get_sregs_base (vcpu, sregs);get_sregs_arch206 (vcpu, sregs); -return vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); + ret = vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); + +vcpu_put (vcpu); +return ret; } int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
arch/s390/kvm/kvm-s390.c +4 -0
@@ -2737,8 +2737,12 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_get_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +vcpu_load (vcpu); +memcpy (&sregs->acrs, &vcpu->run->s.regs.acrs,sizeof (sregs->acrs));memcpy (&sregs->crs, &vcpu->arch.sie_block->gcr,sizeof (sregs->crs)); + +vcpu_put (vcpu);return 0 ; }
arch/x86/kvm/x86.c +3 -0
@@ -7400,6 +7400,8 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, {struct desc_ptr dt; +vcpu_load (vcpu); +kvm_get_segment (vcpu, &sregs->cs,VCPU_SREG_CS );kvm_get_segment (vcpu, &sregs->ds,VCPU_SREG_DS );kvm_get_segment (vcpu, &sregs->es,VCPU_SREG_ES );
@@ -7431,6 +7433,7 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,set_bit (vcpu->arch.interrupt.nr, (unsigned long *)sregs->interrupt_bitmap); +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2581,9 +2581,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -ENOMEM ;if (!kvm_sregs) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_sregs (vcpu, kvm_sregs); -vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
Signature · 1 line
2.14.2
Re: [PATCH v3 06/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_sregs
Quoted 101 lines · Christoffer Dall
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_get_sregs().Signed-off-by Christoffer Dall <[email protected]>--- arch/powerpc/kvm/book3s.c | 8 +++++++- arch/powerpc/kvm/booke.c | 9 ++++++++- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 5 files changed, 22 insertions(+), 4 deletions(-)arch/powerpc/kvm/book3s.c +7
-1@@ -484,7 +484,13 @@ void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu)int kvm_arch_vcpu_ioctl_get_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { -return vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); +int ret; + +vcpu_load (vcpu); + ret = vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); +vcpu_put (vcpu); + +return ret; } int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,arch/powerpc/kvm/booke.c +8
-1@@ -1613,11 +1613,18 @@ int kvmppc_set_sregs_ivor(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)int kvm_arch_vcpu_ioctl_get_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +int ret; + +vcpu_load (vcpu); + sregs->pvr = vcpu->arch.pvr;get_sregs_base (vcpu, sregs);get_sregs_arch206 (vcpu, sregs); -return vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); + ret = vcpu->kvm->arch.kvm_ops->get_sregs (vcpu, sregs); + +vcpu_put (vcpu); +return ret; } int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,arch/s390/kvm/kvm-s390.c +4
-0@@ -2737,8 +2737,12 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_get_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +vcpu_load (vcpu); +memcpy (&sregs->acrs, &vcpu->run->s.regs.acrs,sizeof (sregs->acrs));memcpy (&sregs->crs, &vcpu->arch.sie_block->gcr,sizeof (sregs->crs)); + +vcpu_put (vcpu);return 0 ; }arch/x86/kvm/x86.c +3
-0@@ -7400,6 +7400,8 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, {struct desc_ptr dt; +vcpu_load (vcpu); +kvm_get_segment (vcpu, &sregs->cs,VCPU_SREG_CS );kvm_get_segment (vcpu, &sregs->ds,VCPU_SREG_DS );kvm_get_segment (vcpu, &sregs->es,VCPU_SREG_ES );@@ -7431,6 +7433,7 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,set_bit (vcpu->arch.interrupt.nr, (unsigned long *)sregs->interrupt_bitmap); +vcpu_put (vcpu);return 0 ; }virt/kvm/kvm_main.c +0
-0
virt/kvm/kvm_main.c static long kvm_vcpu_ioctl(struct file *filp, · line 2587
Quoted 9 lines
virt/kvm/kvm_main.c +0
-2@@ -2581,9 +2581,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -ENOMEM ;if (!kvm_sregs) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_sregs (vcpu, kvm_sregs); -vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
Signature · 3 lines
Thanks, David / dhildenb
Re: [PATCH v3 06/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_sregs
In reply to Christoffer DallQuoted 5 lines · On Mon, 4 Dec 2017 21:35:28 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_get_sregs().
Quoted 8 lines
Signed-off-by Christoffer Dall <[email protected]>--- arch/powerpc/kvm/book3s.c | 8 +++++++- arch/powerpc/kvm/booke.c | 9 ++++++++- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 5 files changed, 22 insertions(+), 4 deletions(-)
PATCH v3 7/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_sregs
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_set_sregs().
--- arch/powerpc/kvm/book3s.c | 8 +++++++- arch/powerpc/kvm/booke.c | 15 +++++++++++---- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 13 ++++++++++--- virt/kvm/kvm_main.c | 2 -- 5 files changed, 32 insertions(+), 10 deletions(-)
arch/powerpc/kvm/book3s.c +7 -1
@@ -496,7 +496,13 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_set_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { -return vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); +int ret; + +vcpu_load (vcpu); + ret = vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); +vcpu_put (vcpu); + +return ret; }int kvm_arch_vcpu_ioctl_get_regs (struct kvm_vcpu *vcpu,struct kvm_regs *regs)
arch/powerpc/kvm/booke.c +11 -4
@@ -1632,18 +1632,25 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, {int ret; +vcpu_load (vcpu); + + ret = -EINVAL ;if (vcpu->arch.pvr != sregs->pvr) -return -EINVAL ; + goto out; ret =set_sregs_base (vcpu, sregs);if (ret <0 ) -return ret; + goto out; ret =set_sregs_arch206 (vcpu, sregs);if (ret <0 ) -return ret; + goto out; + + ret = vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); -return vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); +out: +vcpu_put (vcpu); +return ret; } int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,
arch/s390/kvm/kvm-s390.c +4 -0
@@ -2729,8 +2729,12 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_set_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +vcpu_load (vcpu); +memcpy (&vcpu->run->s.regs.acrs, &sregs->acrs,sizeof (sregs->acrs));memcpy (&vcpu->arch.sie_block->gcr, &sregs->crs,sizeof (sregs->crs)); + +vcpu_put (vcpu);return 0 ; }
arch/x86/kvm/x86.c +10 -3
@@ -7500,15 +7500,19 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,int mmu_reset_needed =0 ;int pending_vec, max_bits, idx;struct desc_ptr dt; +int ret; + +vcpu_load (vcpu); + ret = -EINVAL ;if (!guest_cpuid_has (vcpu,X86_FEATURE_XSAVE ) && (sregs->cr4 &X86_CR4_OSXSAVE )) -return -EINVAL ; + goto out; apic_base_msr.data = sregs->apic_base; apic_base_msr.host_initiated = true;if (kvm_set_apic_base (vcpu, &apic_base_msr)) -return -EINVAL ; + goto out; dt.size = sregs->idt.limit; dt.address = sregs->idt.base;
@@ -7574,7 +7578,10 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,kvm_make_request (KVM_REQ_EVENT , vcpu); -return 0 ; + ret =0 ; +out: +vcpu_put (vcpu); +return ret; } int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
virt/kvm/kvm_main.c +0 -2
@@ -2597,9 +2597,7 @@ static long kvm_vcpu_ioctl(struct file *filp, kvm_sregs =NULL ; goto out; } -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_sregs (vcpu, kvm_sregs); -vcpu_put (vcpu);break ; }case KVM_GET_MP_STATE : {
Signature · 1 line
2.14.2
Re: [PATCH v3 07/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_sregs
Quoted 8 lines
int
kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)arch/powerpc/kvm/booke.c +0
-0
arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, · line 1637
Quoted 6 lines
arch/powerpc/kvm/booke.c +3
-0@@ -1632,18 +1632,25 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, {int ret; +vcpu_load (vcpu); + + ret = -EINVAL ;
you can initialize this directly.
Quoted 45 lines
arch/powerpc/kvm/booke.c +8
-4if (vcpu->arch.pvr != sregs->pvr) -return -EINVAL ; + goto out; ret =set_sregs_base (vcpu, sregs);if (ret <0 ) -return ret; + goto out; ret =set_sregs_arch206 (vcpu, sregs);if (ret <0 ) -return ret; + goto out; + + ret = vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); -return vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); +out: +vcpu_put (vcpu); +return ret; } int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,arch/s390/kvm/kvm-s390.c +4
-0@@ -2729,8 +2729,12 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_set_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +vcpu_load (vcpu); +memcpy (&vcpu->run->s.regs.acrs, &sregs->acrs,sizeof (sregs->acrs));memcpy (&vcpu->arch.sie_block->gcr, &sregs->crs,sizeof (sregs->crs)); + +vcpu_put (vcpu);return 0 ; }arch/x86/kvm/x86.c +0
-0
arch/x86/kvm/x86.c int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, · line 7507
Quoted 8 lines
arch/x86/kvm/x86.c +4
-0@@ -7500,15 +7500,19 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,int mmu_reset_needed =0 ;int pending_vec, max_bits, idx;struct desc_ptr dt; +int ret; + +vcpu_load (vcpu); + ret = -EINVAL ;
dito
Signature · 3 lines
Thanks, David / dhildenb
Re: [PATCH v3 07/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_sregs
Quoted 69 lines · David Hildenbrand
Quoted 8 lines
int
kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)arch/powerpc/kvm/booke.c +0
-0arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, · line 1637
Quoted 6 lines
arch/powerpc/kvm/booke.c +3
-0@@ -1632,18 +1632,25 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, {int ret; +vcpu_load (vcpu); + + ret = -EINVAL ;you can initialize this directly.
Quoted 52 lines
arch/powerpc/kvm/booke.c +8
-4if (vcpu->arch.pvr != sregs->pvr) -return -EINVAL ; + goto out; ret =set_sregs_base (vcpu, sregs);if (ret <0 ) -return ret; + goto out; ret =set_sregs_arch206 (vcpu, sregs);if (ret <0 ) -return ret; + goto out; + + ret = vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); -return vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); +out: +vcpu_put (vcpu); +return ret; } int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,arch/s390/kvm/kvm-s390.c +4
-0@@ -2729,8 +2729,12 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_set_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +vcpu_load (vcpu); +memcpy (&vcpu->run->s.regs.acrs, &sregs->acrs,sizeof (sregs->acrs));memcpy (&vcpu->arch.sie_block->gcr, &sregs->crs,sizeof (sregs->crs)); + +vcpu_put (vcpu);return 0 ; }arch/x86/kvm/x86.c +3
-0@@ -7500,15 +7500,19 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,int mmu_reset_needed =0 ;int pending_vec, max_bits, idx;struct desc_ptr dt; +int ret; + +vcpu_load (vcpu);
Quoted 3 lines
arch/x86/kvm/x86.c int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, · line 7507
Quoted 1 line
arch/x86/kvm/x86.c +1
-0+ ret = -EINVAL ;dito
Sure.
Quoted 4 lines
Reviewed-by David Hildenbrand <[email protected]>
Thanks for the review!
-Christoffer
Paolo Bonzini
maintainerRe: [PATCH v3 07/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_sregs
Quoted 70 lines · Christoffer Dall
Quoted 69 lines · David Hildenbrand
Quoted 8 lines
int
kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)arch/powerpc/kvm/booke.c +0
-0arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, · line 1637
Quoted 6 lines
arch/powerpc/kvm/booke.c +3
-0@@ -1632,18 +1632,25 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, {int ret; +vcpu_load (vcpu); + + ret = -EINVAL ;you can initialize this directly.
Quoted 52 lines
arch/powerpc/kvm/booke.c +8
-4if (vcpu->arch.pvr != sregs->pvr) -return -EINVAL ; + goto out; ret =set_sregs_base (vcpu, sregs);if (ret <0 ) -return ret; + goto out; ret =set_sregs_arch206 (vcpu, sregs);if (ret <0 ) -return ret; + goto out; + + ret = vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); -return vcpu->kvm->arch.kvm_ops->set_sregs (vcpu, sregs); +out: +vcpu_put (vcpu); +return ret; } int kvmppc_get_one_reg(struct kvm_vcpu *vcpu, u64 id,arch/s390/kvm/kvm-s390.c +4
-0@@ -2729,8 +2729,12 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)int kvm_arch_vcpu_ioctl_set_sregs (struct kvm_vcpu *vcpu,struct kvm_sregs *sregs) { +vcpu_load (vcpu); +memcpy (&vcpu->run->s.regs.acrs, &sregs->acrs,sizeof (sregs->acrs));memcpy (&vcpu->arch.sie_block->gcr, &sregs->crs,sizeof (sregs->crs)); + +vcpu_put (vcpu);return 0 ; }arch/x86/kvm/x86.c +3
-0@@ -7500,15 +7500,19 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,int mmu_reset_needed =0 ;int pending_vec, max_bits, idx;struct desc_ptr dt; +int ret; + +vcpu_load (vcpu);
Quoted 5 lines
Quoted 3 lines
arch/x86/kvm/x86.c int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, · line 7507
Quoted 1 line
arch/x86/kvm/x86.c +1
-0+ ret = -EINVAL ;dito
Sure.
I'm doing it when applying.
Paolo
Quoted 1 line
Quoted 1 line
Reviewed-by David Hildenbrand <[email protected]>
Re: [PATCH v3 07/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_sregs
In reply to Christoffer DallQuoted 5 lines · On Mon, 4 Dec 2017 21:35:29 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_sregs().
Quoted 8 lines
Signed-off-by Christoffer Dall <[email protected]>--- arch/powerpc/kvm/book3s.c | 8 +++++++- arch/powerpc/kvm/booke.c | 15 +++++++++++---- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 13 ++++++++++--- virt/kvm/kvm_main.c | 2 -- 5 files changed, 32 insertions(+), 10 deletions(-)
With David's suggestions included:
PATCH v3 8/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_mpstate
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_get_mpstate().
--- arch/s390/kvm/kvm-s390.c | 11 +++++++++-- arch/x86/kvm/x86.c | 3 +++ virt/kvm/arm/arm.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 4 files changed, 15 insertions(+), 4 deletions(-)
arch/s390/kvm/kvm-s390.c +9 -2
@@ -2836,9 +2836,16 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_get_mpstate (struct kvm_vcpu *vcpu,struct kvm_mp_state *mp_state) { +int ret; + +vcpu_load (vcpu); +/* CHECK_STOP and LOAD are not supported yet */ -return is_vcpu_stopped (vcpu) ?KVM_MP_STATE_STOPPED : -KVM_MP_STATE_OPERATING ; + ret =is_vcpu_stopped (vcpu) ?KVM_MP_STATE_STOPPED : +KVM_MP_STATE_OPERATING ; + +vcpu_put (vcpu); +return ret; } int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
arch/x86/kvm/x86.c +3 -0
@@ -7440,6 +7440,8 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_get_mpstate (struct kvm_vcpu *vcpu,struct kvm_mp_state *mp_state) { +vcpu_load (vcpu); +kvm_apic_accept_events (vcpu);if (vcpu->arch.mp_state ==KVM_MP_STATE_HALTED && vcpu->arch.pv.pv_unhalted)
@@ -7447,6 +7449,7 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,else mp_state->mp_state = vcpu->arch.mp_state; +vcpu_put (vcpu);return 0 ; }
virt/kvm/arm/arm.c +3 -0
@@ -381,11 +381,14 @@ static void vcpu_power_off(struct kvm_vcpu *vcpu)int kvm_arch_vcpu_ioctl_get_mpstate (struct kvm_vcpu *vcpu,struct kvm_mp_state *mp_state) { +vcpu_load (vcpu); +if (vcpu->arch.power_off) mp_state->mp_state =KVM_MP_STATE_STOPPED ;else mp_state->mp_state =KVM_MP_STATE_RUNNABLE ; +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2603,9 +2603,7 @@ static long kvm_vcpu_ioctl(struct file *filp,case KVM_GET_MP_STATE : {struct kvm_mp_state mp_state; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_mpstate (vcpu, &mp_state); -vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
Signature · 1 line
2.14.2
Re: [PATCH v3 08/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_mpstate
Quoted 5 lines · On Mon, 4 Dec 2017 21:35:30 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_get_mpstate().
Quoted 8 lines
Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/s390/kvm/kvm-s390.c | 11 +++++++++-- arch/x86/kvm/x86.c | 3 +++ virt/kvm/arm/arm.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 4 files changed, 15 insertions(+), 4 deletions(-)
PATCH v3 9/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_mpstate
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_set_mpstate().
--- arch/s390/kvm/kvm-s390.c | 3 +++ arch/x86/kvm/x86.c | 14 +++++++++++--- virt/kvm/arm/arm.c | 9 +++++++-- virt/kvm/kvm_main.c | 2 -- 4 files changed, 21 insertions(+), 7 deletions(-)
arch/s390/kvm/kvm-s390.c +3 -0
@@ -2853,6 +2853,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, {int rc =0 ; +vcpu_load (vcpu); +/* user space knows about this interface - let it control the state */ vcpu->kvm->arch.user_cpu_state_ctrl =1 ;
@@ -2870,6 +2872,7 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, rc = -ENXIO ; } +vcpu_put (vcpu);return rc; }
arch/x86/kvm/x86.c +11 -3
@@ -7456,15 +7456,19 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_set_mpstate (struct kvm_vcpu *vcpu,struct kvm_mp_state *mp_state) { +int ret = -EINVAL ; + +vcpu_load (vcpu); +if (!lapic_in_kernel (vcpu) && mp_state->mp_state !=KVM_MP_STATE_RUNNABLE ) -return -EINVAL ; + goto out;/* INITs are latched while in SMM */ if ((is_smm (vcpu) || vcpu->arch.smi_pending) && (mp_state->mp_state ==KVM_MP_STATE_SIPI_RECEIVED || mp_state->mp_state ==KVM_MP_STATE_INIT_RECEIVED )) -return -EINVAL ; + goto out;if (mp_state->mp_state ==KVM_MP_STATE_SIPI_RECEIVED ) { vcpu->arch.mp_state =KVM_MP_STATE_INIT_RECEIVED ;
@@ -7472,7 +7476,11 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, }else vcpu->arch.mp_state = mp_state->mp_state;kvm_make_request (KVM_REQ_EVENT , vcpu); -return 0 ; + + ret =0 ; +out: +vcpu_put (vcpu); +return ret; } int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int idt_index,
virt/kvm/arm/arm.c +7 -2
@@ -395,6 +395,10 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_set_mpstate (struct kvm_vcpu *vcpu,struct kvm_mp_state *mp_state) { +int ret =0 ; + +vcpu_load (vcpu); +switch (mp_state->mp_state) {case KVM_MP_STATE_RUNNABLE : vcpu->arch.power_off = false;
@@ -403,10 +407,11 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,vcpu_power_off (vcpu);break ;default : -return -EINVAL ; + ret = -EINVAL ; } -return 0 ; +vcpu_put (vcpu); +return ret; }/**
virt/kvm/kvm_main.c +0 -2
@@ -2618,9 +2618,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EFAULT ;if (copy_from_user (&mp_state, argp,sizeof (mp_state))) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_mpstate (vcpu, &mp_state); -vcpu_put (vcpu);break ; }case KVM_TRANSLATE : {
Signature · 1 line
2.14.2
Re: [PATCH v3 09/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_mpstate
Quoted 5 lines · On Mon, 4 Dec 2017 21:35:31 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_mpstate().
Quoted 8 lines
Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/s390/kvm/kvm-s390.c | 3 +++ arch/x86/kvm/x86.c | 14 +++++++++++--- virt/kvm/arm/arm.c | 9 +++++++-- virt/kvm/kvm_main.c | 2 -- 4 files changed, 21 insertions(+), 7 deletions(-)
PATCH v3 10/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_translate
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_translate().
--- arch/powerpc/kvm/booke.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 3 files changed, 5 insertions(+), 2 deletions(-)
arch/powerpc/kvm/booke.c +2 -0
@@ -1793,7 +1793,9 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, {int r; +vcpu_load (vcpu); r =kvmppc_core_vcpu_translate (vcpu, tr); +vcpu_put (vcpu);return r; }
arch/x86/kvm/x86.c +3 -0
@@ -7660,6 +7660,8 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,gpa_t gpa;int idx; +vcpu_load (vcpu); + idx =srcu_read_lock (&vcpu->kvm->srcu); gpa =kvm_mmu_gva_to_gpa_system (vcpu, vaddr,NULL );srcu_read_unlock (&vcpu->kvm->srcu, idx);
@@ -7668,6 +7670,7 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, tr->writeable =1 ; tr->usermode =0 ; +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2627,9 +2627,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EFAULT ;if (copy_from_user (&tr, argp,sizeof (tr))) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_translate (vcpu, &tr); -vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
Signature · 1 line
2.14.2
Re: [PATCH v3 10/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_translate
Quoted 5 lines · On Mon, 4 Dec 2017 21:35:32 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_translate().
Quoted 7 lines
Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/powerpc/kvm/booke.c | 2 ++ arch/x86/kvm/x86.c | 3 +++ virt/kvm/kvm_main.c | 2 -- 3 files changed, 5 insertions(+), 2 deletions(-)
PATCH v3 11/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_guest_debug
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_set_guest_debug().
--- arch/arm64/kvm/guest.c | 15 ++++++++++++--- arch/powerpc/kvm/book3s.c | 2 ++ arch/powerpc/kvm/booke.c | 19 +++++++++++++------ arch/s390/kvm/kvm-s390.c | 16 ++++++++++++---- arch/x86/kvm/x86.c | 4 +++- virt/kvm/kvm_main.c | 2 -- 6 files changed, 42 insertions(+), 16 deletions(-)
arch/arm64/kvm/guest.c +12 -3
@@ -361,10 +361,16 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_set_guest_debug (struct kvm_vcpu *vcpu,struct kvm_guest_debug *dbg) { +int ret =0 ; + +vcpu_load (vcpu); +trace_kvm_set_guest_debug (vcpu, dbg->control); -if (dbg->control & ~KVM_GUESTDBG_VALID_MASK ) -return -EINVAL ; +if (dbg->control & ~KVM_GUESTDBG_VALID_MASK ) { + ret = -EINVAL ; + goto out; + }if (dbg->control &KVM_GUESTDBG_ENABLE ) { vcpu->guest_debug = dbg->control;
@@ -378,7 +384,10 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,/* If not enabled clear all flags */ vcpu->guest_debug =0 ; } -return 0 ; + +out: +vcpu_put (vcpu); +return ret; } int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
arch/powerpc/kvm/book3s.c +2 -0
@@ -755,7 +755,9 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_set_guest_debug (struct kvm_vcpu *vcpu,struct kvm_guest_debug *dbg) { +vcpu_load (vcpu); vcpu->guest_debug = dbg->control; +vcpu_put (vcpu);return 0 ; }
arch/powerpc/kvm/booke.c +13 -6
@@ -2018,12 +2018,15 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, {struct debug_reg *dbg_reg;int n, b =0 , w =0 ; +int ret =0 ; + +vcpu_load (vcpu);if (!(dbg->control &KVM_GUESTDBG_ENABLE )) { vcpu->arch.dbg_reg.dbcr0 =0 ; vcpu->guest_debug =0 ;kvm_guest_protect_msr (vcpu,MSR_DE , false); -return 0 ; + goto out; }kvm_guest_protect_msr (vcpu,MSR_DE , true);
@@ -2055,8 +2058,9 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,#endif if (!(vcpu->guest_debug &KVM_GUESTDBG_USE_HW_BP )) -return 0 ; + goto out; + ret = -EINVAL ;for (n =0 ; n < (KVMPPC_BOOKE_IAC_NUM +KVMPPC_BOOKE_DAC_NUM ); n++) {uint64_t addr = dbg->arch.bp[n].addr;uint32_t type = dbg->arch.bp[n].type;
@@ -2067,21 +2071,24 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,if (type & ~(KVMPPC_DEBUG_WATCH_READ |KVMPPC_DEBUG_WATCH_WRITE |KVMPPC_DEBUG_BREAKPOINT )) -return -EINVAL ; + goto out;if (type &KVMPPC_DEBUG_BREAKPOINT ) {/* Setting H/W breakpoint */ if (kvmppc_booke_add_breakpoint (dbg_reg, addr, b++)) -return -EINVAL ; + goto out; }else {/* Setting H/W watchpoint */ if (kvmppc_booke_add_watchpoint (dbg_reg, addr, type, w++)) -return -EINVAL ; + goto out; } } -return 0 ; + ret =0 ; +out: +vcpu_put (vcpu); +return ret; }void kvmppc_booke_vcpu_load (struct kvm_vcpu *vcpu,int cpu)
arch/s390/kvm/kvm-s390.c +12 -4
@@ -2804,13 +2804,19 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, {int rc =0 ; +vcpu_load (vcpu); + vcpu->guest_debug =0 ;kvm_s390_clear_bp_data (vcpu); -if (dbg->control & ~VALID_GUESTDBG_FLAGS ) -return -EINVAL ; -if (!sclp.has_gpere) -return -EINVAL ; +if (dbg->control & ~VALID_GUESTDBG_FLAGS ) { + rc = -EINVAL ; + goto out; + } +if (!sclp.has_gpere) { + rc = -EINVAL ; + goto out; + }if (dbg->control &KVM_GUESTDBG_ENABLE ) { vcpu->guest_debug = dbg->control;
@@ -2830,6 +2836,8 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,atomic_andnot (CPUSTAT_P , &vcpu->arch.sie_block->cpuflags); } +out: +vcpu_put (vcpu);return rc; }
arch/x86/kvm/x86.c +3 -1
@@ -7601,6 +7601,8 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,unsigned long rflags;int i, r; +vcpu_load (vcpu); +if (dbg->control & (KVM_GUESTDBG_INJECT_DB |KVM_GUESTDBG_INJECT_BP )) { r = -EBUSY ;if (vcpu->arch.exception.pending)
@@ -7646,7 +7648,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, r =0 ; out: - +vcpu_put (vcpu);return r; }
virt/kvm/kvm_main.c +0 -2
@@ -2642,9 +2642,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -EFAULT ;if (copy_from_user (&dbg, argp,sizeof (dbg))) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_guest_debug (vcpu, &dbg); -vcpu_put (vcpu);break ; }case KVM_SET_SIGNAL_MASK : {
Signature · 1 line
2.14.2
Re: [PATCH v3 11/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_guest_debug
Quoted 62 lines · On Mon, 4 Dec 2017 21:35:33 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_guest_debug().Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/arm64/kvm/guest.c | 15 ++++++++++++--- arch/powerpc/kvm/book3s.c | 2 ++ arch/powerpc/kvm/booke.c | 19 +++++++++++++------ arch/s390/kvm/kvm-s390.c | 16 ++++++++++++---- arch/x86/kvm/x86.c | 4 +++- virt/kvm/kvm_main.c | 2 -- 6 files changed, 42 insertions(+), 16 deletions(-)arch/powerpc/kvm/booke.c +8
-4@@ -2018,12 +2018,15 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, {struct debug_reg *dbg_reg;int n, b =0 , w =0 ; +int ret =0 ; + +vcpu_load (vcpu);if (!(dbg->control &KVM_GUESTDBG_ENABLE )) { vcpu->arch.dbg_reg.dbcr0 =0 ; vcpu->guest_debug =0 ;kvm_guest_protect_msr (vcpu,MSR_DE , false); -return 0 ; + goto out; }kvm_guest_protect_msr (vcpu,MSR_DE , true);@@ -2055,8 +2058,9 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,#endif if (!(vcpu->guest_debug &KVM_GUESTDBG_USE_HW_BP )) -return 0 ; + goto out; + ret = -EINVAL ;for (n =0 ; n < (KVMPPC_BOOKE_IAC_NUM +KVMPPC_BOOKE_DAC_NUM ); n++) {uint64_t addr = dbg->arch.bp[n].addr;uint32_t type = dbg->arch.bp[n].type;@@ -2067,21 +2071,24 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,if (type & ~(KVMPPC_DEBUG_WATCH_READ |KVMPPC_DEBUG_WATCH_WRITE |KVMPPC_DEBUG_BREAKPOINT )) -return -EINVAL ; + goto out;if (type &KVMPPC_DEBUG_BREAKPOINT ) {/* Setting H/W breakpoint */ if (kvmppc_booke_add_breakpoint (dbg_reg, addr, b++)) -return -EINVAL ; + goto out; }else {
arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, · line 2088
Quoted 10 lines
arch/powerpc/kvm/booke.c +2
-2/* Setting H/W watchpoint */ if (kvmppc_booke_add_watchpoint (dbg_reg, addr, type, w++)) -return -EINVAL ; + goto out; } } -return 0 ; + ret =0 ;
I would probably set the -EINVAL in the individual branches (so it is clear that something is wrong, and it is not just a benign exit as in the cases above), but your code is correct as well. Let the powerpc folks decide.
arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, · line 2094
Quoted 6 lines
arch/powerpc/kvm/booke.c +3
-0+out: +vcpu_put (vcpu); +return ret; }void kvmppc_booke_vcpu_load (struct kvm_vcpu *vcpu,int cpu)
In any case,
Re: [PATCH v3 11/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_guest_debug
Quoted 73 lines · Cornelia Huck
Quoted 70 lines · On Mon, 4 Dec 2017 21:35:33 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_guest_debug().Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/arm64/kvm/guest.c | 15 ++++++++++++--- arch/powerpc/kvm/book3s.c | 2 ++ arch/powerpc/kvm/booke.c | 19 +++++++++++++------ arch/s390/kvm/kvm-s390.c | 16 ++++++++++++---- arch/x86/kvm/x86.c | 4 +++- virt/kvm/kvm_main.c | 2 -- 6 files changed, 42 insertions(+), 16 deletions(-)arch/powerpc/kvm/booke.c +9
-5@@ -2018,12 +2018,15 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, {struct debug_reg *dbg_reg;int n, b =0 , w =0 ; +int ret =0 ; + +vcpu_load (vcpu);if (!(dbg->control &KVM_GUESTDBG_ENABLE )) { vcpu->arch.dbg_reg.dbcr0 =0 ; vcpu->guest_debug =0 ;kvm_guest_protect_msr (vcpu,MSR_DE , false); -return 0 ; + goto out; }kvm_guest_protect_msr (vcpu,MSR_DE , true);@@ -2055,8 +2058,9 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,#endif if (!(vcpu->guest_debug &KVM_GUESTDBG_USE_HW_BP )) -return 0 ; + goto out; + ret = -EINVAL ;for (n =0 ; n < (KVMPPC_BOOKE_IAC_NUM +KVMPPC_BOOKE_DAC_NUM ); n++) {uint64_t addr = dbg->arch.bp[n].addr;uint32_t type = dbg->arch.bp[n].type;@@ -2067,21 +2071,24 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,if (type & ~(KVMPPC_DEBUG_WATCH_READ |KVMPPC_DEBUG_WATCH_WRITE |KVMPPC_DEBUG_BREAKPOINT )) -return -EINVAL ; + goto out;if (type &KVMPPC_DEBUG_BREAKPOINT ) {/* Setting H/W breakpoint */ if (kvmppc_booke_add_breakpoint (dbg_reg, addr, b++)) -return -EINVAL ; + goto out; }else {/* Setting H/W watchpoint */ if (kvmppc_booke_add_watchpoint (dbg_reg, addr, type, w++)) -return -EINVAL ; + goto out; } }
Quoted 6 lines
arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, · line 2088
Quoted 2 lines
arch/powerpc/kvm/booke.c +1
-1-return 0 ; + ret =0 ;I would probably set the
-EINVALin the individual branches (so it is clear that something is wrong, and it is not just a benign exit as in the cases above), but your code is correct as well.
I think that's better as well actually. I got probably got a little used to that pattern after looking the main dispatcher function for a while. I'm happy to change it.
Quoted 10 lines
arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, · line 2094
Quoted 6 lines
arch/powerpc/kvm/booke.c +3
-0+out: +vcpu_put (vcpu); +return ret; }void kvmppc_booke_vcpu_load (struct kvm_vcpu *vcpu,int cpu)In any case,
Reviewed-by Cornelia Huck <[email protected]>
Thanks!
-Christoffer
Paolo Bonzini
maintainerRe: [PATCH v3 11/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_guest_debug
In reply to Cornelia HuckQuoted 25 lines · Cornelia Huck
Quoted 25 lines
arch/powerpc/kvm/booke.c +4
-3+ ret = -EINVAL ;for (n =0 ; n < (KVMPPC_BOOKE_IAC_NUM +KVMPPC_BOOKE_DAC_NUM ); n++) {uint64_t addr = dbg->arch.bp[n].addr;uint32_t type = dbg->arch.bp[n].type;@@ -2067,21 +2071,24 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,if (type & ~(KVMPPC_DEBUG_WATCH_READ |KVMPPC_DEBUG_WATCH_WRITE |KVMPPC_DEBUG_BREAKPOINT )) -return -EINVAL ; + goto out;if (type &KVMPPC_DEBUG_BREAKPOINT ) {/* Setting H/W breakpoint */ if (kvmppc_booke_add_breakpoint (dbg_reg, addr, b++)) -return -EINVAL ; + goto out; }else {/* Setting H/W watchpoint */ if (kvmppc_booke_add_watchpoint (dbg_reg, addr, type, w++)) -return -EINVAL ; + goto out; } }
Quoted 7 lines
arch/powerpc/kvm/booke.c int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, · line 2088
Quoted 2 lines
arch/powerpc/kvm/booke.c +1
-1-return 0 ; + ret =0 ;I would probably set the
-EINVALin the individual branches (so it is clear that something is wrong, and it is not just a benign exit as in the cases above), but your code is correct as well. Let the powerpc folks decide.
The idiom that Christoffer used is found elsewhere in KVM, so I'm accepting his version. Thanks for the review!
Paolo
PATCH v3 12/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_fpu
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_get_fpu().
--- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 7 +++++-- virt/kvm/kvm_main.c | 2 -- 3 files changed, 9 insertions(+), 4 deletions(-)
arch/s390/kvm/kvm-s390.c +4 -0
@@ -2765,6 +2765,8 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)int kvm_arch_vcpu_ioctl_get_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu) { +vcpu_load (vcpu); +/* make sure we have the latest values */ save_fpu_regs ();if (MACHINE_HAS_VX )
@@ -2773,6 +2775,8 @@ int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)else memcpy (fpu->fprs, vcpu->run->s.regs.fprs,sizeof (fpu->fprs)); fpu->fpc = vcpu->run->s.regs.fpc; + +vcpu_put (vcpu);return 0 ; }
arch/x86/kvm/x86.c +5 -2
@@ -7678,9 +7678,11 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_get_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu) { -struct fxregs_state *fxsave = - &vcpu->arch.guest_fpu.state.fxsave; +struct fxregs_state *fxsave; +vcpu_load (vcpu); + + fxsave = &vcpu->arch.guest_fpu.state.fxsave;memcpy (fpu->fpr, fxsave->st_space,128 ); fpu->fcw = fxsave->cwd; fpu->fsw = fxsave->swd;
@@ -7690,6 +7692,7 @@ int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) fpu->last_dp = fxsave->rdp;memcpy (fpu->xmm, fxsave->xmm_space,sizeof fxsave->xmm_space); +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2673,9 +2673,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r = -ENOMEM ;if (!fpu) goto out; -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_get_fpu (vcpu, fpu); -vcpu_put (vcpu);if (r) goto out; r = -EFAULT ;
Signature · 1 line
2.14.2
Re: [PATCH v3 12/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_get_fpu
Quoted 5 lines · On Mon, 4 Dec 2017 21:35:34 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_get_fpu().
Quoted 7 lines
Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/s390/kvm/kvm-s390.c | 4 ++++ arch/x86/kvm/x86.c | 7 +++++-- virt/kvm/kvm_main.c | 2 -- 3 files changed, 9 insertions(+), 4 deletions(-)
PATCH v3 13/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_fpu
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move vcpu_load() and vcpu_put() into the architecture specific implementations of kvm_arch_vcpu_ioctl_set_fpu().
--- arch/s390/kvm/kvm-s390.c | 15 ++++++++++++--- arch/x86/kvm/x86.c | 8 ++++++-- virt/kvm/kvm_main.c | 2 -- 3 files changed, 18 insertions(+), 7 deletions(-)
arch/s390/kvm/kvm-s390.c +12 -3
@@ -2752,15 +2752,24 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,int kvm_arch_vcpu_ioctl_set_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu) { -if (test_fp_ctl (fpu->fpc)) -return -EINVAL ; +int ret =0 ; + +vcpu_load (vcpu); + +if (test_fp_ctl (fpu->fpc)) { + ret = -EINVAL ; + goto out; + } vcpu->run->s.regs.fpc = fpu->fpc;if (MACHINE_HAS_VX )convert_fp_to_vx ((__vector128 *) vcpu->run->s.regs.vrs, (freg_t *) fpu->fprs);else memcpy (vcpu->run->s.regs.fprs, &fpu->fprs,sizeof (fpu->fprs)); -return 0 ; + +out: +vcpu_put (vcpu); +return ret; }int kvm_arch_vcpu_ioctl_get_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu)
arch/x86/kvm/x86.c +6 -2
@@ -7698,8 +7698,11 @@ int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)int kvm_arch_vcpu_ioctl_set_fpu (struct kvm_vcpu *vcpu,struct kvm_fpu *fpu) { -struct fxregs_state *fxsave = - &vcpu->arch.guest_fpu.state.fxsave; +struct fxregs_state *fxsave; + +vcpu_load (vcpu); + + fxsave = &vcpu->arch.guest_fpu.state.fxsave;memcpy (fxsave->st_space, fpu->fpr,128 ); fxsave->cwd = fpu->fcw;
@@ -7710,6 +7713,7 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) fxsave->rdp = fpu->last_dp;memcpy (fxsave->xmm_space, fpu->xmm,sizeof fxsave->xmm_space); +vcpu_put (vcpu);return 0 ; }
virt/kvm/kvm_main.c +0 -2
@@ -2689,9 +2689,7 @@ static long kvm_vcpu_ioctl(struct file *filp, fpu =NULL ; goto out; } -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl_set_fpu (vcpu, fpu); -vcpu_put (vcpu);break ; }default :
Signature · 1 line
2.14.2
Re: [PATCH v3 13/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl_set_fpu
Quoted 5 lines · On Mon, 4 Dec 2017 21:35:35 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move
vcpu_load()andvcpu_put()into the architecture specific implementations ofkvm_arch_vcpu_ioctl_set_fpu().
Quoted 7 lines
Reviewed-by David Hildenbrand <[email protected]>Signed-off-by Christoffer Dall <[email protected]>--- arch/s390/kvm/kvm-s390.c | 15 ++++++++++++--- arch/x86/kvm/x86.c | 8 ++++++-- virt/kvm/kvm_main.c | 2 -- 3 files changed, 18 insertions(+), 7 deletions(-)
PATCH v3 14/16 KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Move the calls to vcpu_load() and vcpu_put() in to the architecture specific implementations of kvm_arch_vcpu_ioctl() which dispatches further architecture-specific ioctls on to other functions.
Some architectures support asynchronous vcpu ioctls which cannot call vcpu_load() or take the vcpu->mutex, because that would prevent concurrent execution with a running VCPU, which is the intended purpose of these ioctls, for example because they inject interrupts.
We repeat the separate checks for these specifics in the architecture code for MIPS, S390 and PPC, and avoid taking the vcpu->mutex and calling vcpu_load for these ioctls.
--- arch/mips/kvm/mips.c | 49 +++++++++++++++++++++++---------------- arch/powerpc/kvm/powerpc.c | 13 ++++++----- arch/s390/kvm/kvm-s390.c | 19 ++++++++------- arch/x86/kvm/x86.c | 22 +++++++++++++----- virt/kvm/arm/arm.c | 58 ++++++++++++++++++++++++++++++++-------------- virt/kvm/kvm_main.c | 2 -- 6 files changed, 103 insertions(+), 60 deletions(-)
arch/mips/kvm/mips.c +29 -20
@@ -913,56 +913,65 @@ long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl,void __user *argp = (void __user *)arg;long r; +if (ioctl ==KVM_INTERRUPT ) { +struct kvm_mips_interrupt irq; + +if (copy_from_user (&irq, argp,sizeof (irq))) +return -EFAULT ; +kvm_debug ("[%d] %s: irq: %d\n" , vcpu->vcpu_id, __func__, + irq.irq); + +return kvm_vcpu_ioctl_interrupt (vcpu, &irq); + } + +vcpu_load (vcpu); +switch (ioctl) {case KVM_SET_ONE_REG :case KVM_GET_ONE_REG : {struct kvm_one_reg reg; + r = -EFAULT ;if (copy_from_user (®, argp,sizeof (reg))) -return -EFAULT ; +break ;if (ioctl ==KVM_SET_ONE_REG ) -return kvm_mips_set_reg (vcpu, ®); + r =kvm_mips_set_reg (vcpu, ®);else -return kvm_mips_get_reg (vcpu, ®); + r =kvm_mips_get_reg (vcpu, ®); +break ; }case KVM_GET_REG_LIST : {struct kvm_reg_list __user *user_list = argp;struct kvm_reg_list reg_list;unsigned n; + r = -EFAULT ;if (copy_from_user (®_list, user_list,sizeof (reg_list))) -return -EFAULT ; +break ; n = reg_list.n; reg_list.n =kvm_mips_num_regs (vcpu);if (copy_to_user (user_list, ®_list,sizeof (reg_list))) -return -EFAULT ; +break ; + r = -E2BIG ;if (n < reg_list.n) -return -E2BIG ; -return kvm_mips_copy_reg_indices (vcpu, user_list->reg); - } -case KVM_INTERRUPT : - { -struct kvm_mips_interrupt irq; - -if (copy_from_user (&irq, argp,sizeof (irq))) -return -EFAULT ; -kvm_debug ("[%d] %s: irq: %d\n" , vcpu->vcpu_id, __func__, - irq.irq); - - r =kvm_vcpu_ioctl_interrupt (vcpu, &irq);break ; - } + r =kvm_mips_copy_reg_indices (vcpu, user_list->reg); +break ; + }case KVM_ENABLE_CAP : {struct kvm_enable_cap cap; + r = -EFAULT ;if (copy_from_user (&cap, argp,sizeof (cap))) -return -EFAULT ; +break ; r =kvm_vcpu_ioctl_enable_cap (vcpu, &cap);break ; }default : r = -ENOIOCTLCMD ; } + +vcpu_put (vcpu);return r; }
arch/powerpc/kvm/powerpc.c +7 -6
@@ -1617,16 +1617,16 @@ long kvm_arch_vcpu_ioctl(struct file *filp,void __user *argp = (void __user *)arg;long r; -switch (ioctl) { -case KVM_INTERRUPT : { +if (ioctl ==KVM_INTERRUPT ) {struct kvm_interrupt irq; - r = -EFAULT ;if (copy_from_user (&irq, argp,sizeof (irq))) - goto out; - r =kvm_vcpu_ioctl_interrupt (vcpu, &irq); - goto out; +return -EFAULT ; +return kvm_vcpu_ioctl_interrupt (vcpu, &irq); } +vcpu_load (vcpu); + +switch (ioctl) {case KVM_ENABLE_CAP : {struct kvm_enable_cap cap;
@@ -1666,6 +1666,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, } out: +vcpu_put (vcpu);return r; }
arch/s390/kvm/kvm-s390.c +11 -8
@@ -3743,24 +3743,25 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_S390_IRQ : {struct kvm_s390_irq s390irq; - r = -EFAULT ;if (copy_from_user (&s390irq, argp,sizeof (s390irq))) -break ; - r =kvm_s390_inject_vcpu (vcpu, &s390irq); -break ; +return -EFAULT ; +return kvm_s390_inject_vcpu (vcpu, &s390irq); }case KVM_S390_INTERRUPT : {struct kvm_s390_interrupt s390int;struct kvm_s390_irq s390irq; - r = -EFAULT ;if (copy_from_user (&s390int, argp,sizeof (s390int))) -break ; +return -EFAULT ;if (s390int_to_s390irq (&s390int, &s390irq))return -EINVAL ; - r =kvm_s390_inject_vcpu (vcpu, &s390irq); -break ; +return kvm_s390_inject_vcpu (vcpu, &s390irq); } + } + +vcpu_load (vcpu); + +switch (ioctl) {case KVM_S390_STORE_STATUS : idx =srcu_read_lock (&vcpu->kvm->srcu); r =kvm_s390_vcpu_store_status (vcpu, arg);
@@ -3883,6 +3884,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,default : r = -ENOTTY ; } + +vcpu_put (vcpu);return r; }
arch/x86/kvm/x86.c +16 -6
@@ -3458,6 +3458,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,void *buffer; } u; +vcpu_load (vcpu); + u.buffer =NULL ;switch (ioctl) {case KVM_GET_LAPIC : {
@@ -3483,8 +3485,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,if (!lapic_in_kernel (vcpu)) goto out; u.lapic =memdup_user (argp,sizeof (*u.lapic)); -if (IS_ERR (u.lapic)) -return PTR_ERR (u.lapic); +if (IS_ERR (u.lapic)) { + r =PTR_ERR (u.lapic); + goto out_nofree; + } r =kvm_vcpu_ioctl_set_lapic (vcpu, u.lapic);break ;
@@ -3658,8 +3662,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp, }case KVM_SET_XSAVE : { u.xsave =memdup_user (argp,sizeof (*u.xsave)); -if (IS_ERR (u.xsave)) -return PTR_ERR (u.xsave); +if (IS_ERR (u.xsave)) { + r =PTR_ERR (u.xsave); + goto out_nofree; + } r =kvm_vcpu_ioctl_x86_set_xsave (vcpu, u.xsave);break ;
@@ -3681,8 +3687,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp, }case KVM_SET_XCRS : { u.xcrs =memdup_user (argp,sizeof (*u.xcrs)); -if (IS_ERR (u.xcrs)) -return PTR_ERR (u.xcrs); +if (IS_ERR (u.xcrs)) { + r =PTR_ERR (u.xcrs); + goto out_nofree; + } r =kvm_vcpu_ioctl_x86_set_xcrs (vcpu, u.xcrs);break ;
@@ -3726,6 +3734,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp, } out:kfree (u.buffer); +out_nofree: +vcpu_put (vcpu);return r; }
virt/kvm/arm/arm.c +40 -18
106 lines not on this page · raw message
virt/kvm/kvm_main.c +0 -2
@@ -2693,9 +2693,7 @@ static long kvm_vcpu_ioctl(struct file *filp,break ; }default : -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl (filp, ioctl, arg); -vcpu_put (vcpu); } out:mutex_unlock (&vcpu->mutex);
Signature · 1 line
2.14.2
Re: [PATCH v3 14/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl
Quoted 30 lines · On Mon, 4 Dec 2017 21:35:36 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move the calls to
vcpu_load()andvcpu_put()in to the architecture specific implementations ofkvm_arch_vcpu_ioctl()which dispatches further architecture-specific ioctls on to other functions.Some architectures support asynchronous vcpu ioctls which cannot call
vcpu_load()or take thevcpu->mutex, because that would prevent concurrent execution with a running VCPU, which is the intended purpose of these ioctls, for example because they inject interrupts.We repeat the separate checks for these specifics in the architecture code for MIPS, S390 and PPC, and avoid taking the
vcpu->mutexand callingvcpu_loadfor these ioctls.Signed-off-by Christoffer Dall <[email protected]>--- arch/mips/kvm/mips.c | 49 +++++++++++++++++++++++---------------- arch/powerpc/kvm/powerpc.c | 13 ++++++----- arch/s390/kvm/kvm-s390.c | 19 ++++++++------- arch/x86/kvm/x86.c | 22 +++++++++++++----- virt/kvm/arm/arm.c | 58 ++++++++++++++++++++++++++++++++-------------- virt/kvm/kvm_main.c | 2 -- 6 files changed, 103 insertions(+), 60 deletions(-)arch/mips/kvm/mips.c +0
-0
arch/mips/kvm/mips.c long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, · line 916
Quoted 4 lines
arch/mips/kvm/mips.c +1
-0@@ -913,56 +913,65 @@ long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl,void __user *argp = (void __user *)arg;long r; +if (ioctl =KVM_INTERRUPT ) {
I would add a comment here that this ioctl is async to vcpu execution, so it is understandable why you skip the vcpu_load().
[As an aside, it is nice that this is now more obvious when looking at the architectures' handlers.]
Quoted 13 lines
arch/mips/kvm/mips.c +12
-0+struct kvm_mips_interrupt irq; + +if (copy_from_user (&irq, argp,sizeof (irq))) +return -EFAULT ; +kvm_debug ("[%d] %s: irq: %d\n" , vcpu->vcpu_id, __func__, + irq.irq); + +return kvm_vcpu_ioctl_interrupt (vcpu, &irq); + } + +vcpu_load (vcpu); +switch (ioctl) {
(...)
arch/powerpc/kvm/powerpc.c long kvm_arch_vcpu_ioctl(struct file *filp, · line 1620
Quoted 11 lines
arch/powerpc/kvm/powerpc.c +1
-2@@ -1617,16 +1617,16 @@ long kvm_arch_vcpu_ioctl(struct file *filp,void __user *argp = (void __user *)arg;long r; -switch (ioctl) { -case KVM_INTERRUPT : { +if (ioctl =KVM_INTERRUPT ) {
Same here.
Quoted 45 lines
arch/powerpc/kvm/powerpc.c +6
-4struct kvm_interrupt irq; - r = -EFAULT ;if (copy_from_user (&irq, argp,sizeof (irq))) - goto out; - r =kvm_vcpu_ioctl_interrupt (vcpu, &irq); - goto out; +return -EFAULT ; +return kvm_vcpu_ioctl_interrupt (vcpu, &irq); } +vcpu_load (vcpu); + +switch (ioctl) {case KVM_ENABLE_CAP : {struct kvm_enable_cap cap;@@ -1666,6 +1666,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, } out: +vcpu_put (vcpu);return r; }arch/s390/kvm/kvm-s390.c +2
-5@@ -3743,24 +3743,25 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_S390_IRQ : {struct kvm_s390_irq s390irq; - r = -EFAULT ;if (copy_from_user (&s390irq, argp,sizeof (s390irq))) -break ; - r =kvm_s390_inject_vcpu (vcpu, &s390irq); -break ; +return -EFAULT ; +return kvm_s390_inject_vcpu (vcpu, &s390irq); }case KVM_S390_INTERRUPT : {struct kvm_s390_interrupt s390int;struct kvm_s390_irq s390irq; - r = -EFAULT ;
arch/s390/kvm/kvm-s390.c long kvm_arch_vcpu_ioctl(struct file *filp, · line 3760
Quoted 10 lines
arch/s390/kvm/kvm-s390.c +3
-3if (copy_from_user (&s390int, argp,sizeof (s390int))) -break ; +return -EFAULT ;if (s390int_to_s390irq (&s390int, &s390irq))return -EINVAL ; - r =kvm_s390_inject_vcpu (vcpu, &s390irq); -break ; +return kvm_s390_inject_vcpu (vcpu, &s390irq); } + }
I find the special casing with the immediate return a bit ugly. Maybe introduce a helper async_vcpu_ioctl() or so that sets -ENOIOCTLCMD in its default case and return here if ret != -ENOIOCTLCMD? Christian, what do you think?
Quoted 16 lines
arch/s390/kvm/kvm-s390.c +6
-0+ +vcpu_load (vcpu); + +switch (ioctl) {case KVM_S390_STORE_STATUS : idx =srcu_read_lock (&vcpu->kvm->srcu); r =kvm_s390_vcpu_store_status (vcpu, arg);@@ -3883,6 +3884,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,default : r = -ENOTTY ; } + +vcpu_put (vcpu);return r; }
(...)
Quoted 5 lines
virt/kvm/kvm_main.c +0
-0
virt/kvm/kvm_main.c static long kvm_vcpu_ioctl(struct file *filp, · line 2699
Quoted 9 lines
virt/kvm/kvm_main.c +0
-2@@ -2693,9 +2693,7 @@ static long kvm_vcpu_ioctl(struct file *filp,break ; }default : -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl (filp, ioctl, arg); -vcpu_put (vcpu); } out:mutex_unlock (&vcpu->mutex);
It would be nice if we could get rid of the special casing at the beginning of this function, but as it would involve not taking the mutex for special cases (and not releasing it for those special cases), I don't see an elegant way to do that.
Re: [PATCH v3 14/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl
Quoted 36 lines · Cornelia Huck
Quoted 33 lines · On Mon, 4 Dec 2017 21:35:36 +0100 Christoffer Dall <[email protected]> wrote:
From: Christoffer Dall <[email protected]>
Move the calls to
vcpu_load()andvcpu_put()in to the architecture specific implementations ofkvm_arch_vcpu_ioctl()which dispatches further architecture-specific ioctls on to other functions.Some architectures support asynchronous vcpu ioctls which cannot call
vcpu_load()or take thevcpu->mutex, because that would prevent concurrent execution with a running VCPU, which is the intended purpose of these ioctls, for example because they inject interrupts.We repeat the separate checks for these specifics in the architecture code for MIPS, S390 and PPC, and avoid taking the
vcpu->mutexand callingvcpu_loadfor these ioctls.Signed-off-by Christoffer Dall <[email protected]>--- arch/mips/kvm/mips.c | 49 +++++++++++++++++++++++---------------- arch/powerpc/kvm/powerpc.c | 13 ++++++----- arch/s390/kvm/kvm-s390.c | 19 ++++++++------- arch/x86/kvm/x86.c | 22 +++++++++++++----- virt/kvm/arm/arm.c | 58 ++++++++++++++++++++++++++++++++-------------- virt/kvm/kvm_main.c | 2 -- 6 files changed, 103 insertions(+), 60 deletions(-)arch/mips/kvm/mips.c +0
-0@@ -913,56 +913,65 @@ long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl,void __user *argp = (void __user *)arg;long r;
Quoted 4 lines
arch/mips/kvm/mips.c long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, · line 916
Quoted 1 line
arch/mips/kvm/mips.c +1
-0+if (ioctl =KVM_INTERRUPT ) {I would add a comment here that this ioctl is async to vcpu execution, so it is understandable why you skip the
vcpu_load().
Yes, that would be appropriate.
Quoted 4 lines
[As an aside, it is nice that this is now more obvious when looking at the architectures' handlers.]
Agreed.
Quoted 121 lines
Quoted 13 lines
arch/mips/kvm/mips.c +12
-0+struct kvm_mips_interrupt irq; + +if (copy_from_user (&irq, argp,sizeof (irq))) +return -EFAULT ; +kvm_debug ("[%d] %s: irq: %d\n" , vcpu->vcpu_id, __func__, + irq.irq); + +return kvm_vcpu_ioctl_interrupt (vcpu, &irq); + } + +vcpu_load (vcpu); +switch (ioctl) {(...)
arch/powerpc/kvm/powerpc.c long kvm_arch_vcpu_ioctl(struct file *filp, · line 1620
Quoted 11 lines
arch/powerpc/kvm/powerpc.c +1
-2@@ -1617,16 +1617,16 @@ long kvm_arch_vcpu_ioctl(struct file *filp,void __user *argp = (void __user *)arg;long r; -switch (ioctl) { -case KVM_INTERRUPT : { +if (ioctl =KVM_INTERRUPT ) {Same here.
Quoted 45 lines
arch/powerpc/kvm/powerpc.c +6
-4struct kvm_interrupt irq; - r = -EFAULT ;if (copy_from_user (&irq, argp,sizeof (irq))) - goto out; - r =kvm_vcpu_ioctl_interrupt (vcpu, &irq); - goto out; +return -EFAULT ; +return kvm_vcpu_ioctl_interrupt (vcpu, &irq); } +vcpu_load (vcpu); + +switch (ioctl) {case KVM_ENABLE_CAP : {struct kvm_enable_cap cap;@@ -1666,6 +1666,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, } out: +vcpu_put (vcpu);return r; }arch/s390/kvm/kvm-s390.c +2
-5@@ -3743,24 +3743,25 @@ long kvm_arch_vcpu_ioctl(struct file *filp,case KVM_S390_IRQ : {struct kvm_s390_irq s390irq; - r = -EFAULT ;if (copy_from_user (&s390irq, argp,sizeof (s390irq))) -break ; - r =kvm_s390_inject_vcpu (vcpu, &s390irq); -break ; +return -EFAULT ; +return kvm_s390_inject_vcpu (vcpu, &s390irq); }case KVM_S390_INTERRUPT : {struct kvm_s390_interrupt s390int;struct kvm_s390_irq s390irq; - r = -EFAULT ;arch/s390/kvm/kvm-s390.c long kvm_arch_vcpu_ioctl(struct file *filp, · line 3760
Quoted 10 lines
arch/s390/kvm/kvm-s390.c +3
-3if (copy_from_user (&s390int, argp,sizeof (s390int))) -break ; +return -EFAULT ;if (s390int_to_s390irq (&s390int, &s390irq))return -EINVAL ; - r =kvm_s390_inject_vcpu (vcpu, &s390irq); -break ; +return kvm_s390_inject_vcpu (vcpu, &s390irq); } + }I find the special casing with the immediate return a bit ugly. Maybe introduce a helper
async_vcpu_ioctl()or so that sets-ENOIOCTLCMDin its default case and return here if ret !=-ENOIOCTLCMD? Christian, what do you think?Quoted 16 lines
arch/s390/kvm/kvm-s390.c +6
-0+ +vcpu_load (vcpu); + +switch (ioctl) {case KVM_S390_STORE_STATUS : idx =srcu_read_lock (&vcpu->kvm->srcu); r =kvm_s390_vcpu_store_status (vcpu, arg);@@ -3883,6 +3884,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,default : r = -ENOTTY ; } + +vcpu_put (vcpu);return r; }(...)
Quoted 11 lines
virt/kvm/kvm_main.c +0
-2@@ -2693,9 +2693,7 @@ static long kvm_vcpu_ioctl(struct file *filp,break ; }default : -vcpu_load (vcpu); r =kvm_arch_vcpu_ioctl (filp, ioctl, arg); -vcpu_put (vcpu);
Quoted 8 lines
virt/kvm/kvm_main.c static long kvm_vcpu_ioctl(struct file *filp, · line 2699
Quoted 3 lines
virt/kvm/kvm_main.c +0
-0} out:mutex_unlock (&vcpu->mutex);It would be nice if we could get rid of the special casing at the beginning of this function, but as it would involve not taking the mutex for special cases (and not releasing it for those special cases), I don't see an elegant way to do that.
I would also have liked that, and that's essentially what I had in the first version, but Paolo thought the result was too high an increase in complexity in the architecture-specfic functions throughout. I don't have any better suggestions either.
Thanks,
-Christoffer
Paolo Bonzini
maintainerRe: [PATCH v3 14/16] KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl
Quoted 4 lines · Christoffer Dall
I find the special casing with the immediate return a bit ugly. Maybe introduce a helper
async_vcpu_ioctl()or so that sets-ENOIOCTLCMDin its default case and return here if ret !=-ENOIOCTLCMD? Christian, what do you think?
I'll post my attempt at it shortly.
Thanks,
Paolo
PATCH v3 15/16 KVM: arm/arm64: Avoid vcpu_load for other vcpu ioctls than KVM_RUN
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Calling vcpu_load() registers preempt notifiers for this vcpu and calls kvm_arch_vcpu_load(). The latter will soon be doing a lot of heavy lifting on arm/arm64 and will try to do things such as enabling the virtual timer and setting us up to handle interrupts from the timer hardware.
Loading state onto hardware registers and enabling hardware to signal interrupts can be problematic when we're not actually about to run the VCPU, because it makes it difficult to establish the right context when handling interrupts from the timer, and it makes the register access code difficult to reason about.
Luckily, now when we call vcpu_load in each ioctl implementation, we can simply remove the call from the non-KVM_RUN vcpu ioctls, and our kvm_arch_vcpu_load() is only used for loading vcpu content to the physical CPU when we're actually going to run the vcpu.
--- arch/arm64/kvm/guest.c | 3 --- virt/kvm/arm/arm.c | 9 --------- 2 files changed, 12 deletions(-)
arch/arm64/kvm/guest.c +0 -3
@@ -363,8 +363,6 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, {int ret =0 ; -vcpu_load (vcpu); -trace_kvm_set_guest_debug (vcpu, dbg->control);if (dbg->control & ~KVM_GUESTDBG_VALID_MASK ) {
@@ -386,7 +384,6 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, } out: -vcpu_put (vcpu);return ret; }
virt/kvm/arm/arm.c +0 -9
@@ -381,14 +381,11 @@ static void vcpu_power_off(struct kvm_vcpu *vcpu)int kvm_arch_vcpu_ioctl_get_mpstate (struct kvm_vcpu *vcpu,struct kvm_mp_state *mp_state) { -vcpu_load (vcpu); -if (vcpu->arch.power_off) mp_state->mp_state =KVM_MP_STATE_STOPPED ;else mp_state->mp_state =KVM_MP_STATE_RUNNABLE ; -vcpu_put (vcpu);return 0 ; }
@@ -397,8 +394,6 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, {int ret =0 ; -vcpu_load (vcpu); -switch (mp_state->mp_state) {case KVM_MP_STATE_RUNNABLE : vcpu->arch.power_off = false;
@@ -410,7 +405,6 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, ret = -EINVAL ; } -vcpu_put (vcpu);return ret; }
@@ -1003,8 +997,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp,struct kvm_device_attr attr;long r; -vcpu_load (vcpu); -switch (ioctl) {case KVM_ARM_VCPU_INIT : {struct kvm_vcpu_init init;
@@ -1081,7 +1073,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp, r = -EINVAL ; } -vcpu_put (vcpu);return r; }
Signature · 1 line
2.14.2
PATCH v3 16/16 KVM: arm/arm64: Move vcpu_load call after kvm_vcpu_first_run_init
In reply to Christoffer DallFrom: Christoffer Dall <[email protected]>
Moving the call to vcpu_load() in kvm_arch_vcpu_ioctl_run() to after we've called kvm_vcpu_first_run_init() simplifies some of the vgic and there is also no need to do vcpu_load() for things such as handling the immediate_exit flag.
--- virt/kvm/arm/arch_timer.c | 4 ---- virt/kvm/arm/arm.c | 12 +++++------- virt/kvm/arm/vgic/vgic-init.c | 11 ----------- 3 files changed, 5 insertions(+), 22 deletions(-)
virt/kvm/arm/arch_timer.c +0 -4
@@ -839,11 +839,7 @@ int kvm_timer_enable(struct kvm_vcpu *vcpu)return ret; no_vgic: -preempt_disable (); timer->enabled =1 ; -kvm_timer_vcpu_load_vgic (vcpu); -preempt_enable (); -return 0 ; }
virt/kvm/arm/arm.c +5 -7
@@ -622,8 +622,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)if (unlikely (!kvm_vcpu_initialized (vcpu)))return -ENOEXEC ; -vcpu_load (vcpu); - ret =kvm_vcpu_first_run_init (vcpu);if (ret) goto out;
@@ -631,13 +629,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)if (run->exit_reason ==KVM_EXIT_MMIO ) { ret =kvm_handle_mmio_return (vcpu, vcpu->run);if (ret) - goto out; +return ret; } -if (run->immediate_exit) { - ret = -EINTR ; - goto out; - } +if (run->immediate_exit) +return -EINTR ; + +vcpu_load (vcpu);if (vcpu->sigset_active)sigprocmask (SIG_SETMASK , &vcpu->sigset, &sigsaved);
virt/kvm/arm/vgic/vgic-init.c +0 -11
@@ -300,17 +300,6 @@ int vgic_init(struct kvm *kvm) dist->initialized = true; -/* -* If we're initializing GICv2 on-demand when first running the VCPU -* then we need to load the VGIC state onto the CPU. We can detect -* this easily by checking if we are in between vcpu_load and vcpu_put -* when we just initialized the VGIC. -*/ -preempt_disable (); - vcpu =kvm_arm_get_running_vcpu (); -if (vcpu) -kvm_vgic_load (vcpu); -preempt_enable (); out:return ret; }
Signature · 1 line
2.14.2