From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18816C1B0E3 for ; Mon, 14 Dec 2020 10:38:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DDCF322AAA for ; Mon, 14 Dec 2020 10:38:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2395526AbgLNKig (ORCPT ); Mon, 14 Dec 2020 05:38:36 -0500 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:58807 "EHLO relay9-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727764AbgLNKi0 (ORCPT ); Mon, 14 Dec 2020 05:38:26 -0500 X-Originating-IP: 95.245.192.76 Received: from uno.localdomain (host-95-245-192-76.retail.telecomitalia.it [95.245.192.76]) (Authenticated sender: jacopo@jmondi.org) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 3D851FF80C; Mon, 14 Dec 2020 10:37:40 +0000 (UTC) Date: Mon, 14 Dec 2020 11:37:50 +0100 From: Jacopo Mondi To: Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Kieran Bingham , Kuninori Morimoto Subject: Re: [PATCH 5/9] drm: rcar-du: Use DRM-managed allocation for encoders Message-ID: <20201214103750.bpwmxe4icjtika4v@uno.localdomain> References: <20201204220139.15272-1-laurent.pinchart+renesas@ideasonboard.com> <20201204220139.15272-6-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20201204220139.15272-6-laurent.pinchart+renesas@ideasonboard.com> Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org Hi Laurent, On Sat, Dec 05, 2020 at 12:01:35AM +0200, Laurent Pinchart wrote: > devm_kzalloc() is the wrong API to allocate encoders, as the lifetime of > the encoders is tied to the DRM device, not the device to driver > binding. drmm_kzalloc() isn't a good option either, as it would result > in the encoder being freed before being unregistered during the managed > cleanup of the DRM objects. Use a plain kzalloc(), and register a drmm > action to cleanup the encoder. > > Signed-off-by: Laurent Pinchart > --- > drivers/gpu/drm/rcar-du/rcar_du_encoder.c | 47 ++++++++++++++--------- > 1 file changed, 29 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c > index 0edce24f2053..7c491ff72cd2 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c > @@ -8,12 +8,13 @@ > */ > > #include > +#include > > #include > #include > +#include > #include > #include > -#include > > #include "rcar_du_drv.h" > #include "rcar_du_encoder.h" > @@ -44,6 +45,17 @@ static unsigned int rcar_du_encoder_count_ports(struct device_node *node) > return num_ports; > } > > +static const struct drm_encoder_funcs rcar_du_encoder_funcs = { > +}; > + > +static void rcar_du_encoder_release(struct drm_device *dev, void *res) > +{ > + struct rcar_du_encoder *renc = res; > + > + drm_encoder_cleanup(&renc->base); > + kfree(renc); > +} > + > int rcar_du_encoder_init(struct rcar_du_device *rcdu, > enum rcar_du_output output, > struct device_node *enc_node) > @@ -53,7 +65,7 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, > struct drm_bridge *bridge; > int ret; > > - renc = devm_kzalloc(rcdu->dev, sizeof(*renc), GFP_KERNEL); > + renc = kzalloc(sizeof(*renc), GFP_KERNEL); > if (renc == NULL) > return -ENOMEM; > > @@ -76,20 +88,20 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, > > if (IS_ERR(panel)) { > ret = PTR_ERR(panel); > - goto done; > + goto error; > } > > bridge = devm_drm_panel_bridge_add_typed(rcdu->dev, panel, > DRM_MODE_CONNECTOR_DPI); > if (IS_ERR(bridge)) { > ret = PTR_ERR(bridge); > - goto done; > + goto error; > } > } else { > bridge = of_drm_find_bridge(enc_node); > if (!bridge) { > ret = -EPROBE_DEFER; > - goto done; > + goto error; > } > > if (output == RCAR_DU_OUTPUT_LVDS0 || > @@ -104,28 +116,27 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, > if (rcdu->info->gen >= 3 && output == RCAR_DU_OUTPUT_LVDS1) { > if (rcar_lvds_dual_link(bridge)) { > ret = -ENOLINK; > - goto done; > + goto error; > } > } > > - ret = drm_simple_encoder_init(rcdu->ddev, encoder, > - DRM_MODE_ENCODER_NONE); > + ret = drm_encoder_init(rcdu->ddev, encoder, &rcar_du_encoder_funcs, > + DRM_MODE_ENCODER_NONE, NULL); I might have missed the reason for this. Why add an action later instead of making rcar_du_encoder_release part of rcar_du_encoder_funcs ? Thanks j > if (ret < 0) > - goto done; > + goto error; > + > + ret = drmm_add_action_or_reset(rcdu->ddev, rcar_du_encoder_release, > + renc); > + if (ret) > + return ret; > > /* > * Attach the bridge to the encoder. The bridge will create the > * connector. > */ > - ret = drm_bridge_attach(encoder, bridge, NULL, 0); > - if (ret) { > - drm_encoder_cleanup(encoder); > - return ret; > - } > - > -done: > - if (ret < 0) > - devm_kfree(rcdu->dev, renc); > + return drm_bridge_attach(encoder, bridge, NULL, 0); > > +error: > + kfree(renc); > return ret; > } > -- > Regards, > > Laurent Pinchart > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB5ABC4361B for ; Mon, 14 Dec 2020 10:37:48 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 25C0A22AAA for ; Mon, 14 Dec 2020 10:37:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 25C0A22AAA Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=jmondi.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 03BD66E194; Mon, 14 Dec 2020 10:37:47 +0000 (UTC) Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [217.70.183.199]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0F4CB6E194 for ; Mon, 14 Dec 2020 10:37:44 +0000 (UTC) X-Originating-IP: 95.245.192.76 Received: from uno.localdomain (host-95-245-192-76.retail.telecomitalia.it [95.245.192.76]) (Authenticated sender: jacopo@jmondi.org) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 3D851FF80C; Mon, 14 Dec 2020 10:37:40 +0000 (UTC) Date: Mon, 14 Dec 2020 11:37:50 +0100 From: Jacopo Mondi To: Laurent Pinchart Subject: Re: [PATCH 5/9] drm: rcar-du: Use DRM-managed allocation for encoders Message-ID: <20201214103750.bpwmxe4icjtika4v@uno.localdomain> References: <20201204220139.15272-1-laurent.pinchart+renesas@ideasonboard.com> <20201204220139.15272-6-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20201204220139.15272-6-laurent.pinchart+renesas@ideasonboard.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-renesas-soc@vger.kernel.org, Kuninori Morimoto , Kieran Bingham , dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi Laurent, On Sat, Dec 05, 2020 at 12:01:35AM +0200, Laurent Pinchart wrote: > devm_kzalloc() is the wrong API to allocate encoders, as the lifetime of > the encoders is tied to the DRM device, not the device to driver > binding. drmm_kzalloc() isn't a good option either, as it would result > in the encoder being freed before being unregistered during the managed > cleanup of the DRM objects. Use a plain kzalloc(), and register a drmm > action to cleanup the encoder. > > Signed-off-by: Laurent Pinchart > --- > drivers/gpu/drm/rcar-du/rcar_du_encoder.c | 47 ++++++++++++++--------- > 1 file changed, 29 insertions(+), 18 deletions(-) > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c > index 0edce24f2053..7c491ff72cd2 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c > @@ -8,12 +8,13 @@ > */ > > #include > +#include > > #include > #include > +#include > #include > #include > -#include > > #include "rcar_du_drv.h" > #include "rcar_du_encoder.h" > @@ -44,6 +45,17 @@ static unsigned int rcar_du_encoder_count_ports(struct device_node *node) > return num_ports; > } > > +static const struct drm_encoder_funcs rcar_du_encoder_funcs = { > +}; > + > +static void rcar_du_encoder_release(struct drm_device *dev, void *res) > +{ > + struct rcar_du_encoder *renc = res; > + > + drm_encoder_cleanup(&renc->base); > + kfree(renc); > +} > + > int rcar_du_encoder_init(struct rcar_du_device *rcdu, > enum rcar_du_output output, > struct device_node *enc_node) > @@ -53,7 +65,7 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, > struct drm_bridge *bridge; > int ret; > > - renc = devm_kzalloc(rcdu->dev, sizeof(*renc), GFP_KERNEL); > + renc = kzalloc(sizeof(*renc), GFP_KERNEL); > if (renc == NULL) > return -ENOMEM; > > @@ -76,20 +88,20 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, > > if (IS_ERR(panel)) { > ret = PTR_ERR(panel); > - goto done; > + goto error; > } > > bridge = devm_drm_panel_bridge_add_typed(rcdu->dev, panel, > DRM_MODE_CONNECTOR_DPI); > if (IS_ERR(bridge)) { > ret = PTR_ERR(bridge); > - goto done; > + goto error; > } > } else { > bridge = of_drm_find_bridge(enc_node); > if (!bridge) { > ret = -EPROBE_DEFER; > - goto done; > + goto error; > } > > if (output == RCAR_DU_OUTPUT_LVDS0 || > @@ -104,28 +116,27 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, > if (rcdu->info->gen >= 3 && output == RCAR_DU_OUTPUT_LVDS1) { > if (rcar_lvds_dual_link(bridge)) { > ret = -ENOLINK; > - goto done; > + goto error; > } > } > > - ret = drm_simple_encoder_init(rcdu->ddev, encoder, > - DRM_MODE_ENCODER_NONE); > + ret = drm_encoder_init(rcdu->ddev, encoder, &rcar_du_encoder_funcs, > + DRM_MODE_ENCODER_NONE, NULL); I might have missed the reason for this. Why add an action later instead of making rcar_du_encoder_release part of rcar_du_encoder_funcs ? Thanks j > if (ret < 0) > - goto done; > + goto error; > + > + ret = drmm_add_action_or_reset(rcdu->ddev, rcar_du_encoder_release, > + renc); > + if (ret) > + return ret; > > /* > * Attach the bridge to the encoder. The bridge will create the > * connector. > */ > - ret = drm_bridge_attach(encoder, bridge, NULL, 0); > - if (ret) { > - drm_encoder_cleanup(encoder); > - return ret; > - } > - > -done: > - if (ret < 0) > - devm_kfree(rcdu->dev, renc); > + return drm_bridge_attach(encoder, bridge, NULL, 0); > > +error: > + kfree(renc); > return ret; > } > -- > Regards, > > Laurent Pinchart > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel