diff mbox

[08/10] drm/i915: Use crtc->state for duplication.

Message ID 1441894085-25662-9-git-send-email-maarten.lankhorst@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Maarten Lankhorst Sept. 10, 2015, 2:08 p.m. UTC
In async mode crtc->config can be updated after the locks are released,
resulting in the wrong state being duplicated.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_atomic.c | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

Comments

Daniel Vetter Sept. 10, 2015, 3:46 p.m. UTC | #1
On Thu, Sep 10, 2015 at 04:08:03PM +0200, Maarten Lankhorst wrote:
> In async mode crtc->config can be updated after the locks are released,
> resulting in the wrong state being duplicated.
> 
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/intel_atomic.c | 9 +--------
>  1 file changed, 1 insertion(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
> index 8287b81287a0..9d5cc89ebfcb 100644
> --- a/drivers/gpu/drm/i915/intel_atomic.c
> +++ b/drivers/gpu/drm/i915/intel_atomic.c
> @@ -85,20 +85,13 @@ intel_connector_atomic_get_property(struct drm_connector *connector,
>  struct drm_crtc_state *
>  intel_crtc_duplicate_state(struct drm_crtc *crtc)
>  {
> -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	struct intel_crtc_state *crtc_state;
>  
> -	if (WARN_ON(!intel_crtc->config))
> -		crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
> -	else
> -		crtc_state = kmemdup(intel_crtc->config,
> -				     sizeof(*intel_crtc->config), GFP_KERNEL);
> -
> +	crtc_state = kmemdup(crtc->state, sizeof(*crtc_state), GFP_KERNEL);
>  	if (!crtc_state)
>  		return NULL;
>  
>  	__drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->base);
> -	crtc_state->base.crtc = crtc;

This is a bugfix for Ander's patch in 4.3. Please split it out and submit
just that part to Jani. I've dropped this part from the patch I merged to
dinq.
-Daniel

>  	crtc_state->update_pipe = false;
>  
>  	return &crtc_state->base;
> -- 
> 2.1.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Daniel Vetter Sept. 10, 2015, 3:49 p.m. UTC | #2
On Thu, Sep 10, 2015 at 05:46:12PM +0200, Daniel Vetter wrote:
> On Thu, Sep 10, 2015 at 04:08:03PM +0200, Maarten Lankhorst wrote:
> > In async mode crtc->config can be updated after the locks are released,
> > resulting in the wrong state being duplicated.
> > 
> > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_atomic.c | 9 +--------
> >  1 file changed, 1 insertion(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
> > index 8287b81287a0..9d5cc89ebfcb 100644
> > --- a/drivers/gpu/drm/i915/intel_atomic.c
> > +++ b/drivers/gpu/drm/i915/intel_atomic.c
> > @@ -85,20 +85,13 @@ intel_connector_atomic_get_property(struct drm_connector *connector,
> >  struct drm_crtc_state *
> >  intel_crtc_duplicate_state(struct drm_crtc *crtc)
> >  {
> > -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> >  	struct intel_crtc_state *crtc_state;
> >  
> > -	if (WARN_ON(!intel_crtc->config))
> > -		crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
> > -	else
> > -		crtc_state = kmemdup(intel_crtc->config,
> > -				     sizeof(*intel_crtc->config), GFP_KERNEL);
> > -
> > +	crtc_state = kmemdup(crtc->state, sizeof(*crtc_state), GFP_KERNEL);
> >  	if (!crtc_state)
> >  		return NULL;
> >  
> >  	__drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->base);
> > -	crtc_state->base.crtc = crtc;
> 
> This is a bugfix for Ander's patch in 4.3. Please split it out and submit
> just that part to Jani. I've dropped this part from the patch I merged to
> dinq.

Argh got confused, that line is in dinq too. I added a commit reference to
your patch.
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
index 8287b81287a0..9d5cc89ebfcb 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -85,20 +85,13 @@  intel_connector_atomic_get_property(struct drm_connector *connector,
 struct drm_crtc_state *
 intel_crtc_duplicate_state(struct drm_crtc *crtc)
 {
-	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 	struct intel_crtc_state *crtc_state;
 
-	if (WARN_ON(!intel_crtc->config))
-		crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
-	else
-		crtc_state = kmemdup(intel_crtc->config,
-				     sizeof(*intel_crtc->config), GFP_KERNEL);
-
+	crtc_state = kmemdup(crtc->state, sizeof(*crtc_state), GFP_KERNEL);
 	if (!crtc_state)
 		return NULL;
 
 	__drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->base);
-	crtc_state->base.crtc = crtc;
 	crtc_state->update_pipe = false;
 
 	return &crtc_state->base;