KVM: arm64: vgic-v3: Fix error handling in vgic_v3_set_redist_base()
authorEric Auger <eric.auger@redhat.com>
Mon, 5 Apr 2021 16:39:35 +0000 (18:39 +0200)
committerMarc Zyngier <maz@kernel.org>
Tue, 6 Apr 2021 13:51:37 +0000 (14:51 +0100)
vgic_v3_insert_redist_region() may succeed while
vgic_register_all_redist_iodevs fails. For example this happens
while adding a redistributor region overlapping a dist region. The
failure only is detected on vgic_register_all_redist_iodevs when
vgic_v3_check_base() gets called in vgic_register_redist_iodev().

In such a case, remove the newly added redistributor region and free
it.

Signed-off-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210405163941.510258-4-eric.auger@redhat.com
arch/arm64/kvm/vgic/vgic-mmio-v3.c

index ef9baf0..fec0555 100644 (file)
@@ -861,8 +861,14 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count)
         * afterwards will register the iodevs when needed.
         */
        ret = vgic_register_all_redist_iodevs(kvm);
-       if (ret)
+       if (ret) {
+               struct vgic_redist_region *rdreg;
+
+               rdreg = vgic_v3_rdist_region_from_index(kvm, index);
+               list_del(&rdreg->list);
+               kfree(rdreg);
                return ret;
+       }
 
        return 0;
 }