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.8 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 774D5C433DB for ; Wed, 20 Jan 2021 16:00:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2D06A233A1 for ; Wed, 20 Jan 2021 16:00:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391089AbhATP7l convert rfc822-to-8bit (ORCPT ); Wed, 20 Jan 2021 10:59:41 -0500 Received: from aposti.net ([89.234.176.197]:58060 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389798AbhATP4c (ORCPT ); Wed, 20 Jan 2021 10:56:32 -0500 Date: Wed, 20 Jan 2021 15:55:33 +0000 From: Paul Cercueil Subject: Re: [PATCH v2 2/3] drm/ingenic: Register devm action to cleanup encoders To: Daniel Vetter Cc: David Airlie , Sam Ravnborg , Laurent Pinchart , od@zcrc.me, dri-devel , Linux Kernel Mailing List , stable Message-Id: In-Reply-To: References: <20210120123535.40226-1-paul@crapouillou.net> <20210120123535.40226-3-paul@crapouillou.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le mer. 20 janv. 2021 à 15:04, Daniel Vetter a écrit : > On Wed, Jan 20, 2021 at 2:21 PM Paul Cercueil > wrote: >> >> >> >> Le mer. 20 janv. 2021 à 14:01, Daniel Vetter a >> écrit : >> > On Wed, Jan 20, 2021 at 1:36 PM Paul Cercueil >> >> > wrote: >> >> >> >> Since the encoders have been devm-allocated, they will be freed >> way >> >> before drm_mode_config_cleanup() is called. To avoid >> use-after-free >> >> conditions, we then must ensure that drm_encoder_cleanup() is >> called >> >> before the encoders are freed. >> >> >> >> v2: Use the new __drmm_simple_encoder_alloc() function >> >> >> >> Fixes: c369cb27c267 ("drm/ingenic: Support multiple >> panels/bridges") >> >> Cc: # 5.8+ >> >> Signed-off-by: Paul Cercueil >> >> --- >> >> >> >> Notes: >> >> Use the V1 of this patch to fix v5.11 and older kernels. >> This >> >> V2 only >> >> applies on the current drm-misc-next branch. >> >> >> >> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 16 +++++++--------- >> >> 1 file changed, 7 insertions(+), 9 deletions(-) >> >> >> >> diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c >> >> b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c >> >> index 7bb31fbee29d..158433b4c084 100644 >> >> --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c >> >> +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c >> >> @@ -1014,20 +1014,18 @@ static int ingenic_drm_bind(struct >> device >> >> *dev, bool has_components) >> >> bridge = >> >> devm_drm_panel_bridge_add_typed(dev, panel, >> >> >> >> DRM_MODE_CONNECTOR_DPI); >> >> >> >> - encoder = devm_kzalloc(dev, sizeof(*encoder), >> >> GFP_KERNEL); >> >> - if (!encoder) >> >> - return -ENOMEM; >> >> + encoder = __drmm_simple_encoder_alloc(drm, >> >> sizeof(*encoder), 0, >> > >> > Please don't use the __ prefixed functions, those are the internal >> > ones. The official one comes with type checking and all that >> included. >> > Otherwise lgtm. >> > -Daniel >> >> The non-prefixed one assumes that I want to allocate a struct that >> contains the encoder, not just the drm_encoder itself. > > Hm, but using the internal one is also a bit too ugly. A > drm_plain_simple_enocder_alloc(drm, type) wrapper would be the right > thing here I think? Setting the offsets and struct sizes directly in > these in drivers really doesn't feel like a good idea. I think simple > encoder is the only case where we really have a need for a > non-embeddable struct. > -Daniel Alright, I will add a wrapper. Cheers, -Paul >> >> >> + >> >> DRM_MODE_ENCODER_DPI); >> >> + if (IS_ERR(encoder)) { >> >> + ret = PTR_ERR(encoder); >> >> + dev_err(dev, "Failed to init encoder: >> >> %d\n", ret); >> >> + return ret; >> >> + } >> >> >> >> encoder->possible_crtcs = 1; >> >> >> >> drm_encoder_helper_add(encoder, >> >> &ingenic_drm_encoder_helper_funcs); >> >> >> >> - ret = drm_simple_encoder_init(drm, encoder, >> >> DRM_MODE_ENCODER_DPI); >> >> - if (ret) { >> >> - dev_err(dev, "Failed to init encoder: >> >> %d\n", ret); >> >> - return ret; >> >> - } >> >> - >> >> ret = drm_bridge_attach(encoder, bridge, NULL, >> 0); >> >> if (ret) { >> >> dev_err(dev, "Unable to attach >> bridge\n"); >> >> -- >> >> 2.29.2 >> >> >> > >> > >> > -- >> > Daniel Vetter >> > Software Engineer, Intel Corporation >> > http://blog.ffwll.ch >> >> > > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch