diff options
-rw-r--r-- | virt/kvm/arm/vgic/vgic-its.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c index 15e79285380d..78d11aed1e17 100644 --- a/virt/kvm/arm/vgic/vgic-its.c +++ b/virt/kvm/arm/vgic/vgic-its.c | |||
@@ -1169,11 +1169,12 @@ static int vgic_its_cmd_handle_invall(struct kvm *kvm, struct vgic_its *its, | |||
1169 | static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its, | 1169 | static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its, |
1170 | u64 *its_cmd) | 1170 | u64 *its_cmd) |
1171 | { | 1171 | { |
1172 | struct vgic_dist *dist = &kvm->arch.vgic; | ||
1173 | u32 target1_addr = its_cmd_get_target_addr(its_cmd); | 1172 | u32 target1_addr = its_cmd_get_target_addr(its_cmd); |
1174 | u32 target2_addr = its_cmd_mask_field(its_cmd, 3, 16, 32); | 1173 | u32 target2_addr = its_cmd_mask_field(its_cmd, 3, 16, 32); |
1175 | struct kvm_vcpu *vcpu1, *vcpu2; | 1174 | struct kvm_vcpu *vcpu1, *vcpu2; |
1176 | struct vgic_irq *irq; | 1175 | struct vgic_irq *irq; |
1176 | u32 *intids; | ||
1177 | int irq_count, i; | ||
1177 | 1178 | ||
1178 | if (target1_addr >= atomic_read(&kvm->online_vcpus) || | 1179 | if (target1_addr >= atomic_read(&kvm->online_vcpus) || |
1179 | target2_addr >= atomic_read(&kvm->online_vcpus)) | 1180 | target2_addr >= atomic_read(&kvm->online_vcpus)) |
@@ -1185,19 +1186,19 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its, | |||
1185 | vcpu1 = kvm_get_vcpu(kvm, target1_addr); | 1186 | vcpu1 = kvm_get_vcpu(kvm, target1_addr); |
1186 | vcpu2 = kvm_get_vcpu(kvm, target2_addr); | 1187 | vcpu2 = kvm_get_vcpu(kvm, target2_addr); |
1187 | 1188 | ||
1188 | spin_lock(&dist->lpi_list_lock); | 1189 | irq_count = vgic_copy_lpi_list(vcpu1, &intids); |
1190 | if (irq_count < 0) | ||
1191 | return irq_count; | ||
1189 | 1192 | ||
1190 | list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) { | 1193 | for (i = 0; i < irq_count; i++) { |
1191 | spin_lock(&irq->irq_lock); | 1194 | irq = vgic_get_irq(kvm, NULL, intids[i]); |
1192 | 1195 | ||
1193 | if (irq->target_vcpu == vcpu1) | 1196 | update_affinity(irq, vcpu2); |
1194 | irq->target_vcpu = vcpu2; | ||
1195 | 1197 | ||
1196 | spin_unlock(&irq->irq_lock); | 1198 | vgic_put_irq(kvm, irq); |
1197 | } | 1199 | } |
1198 | 1200 | ||
1199 | spin_unlock(&dist->lpi_list_lock); | 1201 | kfree(intids); |
1200 | |||
1201 | return 0; | 1202 | return 0; |
1202 | } | 1203 | } |
1203 | 1204 | ||