On Fri, Oct 11, 2024 at 03:54:24PM -0700, Lucas De Marchi wrote: > There's no need to free the resources during unbind. Since perf events > may still access them due to open events, it's safer to free them when > dropping the last i915 reference. It will also allow to ask perf to > release its own resources when dropping the last reference in a follow > up change. > > Signed-off-by: Lucas De Marchi <lucas.demarchi@xxxxxxxxx> Reviewed-by: Matt Roper <matthew.d.roper@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_pmu.c | 21 ++++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c > index 67b6cbdeff1da..4d05d98f51b8e 100644 > --- a/drivers/gpu/drm/i915/i915_pmu.c > +++ b/drivers/gpu/drm/i915/i915_pmu.c > @@ -5,6 +5,7 @@ > */ > > #include <linux/pm_runtime.h> > +#include <drm/drm_managed.h> > > #include "gt/intel_engine.h" > #include "gt/intel_engine_pm.h" > @@ -1148,6 +1149,17 @@ static void free_event_attributes(struct i915_pmu *pmu) > pmu->pmu_attr = NULL; > } > > +static void free_pmu(struct drm_device *dev, void *res) > +{ > + struct i915_pmu *pmu = res; > + struct drm_i915_private *i915 = pmu_to_i915(pmu); > + > + free_event_attributes(pmu); > + kfree(pmu->base.attr_groups); > + if (IS_DGFX(i915)) > + kfree(pmu->name); > +} > + > static int i915_pmu_cpu_online(unsigned int cpu, struct hlist_node *node) > { > struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), cpuhp.node); > @@ -1296,6 +1308,9 @@ void i915_pmu_register(struct drm_i915_private *i915) > if (ret) > goto err_unreg; > > + if (drmm_add_action(&i915->drm, free_pmu, pmu)) > + goto err_unreg; > + > return; > > err_unreg: > @@ -1330,11 +1345,7 @@ void i915_pmu_unregister(struct drm_i915_private *i915) > hrtimer_cancel(&pmu->timer); > > i915_pmu_unregister_cpuhp_state(pmu); > - > perf_pmu_unregister(&pmu->base); > + > pmu->base.event_init = NULL; > - kfree(pmu->base.attr_groups); > - if (IS_DGFX(i915)) > - kfree(pmu->name); > - free_event_attributes(pmu); > } > -- > 2.47.0 > -- Matt Roper Graphics Software Engineer Linux GPU Platform Enablement Intel Corporation