All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Roper <matthew.d.roper@intel.com>
To: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 6/7] drm/i915: Improve how the memory for crtc state is allocated
Date: Fri, 16 Jan 2015 15:48:56 -0800	[thread overview]
Message-ID: <20150116234856.GG22549@intel.com> (raw)
In-Reply-To: <1421326527-24906-7-git-send-email-ander.conselvan.de.oliveira@intel.com>

On Thu, Jan 15, 2015 at 02:55:26PM +0200, Ander Conselvan de Oliveira wrote:
> The previous patch changed the config field in intel_crtc to a pointer,
> but to keep the mechanical changes (done with spatch) separate from the
> new code, the pointer was made to point to a new _config field with type
> struct intel_crtc_state added to that struct. This patch improves that
> code by getting rid of that field, allocating a state struct in
> intel_crtc_init() a keeping it properly updated when a mode set
> happens.
> 
> v2: Manual changes split from previous patch. (Matt)
>     Don't leak the current state when the crtc is destroyed (Matt)
> 
> Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_display.c | 20 ++++++++++++++++----
>  drivers/gpu/drm/i915/intel_drv.h     |  1 -
>  2 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index acdaed2..002e5a9 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8926,6 +8926,13 @@ out:
>  	intel_runtime_pm_put(dev_priv);
>  }
>  
> +static void intel_crtc_set_state(struct intel_crtc *crtc,
> +				 struct intel_crtc_state *crtc_state)
> +{
> +	kfree(crtc->config);
> +	crtc->config = crtc_state;
> +}
> +
>  static void intel_crtc_destroy(struct drm_crtc *crtc)
>  {
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> @@ -8944,6 +8951,7 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
>  
>  	drm_crtc_cleanup(crtc);
>  
> +	intel_crtc_set_state(intel_crtc, NULL);

Actually I just looked at this again and I think this is going to cause
a non-fatal warning on unload.  Given your update of the base state in
patch 7, the drm_crtc_cleanup() here is going to see crtc->state as non-NULL and
try to clean it up itself.  But since you haven't implemented
crtc->funcs->atomic_destroy_state(), it will just throw a warning and
continue on.

So I think you want to do one of the following:
 * Move the intel_crtc_set_state() call above drm_crtc_cleanup() so that
   the core won't see a non-NULL state and think it needs to clean up.
 * Completely drop the intel_crtc_set_state() call and instead implement
   crtc->funcs->atomic_destroy_state() so that the core can handle the
   cleanup for us.


Matt

>  	kfree(intel_crtc);
>  }
>  
> @@ -10995,8 +11003,7 @@ static int __intel_set_mode(struct drm_crtc *crtc,
>  		crtc->mode = *mode;
>  		/* mode_set/enable/disable functions rely on a correct pipe
>  		 * config. */
> -		(*(to_intel_crtc(crtc)->config)) = *pipe_config;
> -		to_intel_crtc(crtc)->new_config = to_intel_crtc(crtc)->config;
> +		intel_crtc_set_state(to_intel_crtc(crtc), pipe_config);
>  
>  		/*
>  		 * Calculate and store various constants which
> @@ -11040,7 +11047,6 @@ done:
>  	if (ret && crtc->enabled)
>  		crtc->mode = *saved_mode;
>  
> -	kfree(pipe_config);
>  	kfree(saved_mode);
>  	return ret;
>  }
> @@ -12187,6 +12193,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_crtc *intel_crtc;
> +	struct intel_crtc_state *crtc_state = NULL;
>  	struct drm_plane *primary = NULL;
>  	struct drm_plane *cursor = NULL;
>  	int i, ret;
> @@ -12195,6 +12202,11 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  	if (intel_crtc == NULL)
>  		return;
>  
> +	crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
> +	if (!crtc_state)
> +		goto fail;
> +	intel_crtc_set_state(intel_crtc, crtc_state);
> +
>  	primary = intel_primary_plane_create(dev, pipe);
>  	if (!primary)
>  		goto fail;
> @@ -12240,7 +12252,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
>  	drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
>  
>  	WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe);
> -	intel_crtc->config = &intel_crtc->_config;
>  	return;
>  
>  fail:
> @@ -12248,6 +12259,7 @@ fail:
>  		drm_plane_cleanup(primary);
>  	if (cursor)
>  		drm_plane_cleanup(cursor);
> +	kfree(crtc_state);
>  	kfree(intel_crtc);
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 0b59a93..c8c0b7f 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -469,7 +469,6 @@ struct intel_crtc {
>  	uint32_t cursor_base;
>  
>  	struct intel_plane_config plane_config;
> -	struct intel_crtc_state _config;
>  	struct intel_crtc_state *config;
>  	struct intel_crtc_state *new_config;
>  	bool new_enabled;
> -- 
> 1.9.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Matt Roper
Graphics Software Engineer
IoTG Platform Enabling & Development
Intel Corporation
(916) 356-2795
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2015-01-16 23:49 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-15 12:55 [PATCH 0/7] Make drm_crtc->state match pipe_config Ander Conselvan de Oliveira
2015-01-15 12:55 ` [PATCH 1/7] drm/i915: Rename struct intel_crtc_config to intel_crtc_state Ander Conselvan de Oliveira
2015-01-15 12:55 ` [PATCH 2/7] drm/i915: Embedded struct drm_crtc_state in intel_crtc_state Ander Conselvan de Oliveira
2015-01-15 12:55 ` [PATCH 3/7] drm/i915: Pass new_config down do crtc_compute_clock Ander Conselvan de Oliveira
2015-01-15 12:55 ` [PATCH 4/7] drm/i915: Use local pipe_config varariable when available Ander Conselvan de Oliveira
2015-01-15 12:55 ` [PATCH 5/7] drm/i915: Make intel_crtc->config a pointer Ander Conselvan de Oliveira
2015-01-15 12:55 ` [PATCH 6/7] drm/i915: Improve how the memory for crtc state is allocated Ander Conselvan de Oliveira
2015-01-15 18:50   ` Matt Roper
2015-01-16  8:50     ` Ander Conselvan de Oliveira
2015-01-16 23:48   ` Matt Roper [this message]
2015-01-20  9:37     ` Daniel Vetter
2015-01-15 12:55 ` [PATCH 7/7] drm/i915: Keep drm_crtc->state in sync with intel_crtc->config Ander Conselvan de Oliveira
2015-01-16  6:09   ` shuang.he

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=20150116234856.GG22549@intel.com \
    --to=matthew.d.roper@intel.com \
    --cc=ander.conselvan.de.oliveira@intel.com \
    --cc=intel-gfx@lists.freedesktop.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.