From 2bd1f36314128ed24dfd50b26ba2529b2ab855b1 Mon Sep 17 00:00:00 2001 From: Cong Zhang Date: Fri, 27 Jun 2025 16:45:42 +0800 Subject: [PATCH] ANDROID: gunyah: Add new VM status to handle reset failure Add new VM status GUNYAH_RM_VM_STATUS_RESET_FAILED to indicate that VM reset is failed. Bug: 430214928 Change-Id: If9664bf64a6a14c577fb2b29e1ad0775c0e9d140 Signed-off-by: Cong Zhang --- drivers/virt/gunyah/rsc_mgr.h | 3 +++ drivers/virt/gunyah/vm_mgr.c | 13 +++++++++++-- gki/aarch64/abi.stg | 4 ++++ gki/aarch64/abi.stg.allowed_breaks | 3 +++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/virt/gunyah/rsc_mgr.h b/drivers/virt/gunyah/rsc_mgr.h index 4eedf462d63e..ff832450dc78 100644 --- a/drivers/virt/gunyah/rsc_mgr.h +++ b/drivers/virt/gunyah/rsc_mgr.h @@ -8,6 +8,7 @@ #include #include #include +#include #define GUNYAH_VMID_INVAL U16_MAX #define GUNYAH_MEM_HANDLE_INVAL U32_MAX @@ -48,8 +49,10 @@ enum gunyah_rm_vm_status { GUNYAH_RM_VM_STATUS_EXITED = 9, GUNYAH_RM_VM_STATUS_RESETTING = 10, GUNYAH_RM_VM_STATUS_RESET = 11, + GUNYAH_RM_VM_STATUS_RESET_FAILED = 12, /* clang-format on */ }; +ANDROID_KABI_ENUMERATOR_IGNORE(gunyah_rm_vm_status, GUNYAH_RM_VM_STATUS_RESET_FAILED); struct gunyah_rm_vm_status_payload { __le16 vmid; diff --git a/drivers/virt/gunyah/vm_mgr.c b/drivers/virt/gunyah/vm_mgr.c index 4ced15d337d2..2843385560ba 100644 --- a/drivers/virt/gunyah/vm_mgr.c +++ b/drivers/virt/gunyah/vm_mgr.c @@ -583,11 +583,19 @@ static int gunyah_vm_rm_notification_status(struct gunyah_vm *ghvm, void *data) return NOTIFY_OK; /* All other state transitions are synchronous to a corresponding RM call */ - if (payload->vm_status == GUNYAH_RM_VM_STATUS_RESET) { + switch (payload->vm_status) { + case GUNYAH_RM_VM_STATUS_RESET_FAILED: + dev_warn(ghvm->parent, "VM: %u RESET failed with status %u\n", + ghvm->vmid, payload->vm_status); + fallthrough; + case GUNYAH_RM_VM_STATUS_RESET: down_write(&ghvm->status_lock); ghvm->vm_status = payload->vm_status; up_write(&ghvm->status_lock); wake_up(&ghvm->vm_status_wait); + break; + default: + break; } return NOTIFY_DONE; @@ -1147,7 +1155,8 @@ static void _gunyah_vm_put(struct kref *kref) /* clang-format off */ if (!ret) wait_event(ghvm->vm_status_wait, - ghvm->vm_status == GUNYAH_RM_VM_STATUS_RESET); + (ghvm->vm_status == GUNYAH_RM_VM_STATUS_RESET) || + (ghvm->vm_status == GUNYAH_RM_VM_STATUS_RESET_FAILED)); else dev_err(ghvm->parent, "Failed to reset the vm: %d\n", ret); diff --git a/gki/aarch64/abi.stg b/gki/aarch64/abi.stg index 7e06ae08d82b..ced06367961c 100644 --- a/gki/aarch64/abi.stg +++ b/gki/aarch64/abi.stg @@ -357070,6 +357070,10 @@ enumeration { name: "GUNYAH_RM_VM_STATUS_RESET" value: 11 } + enumerator { + name: "GUNYAH_RM_VM_STATUS_RESET_FAILED" + value: 12 + } } } enumeration { diff --git a/gki/aarch64/abi.stg.allowed_breaks b/gki/aarch64/abi.stg.allowed_breaks index 4b67358f0348..327080bf76c7 100644 --- a/gki/aarch64/abi.stg.allowed_breaks +++ b/gki/aarch64/abi.stg.allowed_breaks @@ -10,3 +10,6 @@ type 'struct sched_dl_entity' changed type 'struct f2fs_sb_info' changed member 'union { unsigned int reserved_pin_section; unsigned char __kabi_ignored0; }' was added +type 'enum gunyah_rm_vm_status' changed + enumerator 'GUNYAH_RM_VM_STATUS_RESET_FAILED' (12) was added +