Commit 8c5e74c9 authored by Ricardo Koller's avatar Ricardo Koller Committed by Marc Zyngier

KVM: arm64: vgic: Undo work in failed ITS restores

Failed ITS restores should clean up all state restored until the
failure. There is some cleanup already present when failing to restore
some tables, but it's not complete. Add the missing cleanup.

Note that this changes the behavior in case of a failed restore of the
device tables.

	restore ioctl:
	1. restore collection tables
	2. restore device tables

With this commit, failures in 2. clean up everything created so far,
including state created by 1.
Reviewed-by: default avatarEric Auger <eric.auger@redhat.com>
Signed-off-by: default avatarRicardo Koller <ricarkol@google.com>
Reviewed-by: default avatarOliver Upton <oupton@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220510001633.552496-5-ricarkol@google.com
parent a1ccfd6f
...@@ -2219,8 +2219,10 @@ static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id, ...@@ -2219,8 +2219,10 @@ static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id,
vcpu = kvm_get_vcpu(kvm, collection->target_addr); vcpu = kvm_get_vcpu(kvm, collection->target_addr);
irq = vgic_add_lpi(kvm, lpi_id, vcpu); irq = vgic_add_lpi(kvm, lpi_id, vcpu);
if (IS_ERR(irq)) if (IS_ERR(irq)) {
its_free_ite(kvm, ite);
return PTR_ERR(irq); return PTR_ERR(irq);
}
ite->irq = irq; ite->irq = irq;
return offset; return offset;
...@@ -2485,6 +2487,9 @@ static int vgic_its_restore_device_tables(struct vgic_its *its) ...@@ -2485,6 +2487,9 @@ static int vgic_its_restore_device_tables(struct vgic_its *its)
if (ret > 0) if (ret > 0)
ret = 0; ret = 0;
if (ret < 0)
vgic_its_free_device_list(its->dev->kvm, its);
return ret; return ret;
} }
...@@ -2615,6 +2620,9 @@ static int vgic_its_restore_collection_table(struct vgic_its *its) ...@@ -2615,6 +2620,9 @@ static int vgic_its_restore_collection_table(struct vgic_its *its)
if (ret > 0) if (ret > 0)
return 0; return 0;
if (ret < 0)
vgic_its_free_collection_list(its->dev->kvm, its);
return ret; return ret;
} }
...@@ -2646,7 +2654,10 @@ static int vgic_its_restore_tables_v0(struct vgic_its *its) ...@@ -2646,7 +2654,10 @@ static int vgic_its_restore_tables_v0(struct vgic_its *its)
if (ret) if (ret)
return ret; return ret;
return vgic_its_restore_device_tables(its); ret = vgic_its_restore_device_tables(its);
if (ret)
vgic_its_free_collection_list(its->dev->kvm, its);
return ret;
} }
static int vgic_its_commit_v0(struct vgic_its *its) static int vgic_its_commit_v0(struct vgic_its *its)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment