diff mbox series

[v3,13/13] drm/msm/dpu: use drmm-managed allocation for dpu_encoder_virt

Message ID 20230730011920.354575-14-dmitry.baryshkov@linaro.org
State Superseded
Headers show
Series drm/msm/dpu: use managed memory allocations | expand

Commit Message

Dmitry Baryshkov July 30, 2023, 1:19 a.m. UTC
It is incorrect to use devm-managed memory allocations for DRM data
structures exposed to userspace. They should use drmm_ allocations.
Change struct dpu_encoder allocation to use drmm_encoder_alloc(). This
removes the need to perform any actions on encoder destruction.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 50 +++++----------------
 1 file changed, 10 insertions(+), 40 deletions(-)

Comments

Jessica Zhang Dec. 1, 2023, 7:29 p.m. UTC | #1
On 7/29/2023 6:19 PM, Dmitry Baryshkov wrote:
> It is incorrect to use devm-managed memory allocations for DRM data
> structures exposed to userspace. They should use drmm_ allocations.
> Change struct dpu_encoder allocation to use drmm_encoder_alloc(). This
> removes the need to perform any actions on encoder destruction.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>

> ---
>   drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 50 +++++----------------
>   1 file changed, 10 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 2b94ff3d08a1..6d9ec3ac065c 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -443,23 +443,6 @@ int dpu_encoder_get_linecount(struct drm_encoder *drm_enc)
>   	return linecount;
>   }
>   
> -static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
> -{
> -	struct dpu_encoder_virt *dpu_enc = NULL;
> -	int i = 0;
> -
> -	if (!drm_enc) {
> -		DPU_ERROR("invalid encoder\n");
> -		return;
> -	}
> -
> -	dpu_enc = to_dpu_encoder_virt(drm_enc);
> -	DPU_DEBUG_ENC(dpu_enc, "\n");
> -
> -	drm_encoder_cleanup(drm_enc);
> -	mutex_destroy(&dpu_enc->enc_lock);
> -}
> -
>   void dpu_encoder_helper_split_config(
>   		struct dpu_encoder_phys *phys_enc,
>   		enum dpu_intf interface)
> @@ -2381,7 +2364,6 @@ static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {
>   };
>   
>   static const struct drm_encoder_funcs dpu_encoder_funcs = {
> -		.destroy = dpu_encoder_destroy,
>   		.late_register = dpu_encoder_late_register,
>   		.early_unregister = dpu_encoder_early_unregister,
>   };
> @@ -2392,20 +2374,13 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
>   {
>   	struct msm_drm_private *priv = dev->dev_private;
>   	struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
> -	struct drm_encoder *drm_enc = NULL;
> -	struct dpu_encoder_virt *dpu_enc = NULL;
> -	int ret = 0;
> +	struct dpu_encoder_virt *dpu_enc;
> +	int ret;
>   
> -	dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
> -	if (!dpu_enc)
> -		return ERR_PTR(-ENOMEM);
> -
> -	ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
> -			       drm_enc_mode, NULL);
> -	if (ret) {
> -		devm_kfree(dev->dev, dpu_enc);
> -		return ERR_PTR(ret);
> -	}
> +	dpu_enc = drmm_encoder_alloc(dev, struct dpu_encoder_virt, base,
> +				     &dpu_encoder_funcs, drm_enc_mode, NULL);
> +	if (IS_ERR(dpu_enc))
> +		return ERR_CAST(dpu_enc);
>   
>   	drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
>   
> @@ -2415,8 +2390,10 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
>   	mutex_init(&dpu_enc->rc_lock);
>   
>   	ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
> -	if (ret)
> -		goto fail;
> +	if (ret) {
> +		DPU_ERROR("failed to setup encoder\n");
> +		return ERR_PTR(-ENOMEM);
> +	}
>   
>   	atomic_set(&dpu_enc->frame_done_timeout_ms, 0);
>   	timer_setup(&dpu_enc->frame_done_timer,
> @@ -2442,13 +2419,6 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
>   	DPU_DEBUG_ENC(dpu_enc, "created\n");
>   
>   	return &dpu_enc->base;
> -
> -fail:
> -	DPU_ERROR("failed to create encoder\n");
> -	if (drm_enc)
> -		dpu_encoder_destroy(drm_enc);
> -
> -	return ERR_PTR(ret);
>   }
>   
>   int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,
> -- 
> 2.39.2
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 2b94ff3d08a1..6d9ec3ac065c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -443,23 +443,6 @@  int dpu_encoder_get_linecount(struct drm_encoder *drm_enc)
 	return linecount;
 }
 
-static void dpu_encoder_destroy(struct drm_encoder *drm_enc)
-{
-	struct dpu_encoder_virt *dpu_enc = NULL;
-	int i = 0;
-
-	if (!drm_enc) {
-		DPU_ERROR("invalid encoder\n");
-		return;
-	}
-
-	dpu_enc = to_dpu_encoder_virt(drm_enc);
-	DPU_DEBUG_ENC(dpu_enc, "\n");
-
-	drm_encoder_cleanup(drm_enc);
-	mutex_destroy(&dpu_enc->enc_lock);
-}
-
 void dpu_encoder_helper_split_config(
 		struct dpu_encoder_phys *phys_enc,
 		enum dpu_intf interface)
@@ -2381,7 +2364,6 @@  static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {
 };
 
 static const struct drm_encoder_funcs dpu_encoder_funcs = {
-		.destroy = dpu_encoder_destroy,
 		.late_register = dpu_encoder_late_register,
 		.early_unregister = dpu_encoder_early_unregister,
 };
@@ -2392,20 +2374,13 @@  struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
 {
 	struct msm_drm_private *priv = dev->dev_private;
 	struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
-	struct drm_encoder *drm_enc = NULL;
-	struct dpu_encoder_virt *dpu_enc = NULL;
-	int ret = 0;
+	struct dpu_encoder_virt *dpu_enc;
+	int ret;
 
-	dpu_enc = devm_kzalloc(dev->dev, sizeof(*dpu_enc), GFP_KERNEL);
-	if (!dpu_enc)
-		return ERR_PTR(-ENOMEM);
-
-	ret = drm_encoder_init(dev, &dpu_enc->base, &dpu_encoder_funcs,
-			       drm_enc_mode, NULL);
-	if (ret) {
-		devm_kfree(dev->dev, dpu_enc);
-		return ERR_PTR(ret);
-	}
+	dpu_enc = drmm_encoder_alloc(dev, struct dpu_encoder_virt, base,
+				     &dpu_encoder_funcs, drm_enc_mode, NULL);
+	if (IS_ERR(dpu_enc))
+		return ERR_CAST(dpu_enc);
 
 	drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs);
 
@@ -2415,8 +2390,10 @@  struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
 	mutex_init(&dpu_enc->rc_lock);
 
 	ret = dpu_encoder_setup_display(dpu_enc, dpu_kms, disp_info);
-	if (ret)
-		goto fail;
+	if (ret) {
+		DPU_ERROR("failed to setup encoder\n");
+		return ERR_PTR(-ENOMEM);
+	}
 
 	atomic_set(&dpu_enc->frame_done_timeout_ms, 0);
 	timer_setup(&dpu_enc->frame_done_timer,
@@ -2442,13 +2419,6 @@  struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
 	DPU_DEBUG_ENC(dpu_enc, "created\n");
 
 	return &dpu_enc->base;
-
-fail:
-	DPU_ERROR("failed to create encoder\n");
-	if (drm_enc)
-		dpu_encoder_destroy(drm_enc);
-
-	return ERR_PTR(ret);
 }
 
 int dpu_encoder_wait_for_event(struct drm_encoder *drm_enc,