From ef92f3ef0c9a6edc6b042afa54caa42032637cfe Mon Sep 17 00:00:00 2001 From: Prakruthi Deepak Heragu Date: Mon, 24 Feb 2025 14:28:44 -0800 Subject: [PATCH] ANDROID: gunyah: vm_mgr: Add uevents for VM state change Introduce CREATE_VM and DESTROY_VM notifications for the VMM. Bug: 399219478 Change-Id: I584ea0c6d088cc93b1b42f19dc36ed177bcdb05a Signed-off-by: Prakruthi Deepak Heragu --- drivers/virt/gunyah/vm_mgr.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/virt/gunyah/vm_mgr.c b/drivers/virt/gunyah/vm_mgr.c index c7c736277b1f..0395316a4bbd 100644 --- a/drivers/virt/gunyah/vm_mgr.c +++ b/drivers/virt/gunyah/vm_mgr.c @@ -29,6 +29,9 @@ #define BOOT_CONTEXT_REG_MASK GUNYAH_VM_BOOT_CONTEXT_REG(0xff, 0xff) +#define GUNYAH_EVENT_CREATE_VM 0 +#define GUNYAH_EVENT_DESTROY_VM 1 + static DEFINE_XARRAY(gunyah_vm_functions); static inline int gunyah_vm_fill_boot_context(struct gunyah_vm *ghvm) @@ -570,6 +573,27 @@ static int gunyah_vm_rm_notification(struct notifier_block *nb, } } +static void gunyah_uevent_notify_change(unsigned int type, struct gunyah_vm *ghvm) +{ + struct kobj_uevent_env *env; + + env = kzalloc(sizeof(*env), GFP_KERNEL_ACCOUNT); + if (!env) + return; + + if (type == GUNYAH_EVENT_CREATE_VM) + add_uevent_var(env, "EVENT=create"); + else if (type == GUNYAH_EVENT_DESTROY_VM) { + add_uevent_var(env, "EVENT=destroy"); + add_uevent_var(env, "vm_exit=%d", ghvm->exit_info.type); + } + + add_uevent_var(env, "vm_id=%hu", ghvm->vmid); + env->envp[env->envp_idx++] = NULL; + kobject_uevent_env(&ghvm->parent->kobj, KOBJ_CHANGE, env->envp); + kfree(env); +} + static void gunyah_vm_stop(struct gunyah_vm *ghvm) { int ret; @@ -738,6 +762,7 @@ static int gunyah_vm_start(struct gunyah_vm *ghvm) goto err; } ghvm->vmid = vmid ? vmid : ret; + gunyah_uevent_notify_change(GUNYAH_EVENT_CREATE_VM, ghvm); ret = gunyah_vm_pre_vm_configure(ghvm); if (ret) @@ -1064,6 +1089,7 @@ static void _gunyah_vm_put(struct kref *kref) up_write(&ghvm->bindings_lock); WARN_ON(!mtree_empty(&ghvm->bindings)); mtree_destroy(&ghvm->bindings); + gunyah_uevent_notify_change(GUNYAH_EVENT_DESTROY_VM, ghvm); if (ghvm->vm_status > GUNYAH_RM_VM_STATUS_NO_STATE) { gunyah_rm_notifier_unregister(ghvm->rm, &ghvm->nb);