summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorPhilip Yang <Philip.Yang@amd.com>2026-05-26 21:39:12 -0400
committerAlex Deucher <alexander.deucher@amd.com>2026-09-02 15:24:28 -0400
commit2b92b270439f7fb7cfa06a445982bd14dcc8672a (patch)
tree36b6aaf8687b1eaacf923646850df1a273aa11c1 /drivers/gpu
parentd8b4cad5e051184fdc8f5366c75d1533deeca12e (diff)
downloadlinux-next-2b92b270439f7fb7cfa06a445982bd14dcc8672a.tar.gz
linux-next-2b92b270439f7fb7cfa06a445982bd14dcc8672a.zip
drm/amdgpu: Fix UALink vPod double-activation
ualink_ppod_setup_commit_store() updated accel_state via check_ppod_state() but never called deactivate_local_vpod() when the accelerator was already in READY state. A subsequent vpod config commit would then call activate_local_vpod() again, resulting in activate_accelerator() calling amdgpu_ualink_manager_start() a second time on top of already-initialized NPA VM, causing a NULL pointer dereference in rb_insert_color when drm_sched_entity nodes already in the SDMA scheduler FIFO rb-tree were double-initialized. Fix: call deactivate_accelerator() in ualink_ppod_setup_commit_store() guarded by accel_state >= READY, under mgpu_info.mutex to serialize with activate_local_vpod() in ualink_vpod_config_commit_store(). Signed-off-by: Philip Yang <Philip.Yang@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
index 6329fc8e217e..c0478087b95d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
@@ -398,6 +398,8 @@ static const struct kobj_type ualink_info_ktype = {
};
#ifdef UALINK_ENABLE_DEPRECATED_CONFIG_SYSFS
+static void deactivate_accelerator(struct amdgpu_device *adev);
+
UALINK_VALUE_SHOW(ppod_setup, accel_id, ppod.accel_id, "%u");
UALINK_VALUE_SHOW(ppod_setup, bandwidth, ppod.bandwidth, "%u");
UALINK_VALUE_SHOW(ppod_setup, latency, ppod.latency, "%u");
@@ -452,7 +454,18 @@ static ssize_t ualink_ppod_setup_commit_store(struct kobject *kobj,
if (r)
return r;
+ /*
+ * Hold mgpu_info.mutex to serialize with activate_local_vpod() in
+ * vpod_config_commit_store which also holds this lock. Without it,
+ * deactivate_accelerator() can race with activate_accelerator(),
+ * causing concurrent vm_fini / vm_init on the same NPA VM.
+ */
+ mutex_lock(&mgpu_info.mutex);
+ if (info->accel_state >= AMDGPU_UALINK_ACCEL_STATE_READY)
+ deactivate_accelerator(adev);
+
info->accel_state = check_ppod_state(adev, setup);
+ mutex_unlock(&mgpu_info.mutex);
/* TODO: If accel_state was ACTIVE, reset all connections */