diff options
| author | Philip Yang <Philip.Yang@amd.com> | 2026-05-26 21:39:12 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-09-02 15:24:28 -0400 |
| commit | 2b92b270439f7fb7cfa06a445982bd14dcc8672a (patch) | |
| tree | 36b6aaf8687b1eaacf923646850df1a273aa11c1 /drivers/gpu | |
| parent | d8b4cad5e051184fdc8f5366c75d1533deeca12e (diff) | |
| download | linux-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.c | 13 |
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 */ |
