diff options
| -rw-r--r-- | virt/kvm/arm/vgic/vgic.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c index e74baec76361..4b6d72939c42 100644 --- a/virt/kvm/arm/vgic/vgic.c +++ b/virt/kvm/arm/vgic/vgic.c | |||
| @@ -594,6 +594,7 @@ retry: | |||
| 594 | 594 | ||
| 595 | list_for_each_entry_safe(irq, tmp, &vgic_cpu->ap_list_head, ap_list) { | 595 | list_for_each_entry_safe(irq, tmp, &vgic_cpu->ap_list_head, ap_list) { |
| 596 | struct kvm_vcpu *target_vcpu, *vcpuA, *vcpuB; | 596 | struct kvm_vcpu *target_vcpu, *vcpuA, *vcpuB; |
| 597 | bool target_vcpu_needs_kick = false; | ||
| 597 | 598 | ||
| 598 | spin_lock(&irq->irq_lock); | 599 | spin_lock(&irq->irq_lock); |
| 599 | 600 | ||
| @@ -664,11 +665,18 @@ retry: | |||
| 664 | list_del(&irq->ap_list); | 665 | list_del(&irq->ap_list); |
| 665 | irq->vcpu = target_vcpu; | 666 | irq->vcpu = target_vcpu; |
| 666 | list_add_tail(&irq->ap_list, &new_cpu->ap_list_head); | 667 | list_add_tail(&irq->ap_list, &new_cpu->ap_list_head); |
| 668 | target_vcpu_needs_kick = true; | ||
| 667 | } | 669 | } |
| 668 | 670 | ||
| 669 | spin_unlock(&irq->irq_lock); | 671 | spin_unlock(&irq->irq_lock); |
| 670 | spin_unlock(&vcpuB->arch.vgic_cpu.ap_list_lock); | 672 | spin_unlock(&vcpuB->arch.vgic_cpu.ap_list_lock); |
| 671 | spin_unlock_irqrestore(&vcpuA->arch.vgic_cpu.ap_list_lock, flags); | 673 | spin_unlock_irqrestore(&vcpuA->arch.vgic_cpu.ap_list_lock, flags); |
| 674 | |||
| 675 | if (target_vcpu_needs_kick) { | ||
| 676 | kvm_make_request(KVM_REQ_IRQ_PENDING, target_vcpu); | ||
| 677 | kvm_vcpu_kick(target_vcpu); | ||
| 678 | } | ||
| 679 | |||
| 672 | goto retry; | 680 | goto retry; |
| 673 | } | 681 | } |
| 674 | 682 | ||
