Message ID | 1558953255-9432-3-git-send-email-wanpengli@tencent.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: Yield to IPI target if necessary | expand |
On 27/05/19 12:34, Wanpeng Li wrote: > + rcu_read_lock(); > + map = rcu_dereference(kvm->arch.apic_map); > + target = map->phys_map[dest_id]->vcpu; > + rcu_read_unlock(); > + > + kvm_vcpu_yield_to(target); This needs to check that map->phys_map[dest_id] is not NULL. Paolo
On Mon, 27 May 2019 at 19:54, Paolo Bonzini <pbonzini@redhat.com> wrote: > > On 27/05/19 12:34, Wanpeng Li wrote: > > + rcu_read_lock(); > > + map = rcu_dereference(kvm->arch.apic_map); > > + target = map->phys_map[dest_id]->vcpu; > > + rcu_read_unlock(); > > + > > + kvm_vcpu_yield_to(target); > > This needs to check that map->phys_map[dest_id] is not NULL. Fixed in v2, thanks for the quick review. :) Regards, Wanpeng Li
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index e7e57de..45403a6 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -7172,6 +7172,19 @@ void kvm_vcpu_deactivate_apicv(struct kvm_vcpu *vcpu) kvm_x86_ops->refresh_apicv_exec_ctrl(vcpu); } +void kvm_sched_yield(struct kvm *kvm, u64 dest_id) +{ + struct kvm_vcpu *target; + struct kvm_apic_map *map; + + rcu_read_lock(); + map = rcu_dereference(kvm->arch.apic_map); + target = map->phys_map[dest_id]->vcpu; + rcu_read_unlock(); + + kvm_vcpu_yield_to(target); +} + int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) { unsigned long nr, a0, a1, a2, a3, ret; @@ -7218,6 +7231,10 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) case KVM_HC_SEND_IPI: ret = kvm_pv_send_ipi(vcpu->kvm, a0, a1, a2, a3, op_64_bit); break; + case KVM_HC_SCHED_YIELD: + kvm_sched_yield(vcpu->kvm, a0); + ret = 0; + break; default: ret = -KVM_ENOSYS; break;