===================================================================
@@ -1322,6 +1322,7 @@ struct kvm_x86_ops {
int (*update_pi_irte)(struct kvm *kvm, unsigned int host_irq,
uint32_t guest_irq, bool set);
+ void (*start_assignment)(struct kvm *kvm, int device_count);
void (*apicv_post_state_restore)(struct kvm_vcpu *vcpu);
bool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *vcpu);
===================================================================
@@ -4601,6 +4601,7 @@ static struct kvm_x86_ops svm_x86_ops __
.deliver_posted_interrupt = svm_deliver_avic_intr,
.dy_apicv_has_pending_interrupt = svm_dy_apicv_has_pending_interrupt,
.update_pi_irte = svm_update_pi_irte,
+ .start_assignment = NULL,
.setup_mce = svm_setup_mce,
.smi_allowed = svm_smi_allowed,
===================================================================
@@ -7732,6 +7732,7 @@ static struct kvm_x86_ops vmx_x86_ops __
.nested_ops = &vmx_nested_ops,
.update_pi_irte = pi_update_irte,
+ .start_assignment = NULL,
#ifdef CONFIG_X86_64
.set_hv_timer = vmx_set_hv_timer,
===================================================================
@@ -11295,7 +11295,11 @@ bool kvm_arch_can_dequeue_async_page_pre
void kvm_arch_start_assignment(struct kvm *kvm)
{
- atomic_inc(&kvm->arch.assigned_device_count);
+ int ret;
+
+ ret = atomic_inc_return(&kvm->arch.assigned_device_count);
+ if (kvm_x86_ops.start_assignment)
+ kvm_x86_ops.start_assignment(kvm, ret);
}
EXPORT_SYMBOL_GPL(kvm_arch_start_assignment);
Add a start_assignment hook to kvm_x86_ops, which is called when kvm_arch_start_assignment is done. The hook is required to update the wakeup vector of a sleeping vCPU when a device is assigned to the guest. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>