On 1/2/2025 11:06 AM, Jiang Liu wrote: > Add flags to track sysfs initialization status, so we can correctly > clean them up on error recover paths. > > Signed-off-by: Jiang Liu <gerry@xxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 ++ > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 34 +++++++++++++++++----- > 2 files changed, 30 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 22c7e9669162..e4b13e729770 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1157,6 +1157,9 @@ struct amdgpu_device { > bool in_runpm; > bool has_pr3; > > + bool sysfs_en; > + bool fru_sysfs_en; > + bool reg_state_sysfs_en; These are not required. If the files are not found, they are ignored and not considered as errors. sysfs_remove_files() returns void. Thanks, Lijo > bool ucode_sysfs_en; > > struct amdgpu_fru_info *fru_info; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index d1bb9e85b6d7..3244966b0c39 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -4533,8 +4533,13 @@ int amdgpu_device_init(struct amdgpu_device *adev, > adev->ucode_sysfs_en = true; > > r = sysfs_create_files(&adev->dev->kobj, amdgpu_dev_attributes); > - if (r) > + if (r) { > dev_err(adev->dev, "Could not create amdgpu device attr\n"); > + adev->sysfs_en = false; > + } else { > + adev->sysfs_en = true; > + } > + > #ifdef HAVE_PCI_DRIVER_DEV_GROUPS > r = devm_device_add_group(adev->dev, &amdgpu_board_attrs_group); > if (r) > @@ -4542,8 +4547,21 @@ int amdgpu_device_init(struct amdgpu_device *adev, > "Could not create amdgpu board attributes\n"); > #endif > > - amdgpu_fru_sysfs_init(adev); > - amdgpu_reg_state_sysfs_init(adev); > + r = amdgpu_fru_sysfs_init(adev); > + if (r) { > + dev_err(adev->dev, "Could not create amdgpu fru attr\n"); > + adev->fru_sysfs_en = false; > + } else { > + adev->fru_sysfs_en = true; > + } > + > + r = amdgpu_reg_state_sysfs_init(adev); > + if (r) { > + dev_err(adev->dev, "Could not create amdgpu reg state attr\n"); > + adev->reg_state_sysfs_en = false; > + } else { > + adev->reg_state_sysfs_en = true; > + } > > if (IS_ENABLED(CONFIG_PERF_EVENTS)) > r = amdgpu_pmu_init(adev); > @@ -4666,10 +4684,12 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev) > amdgpu_pm_sysfs_fini(adev); > if (adev->ucode_sysfs_en) > amdgpu_ucode_sysfs_fini(adev); > - sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes); > - amdgpu_fru_sysfs_fini(adev); > - > - amdgpu_reg_state_sysfs_fini(adev); > + if (adev->sysfs_en) > + sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes); > + if (adev->fru_sysfs_en) > + amdgpu_fru_sysfs_fini(adev); > + if (adev->reg_state_sysfs_en) > + amdgpu_reg_state_sysfs_fini(adev); > > /* disable ras feature must before hw fini */ > amdgpu_ras_pre_fini(adev);