All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Matt Roper <matthew.d.roper@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH] drm/i915: Ensure plane->state->fb stays in sync with plane->fb
Date: Wed, 4 Feb 2015 10:39:48 +0100	[thread overview]
Message-ID: <20150204093948.GD14009@phenom.ffwll.local> (raw)
In-Reply-To: <1422997804-3871-1-git-send-email-matthew.d.roper@intel.com>

On Tue, Feb 03, 2015 at 01:10:04PM -0800, Matt Roper wrote:
> plane->state->fb and plane->fb should always reference the same FB so
> that atomic and legacy codepaths have the same view of display state.
> In commit
> 
>         commit db068420560511de80ac59222644f2bdf278c3d5
>         Author: Matt Roper <matthew.d.roper@intel.com>
>         Date:   Fri Jan 30 16:22:36 2015 -0800
> 
>             drm/i915: Keep plane->state updated on pageflip
> 
> we already fixed one case where these two pointers could get out of
> sync.  However it turns out there are a few other places (mainly dealing
> with initial FB setup at boot) that directly set plane->fb and neglect
> to update plane->state->fb.  If we never do a successful update through
> the atomic pipeline, the RmFB cleanup code will look at the
> plane->state->fb pointer, which has never actually been set to a
> legitimate value, and try to clean it up, leading to BUG's.
> 
> Add a quick helper function to synchronize plane->state->fb with
> plane->fb (and update reference counts accordingly) and call it
> everywhere the driver tries to manually set plane->fb outside of the
> atomic pipeline.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=88909
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>

Unrelated thing I've spotted while reviewing this: We still update
plane->fb in our plane commit hooks, but helpers should take care of that.
Do we still have these because our code still looks at plane->fb instead
of plane->state->fb or is there some deeper reason?

I think a large-scale s/plane->fb/plane->state->fb/ and then removing
those and relying upon the fixup code in the helpers/core would be good.
Unfortunately we can't cocci this since we need to keep a few ...

Anyway, patch lgtm and is merged.

Thanks, Daniel
> ---
>  drivers/gpu/drm/i915/intel_display.c | 29 ++++++++++++++++++++++-------
>  1 file changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 213b870..e5c0579 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2410,6 +2410,20 @@ out_unref_obj:
>  	return false;
>  }
>  
> +/* Update plane->state->fb to match plane->fb after driver-internal updates */
> +static void
> +update_state_fb(struct drm_plane *plane)
> +{
> +	if (plane->fb == plane->state->fb)
> +		return;
> +
> +	if (plane->state->fb)
> +		drm_framebuffer_unreference(plane->state->fb);
> +	plane->state->fb = plane->fb;
> +	if (plane->state->fb)
> +		drm_framebuffer_reference(plane->state->fb);
> +}
> +
>  static void
>  intel_find_plane_obj(struct intel_crtc *intel_crtc,
>  		     struct intel_initial_plane_config *plane_config)
> @@ -2456,6 +2470,8 @@ intel_find_plane_obj(struct intel_crtc *intel_crtc,
>  			break;
>  		}
>  	}
> +
> +	update_state_fb(intel_crtc->base.primary);
>  }
>  
>  static void i9xx_update_primary_plane(struct drm_crtc *crtc,
> @@ -6635,6 +6651,7 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
>  		      plane_config->size);
>  
>  	crtc->base.primary->fb = fb;
> +	update_state_fb(crtc->base.primary);
>  }
>  
>  static void chv_crtc_clock_get(struct intel_crtc *crtc,
> @@ -7672,6 +7689,7 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc,
>  		      plane_config->size);
>  
>  	crtc->base.primary->fb = fb;
> +	update_state_fb(crtc->base.primary);
>  	return;
>  
>  error:
> @@ -7763,6 +7781,7 @@ ironlake_get_initial_plane_config(struct intel_crtc *crtc,
>  		      plane_config->size);
>  
>  	crtc->base.primary->fb = fb;
> +	update_state_fb(crtc->base.primary);
>  }
>  
>  static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
> @@ -9800,13 +9819,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
>  	drm_gem_object_reference(&obj->base);
>  
>  	crtc->primary->fb = fb;
> -
> -	/* Keep state structure in sync */
> -	if (crtc->primary->state->fb)
> -		drm_framebuffer_unreference(crtc->primary->state->fb);
> -	crtc->primary->state->fb = fb;
> -	if (crtc->primary->state->fb)
> -		drm_framebuffer_reference(crtc->primary->state->fb);
> +	update_state_fb(crtc->primary);
>  
>  	work->pending_flip_obj = obj;
>  
> @@ -9875,6 +9888,7 @@ cleanup_unpin:
>  cleanup_pending:
>  	atomic_dec(&intel_crtc->unpin_work_count);
>  	crtc->primary->fb = old_fb;
> +	update_state_fb(crtc->primary);
>  	drm_framebuffer_unreference(work->old_fb);
>  	drm_gem_object_unreference(&obj->base);
>  	mutex_unlock(&dev->struct_mutex);
> @@ -13709,6 +13723,7 @@ void intel_modeset_gem_init(struct drm_device *dev)
>  				  to_intel_crtc(c)->pipe);
>  			drm_framebuffer_unreference(c->primary->fb);
>  			c->primary->fb = NULL;
> +			update_state_fb(c->primary);
>  		}
>  	}
>  	mutex_unlock(&dev->struct_mutex);
> -- 
> 1.8.5.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2015-02-04  9:38 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-03 21:10 [PATCH] drm/i915: Ensure plane->state->fb stays in sync with plane->fb Matt Roper
2015-02-04  9:39 ` Daniel Vetter [this message]
  -- strict thread matches above, loose matches on Subject: below --
2015-03-12 12:16 Xi Ruoyao
2015-03-12 12:45 ` Jani Nikula
2015-03-12 16:12   ` Matt Roper
2015-03-13 12:38     ` Jani Nikula

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=20150204093948.GD14009@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=matthew.d.roper@intel.com \
    /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.