All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sam Ravnborg <sam@ravnborg.org>
To: "Noralf Trønnes" <noralf@tronnes.org>
Cc: david@lechnology.com, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 07/11] drm/tinydrm/repaper: Use devm_drm_dev_*()
Date: Sun, 20 Jan 2019 23:25:57 +0100	[thread overview]
Message-ID: <20190120222557.GA26041@ravnborg.org> (raw)
In-Reply-To: <20190120222236.GB24538@ravnborg.org>

On Sun, Jan 20, 2019 at 11:22:36PM +0100, Sam Ravnborg wrote:
> Hi Noralf.
> 
> On Sun, Jan 20, 2019 at 12:43:14PM +0100, Noralf Trønnes wrote:
> > Use devm_drm_dev_init(), devm_drm_dev_register_with_fbdev() and drop
> > using tinydrm_device.
> > 
> > Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
> > ---
> >  drivers/gpu/drm/tinydrm/repaper.c | 63 ++++++++++++++++++++-----------
> >  1 file changed, 40 insertions(+), 23 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/tinydrm/repaper.c b/drivers/gpu/drm/tinydrm/repaper.c
> > index 3141241ca8f0..4c8205565668 100644
> > --- a/drivers/gpu/drm/tinydrm/repaper.c
> > +++ b/drivers/gpu/drm/tinydrm/repaper.c
> > @@ -34,7 +34,7 @@
> >  #include <drm/drm_gem_framebuffer_helper.h>
> >  #include <drm/drm_rect.h>
> >  #include <drm/drm_vblank.h>
> > -#include <drm/tinydrm/tinydrm.h>
> > +#include <drm/drm_simple_kms_helper.h>
> >  #include <drm/tinydrm/tinydrm-helpers.h>
> >  
> >  #define REPAPER_RID_G2_COG_ID	0x12
> > @@ -60,7 +60,8 @@ enum repaper_epd_border_byte {
> >  };
> >  
> >  struct repaper_epd {
> > -	struct tinydrm_device tinydrm;
> > +	struct drm_device base;
> > +	struct drm_simple_display_pipe pipe;
> >  	struct spi_device *spi;
> >  
> >  	struct gpio_desc *panel_on;
> > @@ -89,10 +90,9 @@ struct repaper_epd {
> >  	bool partial;
> >  };
> >  
> > -static inline struct repaper_epd *
> > -epd_from_tinydrm(struct tinydrm_device *tdev)
> > +static inline struct repaper_epd *drm_to_epd(struct drm_device *drm)
> >  {
> > -	return container_of(tdev, struct repaper_epd, tinydrm);
> > +	return container_of(drm, struct repaper_epd, base);
> >  }
> >  
> >  static int repaper_spi_transfer(struct spi_device *spi, u8 header,
> > @@ -530,8 +530,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb)
> >  {
> >  	struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
> >  	struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
> > -	struct tinydrm_device *tdev = fb->dev->dev_private;
> > -	struct repaper_epd *epd = epd_from_tinydrm(tdev);
> > +	struct repaper_epd *epd = drm_to_epd(fb->dev);
> >  	struct drm_rect clip;
> >  	u8 *buf = NULL;
> >  	int ret = 0;
> > @@ -646,8 +645,7 @@ static void repaper_pipe_enable(struct drm_simple_display_pipe *pipe,
> >  				struct drm_crtc_state *crtc_state,
> >  				struct drm_plane_state *plane_state)
> >  {
> > -	struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
> > -	struct repaper_epd *epd = epd_from_tinydrm(tdev);
> > +	struct repaper_epd *epd = drm_to_epd(pipe->crtc.dev);
> >  	struct spi_device *spi = epd->spi;
> >  	struct device *dev = &spi->dev;
> >  	bool dc_ok = false;
> > @@ -781,8 +779,7 @@ static void repaper_pipe_enable(struct drm_simple_display_pipe *pipe,
> >  
> >  static void repaper_pipe_disable(struct drm_simple_display_pipe *pipe)
> >  {
> > -	struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
> > -	struct repaper_epd *epd = epd_from_tinydrm(tdev);
> > +	struct repaper_epd *epd = drm_to_epd(pipe->crtc.dev);
> >  	struct spi_device *spi = epd->spi;
> >  	unsigned int line;
> >  
> > @@ -856,6 +853,23 @@ static const struct drm_simple_display_pipe_funcs repaper_pipe_funcs = {
> >  	.prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb,
> >  };
> >  
> > +static const struct drm_mode_config_funcs repaper_mode_config_funcs = {
> > +	.fb_create = drm_gem_fb_create_with_dirty,
> > +	.atomic_check = drm_atomic_helper_check,
> > +	.atomic_commit = drm_atomic_helper_commit,
> > +};
> > +
> > +static void repaper_release(struct drm_device *drm)
> > +{
> > +	struct repaper_epd *epd = drm_to_epd(drm);
> > +
> > +	DRM_DEBUG_DRIVER("\n");
> > +
> > +	drm_mode_config_cleanup(drm);
> > +	drm_dev_fini(drm);
> > +	kfree(epd);
> > +}
> > +
> >  static const uint32_t repaper_formats[] = {
> >  	DRM_FORMAT_XRGB8888,
> >  };
> > @@ -894,6 +908,7 @@ static struct drm_driver repaper_driver = {
> >  	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
> >  				  DRIVER_ATOMIC,
> >  	.fops			= &repaper_fops,
> > +	.release		= repaper_release,
> >  	DRM_GEM_CMA_VMAP_DRIVER_OPS,
> >  	.name			= "repaper",
> >  	.desc			= "Pervasive Displays RePaper e-ink panels",
> > @@ -927,7 +942,6 @@ static int repaper_probe(struct spi_device *spi)
> >  	const struct of_device_id *match;
> >  	struct drm_connector *connector;
> >  	struct device *dev = &spi->dev;
> > -	struct tinydrm_device *tdev;
> >  	enum repaper_model model;
> >  	const char *thermal_zone;
> >  	struct repaper_epd *epd;
> > @@ -952,10 +966,20 @@ static int repaper_probe(struct spi_device *spi)
> >  		}
> >  	}
> >  
> > -	epd = devm_kzalloc(dev, sizeof(*epd), GFP_KERNEL);
> > +	epd = kzalloc(sizeof(*epd), GFP_KERNEL);
> >  	if (!epd)
> >  		return -ENOMEM;
> >  
> > +	drm = &epd->base;
> > +	ret = devm_drm_dev_init(dev, drm, &repaper_driver);
> > +	if (ret) {
> > +		kfree(epd);
> > +		return ret;
> > +	}
> Here you go to the trouble and free epd on error.
> 
> > +
> > +	drm_mode_config_init(drm);
> > +	drm->mode_config.funcs = &repaper_mode_config_funcs;
> > +
> >  	epd->spi = spi;
> >  
> >  	epd->panel_on = devm_gpiod_get(dev, "panel-on", GPIOD_OUT_LOW);
> > @@ -1066,32 +1090,25 @@ static int repaper_probe(struct spi_device *spi)
> >  	if (!epd->current_frame)
> >  		return -ENOMEM;
> >  
> > -	tdev = &epd->tinydrm;
> > -
> > -	ret = devm_tinydrm_init(dev, tdev, &repaper_driver);
> > -	if (ret)
> > -		return ret;
> > -
> > -	drm = tdev->drm;
> >  
> >  	connector = drm_simple_connector_create(drm, DRM_MODE_CONNECTOR_VIRTUAL, mode, 0);
> >  	if (IS_ERR(connector))
> >  		return PTR_ERR(connector);
> >  
> > -	ret = drm_simple_display_pipe_init(drm, &tdev->pipe, &repaper_pipe_funcs,
> > +	ret = drm_simple_display_pipe_init(drm, &epd->pipe, &repaper_pipe_funcs,
> >  					   repaper_formats, ARRAY_SIZE(repaper_formats),
> >  					   NULL, connector);
> >  	if (ret)
> >  		return ret;
> But later in the same function epd is not freed.
> Looks like a leak?
> Nothing new if this is correct but just spotted it.

The part with "nothing new" I take back. This code converts
devm_kzalloc() to the unmanaged variant.
So the leak is new - and also present in
drivers in next patch (if there is a leak).

Why is the conversion to an unmanaged variant of kzalloc() required?

	Sam
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2019-01-20 22:26 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-20 11:43 [PATCH 00/11] drm/tinydrm: Remove tinydrm_device Noralf Trønnes
2019-01-20 11:43 ` [PATCH 01/11] drm: Add devm_drm_dev_init/register Noralf Trønnes
2019-01-21  6:11   ` Sam Ravnborg
2019-01-21 13:09     ` Noralf Trønnes
2019-01-21  9:10   ` Daniel Vetter
2019-01-21  9:55     ` Daniel Vetter
2019-01-21 12:21       ` Noralf Trønnes
2019-01-22  9:32         ` Daniel Vetter
2019-01-22 19:07           ` Noralf Trønnes
2019-01-22 19:30             ` Daniel Vetter
2019-01-23 10:54               ` Noralf Trønnes
2019-01-24 10:43                 ` devm actions and hw clenaup (was Re: [PATCH 01/11] drm: Add devm_drm_dev_init/register) Daniel Vetter
2019-01-24 17:46                   ` Greg KH
2019-01-24 17:57                     ` Daniel Vetter
2019-01-29 14:34                       ` Noralf Trønnes
2019-01-29 15:16                         ` Greg KH
2019-01-29 16:50                         ` Daniel Vetter
2019-01-29 17:26                           ` Noralf Trønnes
2019-01-29 17:36                           ` Greg KH
2019-01-29 18:10                             ` Daniel Vetter
2019-01-29 19:27                               ` Greg KH
2019-01-29 23:14                                 ` Daniel Vetter
2019-01-30  7:14                                   ` Greg KH
2019-01-22  9:35   ` [PATCH 01/11] drm: Add devm_drm_dev_init/register Daniel Vetter
2019-01-20 11:43 ` [PATCH 02/11] drm/modes: Add DRM_SIMPLE_MODE() Noralf Trønnes
2019-01-20 16:37   ` Ilia Mirkin
2019-01-20 17:27     ` Noralf Trønnes
2019-01-20 11:43 ` [PATCH 03/11] drm/simple-kms-helper: Add drm_simple_connector_create() Noralf Trønnes
2019-01-20 22:14   ` Sam Ravnborg
2019-01-21  9:22   ` Daniel Vetter
2019-01-24 14:38     ` Noralf Trønnes
2019-01-24 14:53       ` Hans de Goede
2019-01-25 12:05         ` Noralf Trønnes
2019-01-20 11:43 ` [PATCH 04/11] drm/tinydrm: Remove tinydrm_display_pipe_init() Noralf Trønnes
2019-01-21  6:30   ` Sam Ravnborg
2019-01-21  9:15   ` Daniel Vetter
2019-01-28 14:46     ` Noralf Trønnes
2019-01-20 11:43 ` [PATCH 05/11] drm/tinydrm/mipi-dbi: Add drm_to_mipi_dbi() Noralf Trønnes
2019-01-21  6:34   ` Sam Ravnborg
2019-01-20 11:43 ` [PATCH 06/11] drm/tinydrm: Remove tinydrm_shutdown() Noralf Trønnes
2019-01-21  7:12   ` Sam Ravnborg
2019-01-20 11:43 ` [PATCH 07/11] drm/tinydrm/repaper: Use devm_drm_dev_*() Noralf Trønnes
2019-01-20 22:22   ` Sam Ravnborg
2019-01-20 22:25     ` Sam Ravnborg [this message]
2019-01-21 13:15       ` Noralf Trønnes
2019-01-20 11:43 ` [PATCH 08/11] drm/tinydrm: " Noralf Trønnes
2019-01-20 11:43 ` [PATCH 09/11] drm/tinydrm: Remove tinydrm_device Noralf Trønnes
2019-01-21  8:13   ` Sam Ravnborg
2019-01-21  9:29   ` Daniel Vetter
2019-01-21 13:30     ` Noralf Trønnes
2019-01-20 11:43 ` [PATCH 10/11] drm/tinydrm: Use drm_dev_enter/exit() Noralf Trønnes
2019-01-20 11:43 ` [PATCH 11/11] drm/fb-helper: generic: Don't take module ref for fbcon Noralf Trønnes
2019-01-21  9:05   ` Daniel Vetter
2019-01-28 14:40     ` Noralf Trønnes
2019-01-29  8:45       ` Daniel Vetter
2019-01-21  8:34 ` [PATCH 00/11] drm/tinydrm: Remove tinydrm_device Sam Ravnborg
2019-01-21 13:20   ` Noralf Trønnes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190120222557.GA26041@ravnborg.org \
    --to=sam@ravnborg.org \
    --cc=david@lechnology.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=noralf@tronnes.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.