Message ID | 20230112091243.490799-1-maxime@cerno.tech (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/vc4: bo: Fix drmm_mutex_init memory hog | expand |
On Thu, Jan 12, 2023 at 10:12:43AM +0100, Maxime Ripard wrote: > Commit 374146cad469 ("drm/vc4: Switch to drmm_mutex_init") converted, > among other functions, vc4_create_object() to use drmm_mutex_init(). > > However, that function is used to allocate a BO, and therefore the > mutex needs to be freed much sooner than when the DRM device is removed > from the system. > > For each buffer allocation we thus end up allocating a small structure > as part of the DRM-managed mechanism that is never freed, eventually > leading us to no longer having any free memory anymore. > > Let's switch back to mutex_init/mutex_destroy to deal with it properly. > > Fixes: 374146cad469 ("drm/vc4: Switch to drmm_mutex_init") > Signed-off-by: Maxime Ripard <maxime@cerno.tech> oops :-) Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> > --- > drivers/gpu/drm/vc4/vc4_bo.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c > index c2b7573bd92b..49320e4d595d 100644 > --- a/drivers/gpu/drm/vc4/vc4_bo.c > +++ b/drivers/gpu/drm/vc4/vc4_bo.c > @@ -179,6 +179,7 @@ static void vc4_bo_destroy(struct vc4_bo *bo) > bo->validated_shader = NULL; > } > > + mutex_destroy(&bo->madv_lock); > drm_gem_dma_free(&bo->base); > } > > @@ -406,9 +407,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size) > bo->madv = VC4_MADV_WILLNEED; > refcount_set(&bo->usecnt, 0); > > - ret = drmm_mutex_init(dev, &bo->madv_lock); > - if (ret) > - return ERR_PTR(ret); > + mutex_init(&bo->madv_lock); > > mutex_lock(&vc4->bo_lock); > bo->label = VC4_BO_TYPE_KERNEL; > -- > 2.39.0 >
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c index c2b7573bd92b..49320e4d595d 100644 --- a/drivers/gpu/drm/vc4/vc4_bo.c +++ b/drivers/gpu/drm/vc4/vc4_bo.c @@ -179,6 +179,7 @@ static void vc4_bo_destroy(struct vc4_bo *bo) bo->validated_shader = NULL; } + mutex_destroy(&bo->madv_lock); drm_gem_dma_free(&bo->base); } @@ -406,9 +407,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size) bo->madv = VC4_MADV_WILLNEED; refcount_set(&bo->usecnt, 0); - ret = drmm_mutex_init(dev, &bo->madv_lock); - if (ret) - return ERR_PTR(ret); + mutex_init(&bo->madv_lock); mutex_lock(&vc4->bo_lock); bo->label = VC4_BO_TYPE_KERNEL;
Commit 374146cad469 ("drm/vc4: Switch to drmm_mutex_init") converted, among other functions, vc4_create_object() to use drmm_mutex_init(). However, that function is used to allocate a BO, and therefore the mutex needs to be freed much sooner than when the DRM device is removed from the system. For each buffer allocation we thus end up allocating a small structure as part of the DRM-managed mechanism that is never freed, eventually leading us to no longer having any free memory anymore. Let's switch back to mutex_init/mutex_destroy to deal with it properly. Fixes: 374146cad469 ("drm/vc4: Switch to drmm_mutex_init") Signed-off-by: Maxime Ripard <maxime@cerno.tech> --- drivers/gpu/drm/vc4/vc4_bo.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)