diff mbox series

[v2,4/4] KVM: arm64: vgic: Undo work in failed ITS restores

Message ID 20220427184814.2204513-5-ricarkol@google.com (mailing list archive)
State New, archived
Headers show
Series KVM: arm64: vgic: Misc ITS fixes | expand

Commit Message

Ricardo Koller April 27, 2022, 6:48 p.m. UTC
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.

Signed-off-by: Ricardo Koller <ricarkol@google.com>
---
 arch/arm64/kvm/vgic/vgic-its.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

Comments

Eric Auger May 3, 2022, 7:40 p.m. UTC | #1
Hi Ricardo,

On 4/27/22 20:48, Ricardo Koller wrote:
> 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.
I assume this is acceptable
>
> 	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.
>
> Signed-off-by: Ricardo Koller <ricarkol@google.com>
> ---
>  arch/arm64/kvm/vgic/vgic-its.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c
> index 86c26aaa8275..c35534d7393a 100644
> --- a/arch/arm64/kvm/vgic/vgic-its.c
> +++ b/arch/arm64/kvm/vgic/vgic-its.c
> @@ -2222,8 +2222,10 @@ static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id,
>  		vcpu = kvm_get_vcpu(kvm, collection->target_addr);
>  
>  	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);
> +	}
>  	ite->irq = irq;
>  
>  	return offset;
> @@ -2491,6 +2493,9 @@ static int vgic_its_restore_device_tables(struct vgic_its *its)
>  	if (ret > 0)
>  		ret = 0;
>  
> +	if (ret < 0)
> +		vgic_its_free_device_list(its->dev->kvm, its);
> +
>  	return ret;
>  }
>  
> @@ -2617,6 +2622,9 @@ static int vgic_its_restore_collection_table(struct vgic_its *its)
>  		read += cte_esz;
>  	}
>  
> +	if (ret < 0)
> +		vgic_its_free_collection_list(its->dev->kvm, its);
> +
>  	return ret;
>  }
>  
> @@ -2648,7 +2656,10 @@ static int vgic_its_restore_tables_v0(struct vgic_its *its)
>  	if (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)

Looks good to me.
Reviewed-by: Eric Auger <eric.auger@redhat.com>


Eric
diff mbox series

Patch

diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c
index 86c26aaa8275..c35534d7393a 100644
--- a/arch/arm64/kvm/vgic/vgic-its.c
+++ b/arch/arm64/kvm/vgic/vgic-its.c
@@ -2222,8 +2222,10 @@  static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id,
 		vcpu = kvm_get_vcpu(kvm, collection->target_addr);
 
 	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);
+	}
 	ite->irq = irq;
 
 	return offset;
@@ -2491,6 +2493,9 @@  static int vgic_its_restore_device_tables(struct vgic_its *its)
 	if (ret > 0)
 		ret = 0;
 
+	if (ret < 0)
+		vgic_its_free_device_list(its->dev->kvm, its);
+
 	return ret;
 }
 
@@ -2617,6 +2622,9 @@  static int vgic_its_restore_collection_table(struct vgic_its *its)
 		read += cte_esz;
 	}
 
+	if (ret < 0)
+		vgic_its_free_collection_list(its->dev->kvm, its);
+
 	return ret;
 }
 
@@ -2648,7 +2656,10 @@  static int vgic_its_restore_tables_v0(struct vgic_its *its)
 	if (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)