summaryrefslogtreecommitdiffstats
path: root/virt/kvm
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2016-07-18 16:27:14 +0100
committerMarc Zyngier <marc.zyngier@arm.com>2016-07-18 18:15:20 +0100
commit3a88bded203591d4683aacdbb65cd0f549bc58cb (patch)
treecabc218ca0e2a8512745219ecd3df32f17d95f94 /virt/kvm
parenta3e7aa271eec50a674d33bb6eafa51c5f1e5f51f (diff)
downloadlinux-stable-3a88bded203591d4683aacdbb65cd0f549bc58cb.tar.gz
linux-stable-3a88bded203591d4683aacdbb65cd0f549bc58cb.tar.bz2
linux-stable-3a88bded203591d4683aacdbb65cd0f549bc58cb.zip
KVM: arm64: vgic-its: Simplify MAPI error handling
If we care to move all the checks that do not involve any memory allocation, we can simplify the MAPI error handling. Let's do that, it cannot hurt. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/arm/vgic/vgic-its.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c
index ec7e07bc2559..07411cf967b9 100644
--- a/virt/kvm/arm/vgic/vgic-its.c
+++ b/virt/kvm/arm/vgic/vgic-its.c
@@ -697,36 +697,34 @@ static int vgic_its_cmd_handle_mapi(struct kvm *kvm, struct vgic_its *its,
struct its_device *device;
struct its_collection *collection, *new_coll = NULL;
int lpi_nr;
- int ret;
device = find_its_device(its, device_id);
if (!device)
return E_ITS_MAPTI_UNMAPPED_DEVICE;
- collection = find_collection(its, coll_id);
- if (!collection) {
- ret = vgic_its_alloc_collection(its, &collection, coll_id);
- if (ret)
- return ret;
- new_coll = collection;
- }
-
if (its_cmd_get_command(its_cmd) == GITS_CMD_MAPTI)
lpi_nr = its_cmd_get_physical_id(its_cmd);
else
lpi_nr = event_id;
if (lpi_nr < GIC_LPI_OFFSET ||
- lpi_nr >= max_lpis_propbaser(kvm->arch.vgic.propbaser)) {
- ret = E_ITS_MAPTI_PHYSICALID_OOR;
- goto err;
+ lpi_nr >= max_lpis_propbaser(kvm->arch.vgic.propbaser))
+ return E_ITS_MAPTI_PHYSICALID_OOR;
+
+ collection = find_collection(its, coll_id);
+ if (!collection) {
+ int ret = vgic_its_alloc_collection(its, &collection, coll_id);
+ if (ret)
+ return ret;
+ new_coll = collection;
}
itte = find_itte(its, device_id, event_id);
if (!itte) {
itte = kzalloc(sizeof(struct its_itte), GFP_KERNEL);
if (!itte) {
- ret = -ENOMEM;
- goto err;
+ if (new_coll)
+ vgic_its_free_collection(its, coll_id);
+ return -ENOMEM;
}
itte->event_id = event_id;
@@ -746,10 +744,6 @@ static int vgic_its_cmd_handle_mapi(struct kvm *kvm, struct vgic_its *its,
update_lpi_config(kvm, itte->irq, NULL);
return 0;
-err:
- if (new_coll)
- vgic_its_free_collection(its, coll_id);
- return ret;
}
/* Requires the its_lock to be held. */