All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Matt Roper <matthew.d.roper@intel.com>
Cc: intel-gfx@lists.freedesktop.org,
	Lucas De Marchi <lucas.demarchi@intel.com>
Subject: Re: [PATCH 1/2] drm/i915/dsb: remove atomic operations
Date: Fri, 15 Nov 2019 23:09:43 +0200	[thread overview]
Message-ID: <20191115210943.GQ1208@intel.com> (raw)
In-Reply-To: <20191115202938.GZ21445@mdroper-desk1.amr.corp.intel.com>

On Fri, Nov 15, 2019 at 12:29:38PM -0800, Matt Roper wrote:
> On Mon, Nov 11, 2019 at 12:50:24PM -0800, Lucas De Marchi wrote:
> > The current dsb API is not really prepared to handle multithread access.
> > I was debugging an issue that ended up fixed by commit a096883dda2c
> > ("drm/i915/dsb: Remove PIN_MAPPABLE from the DSB object VMA") and was
> > puzzled how these atomic operations were guaranteeing atomicity.
> > 
> > 	if (atomic_add_return(1, &dsb->refcount) != 1)
> > 		return dsb;
> > 
> > Thread A could still be initializing dsb struct (and even fail in the
> > middle) while thread B would take a reference and use it (even
> > derefencing a NULL cmd_buf).
> > 
> > I don't think the atomic operations here will help much if this were
> > to support multithreaded scenario in future, so just remove them to
> > avoid confusion.
> > 
> > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> 
> Agreed; the synchronization here doesn't appear to make sense.  But
> also I believe everywhere this would get called is on the atomic commit
> path and we already hold the CRTC lock at that point which will prevent
> concurrent threads calling this.  So

Nonblocking commits are unlocked. And I'm thinking we should make
blocking commits unlocked as well. However commits for a specific
crtc are serialized so assuming this dsb stuff is per-crtc we should
probably be fine.

This whole refcount stuff seems a bit overkill tbh. We have a 
fixed number of dsbs per pipe and fixed roles we could assign
to them. So I have a feeling all of this should just go away.

> 
> Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
> 
> > ---
> >  drivers/gpu/drm/i915/display/intel_dsb.c | 10 +++++-----
> >  drivers/gpu/drm/i915/display/intel_dsb.h |  2 +-
> >  2 files changed, 6 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c
> > index d8ad5fe1efef..4feebbeb0b0c 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dsb.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dsb.c
> > @@ -107,7 +107,7 @@ intel_dsb_get(struct intel_crtc *crtc)
> >  	if (!HAS_DSB(i915))
> >  		return dsb;
> >  
> > -	if (atomic_add_return(1, &dsb->refcount) != 1)
> > +	if (++dsb->refcount != 1)

The usual pattern my brain is accustomed to is

if (ref++ == 0)
	enable();

if (--ref == 0)
	disabble();

> >  		return dsb;
> >  
> >  	dsb->id = DSB1;
> > @@ -123,7 +123,7 @@ intel_dsb_get(struct intel_crtc *crtc)
> >  	if (IS_ERR(vma)) {
> >  		DRM_ERROR("Vma creation failed\n");
> >  		i915_gem_object_put(obj);
> > -		atomic_dec(&dsb->refcount);
> > +		dsb->refcount--;
> >  		goto err;
> >  	}
> >  
> > @@ -132,7 +132,7 @@ intel_dsb_get(struct intel_crtc *crtc)
> >  		DRM_ERROR("Command buffer creation failed\n");
> >  		i915_vma_unpin_and_release(&vma, 0);
> >  		dsb->cmd_buf = NULL;
> > -		atomic_dec(&dsb->refcount);
> > +		dsb->refcount--;
> >  		goto err;
> >  	}
> >  	dsb->vma = vma;
> > @@ -158,10 +158,10 @@ void intel_dsb_put(struct intel_dsb *dsb)
> >  	if (!HAS_DSB(i915))
> >  		return;
> >  
> > -	if (WARN_ON(atomic_read(&dsb->refcount) == 0))
> > +	if (WARN_ON(dsb->refcount == 0))
> >  		return;
> >  
> > -	if (atomic_dec_and_test(&dsb->refcount)) {
> > +	if (--dsb->refcount == 0) {
> >  		i915_vma_unpin_and_release(&dsb->vma, I915_VMA_RELEASE_MAP);
> >  		dsb->cmd_buf = NULL;
> >  		dsb->free_pos = 0;
> > diff --git a/drivers/gpu/drm/i915/display/intel_dsb.h b/drivers/gpu/drm/i915/display/intel_dsb.h
> > index 6f95c8e909e6..395ef9ce558e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dsb.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dsb.h
> > @@ -22,7 +22,7 @@ enum dsb_id {
> >  };
> >  
> >  struct intel_dsb {
> > -	atomic_t refcount;
> > +	long refcount;
> >  	enum dsb_id id;
> >  	u32 *cmd_buf;
> >  	struct i915_vma *vma;
> > -- 
> > 2.24.0
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> -- 
> Matt Roper
> Graphics Software Engineer
> VTT-OSGC Platform Enablement
> Intel Corporation
> (916) 356-2795
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

WARNING: multiple messages have this Message-ID (diff)
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Matt Roper <matthew.d.roper@intel.com>
Cc: intel-gfx@lists.freedesktop.org,
	Lucas De Marchi <lucas.demarchi@intel.com>
Subject: Re: [Intel-gfx] [PATCH 1/2] drm/i915/dsb: remove atomic operations
Date: Fri, 15 Nov 2019 23:09:43 +0200	[thread overview]
Message-ID: <20191115210943.GQ1208@intel.com> (raw)
Message-ID: <20191115210943.7OVUwJZH5f0c-Wrps8Uzf3yrSFnwdeifAbYPJyZXf1M@z> (raw)
In-Reply-To: <20191115202938.GZ21445@mdroper-desk1.amr.corp.intel.com>

On Fri, Nov 15, 2019 at 12:29:38PM -0800, Matt Roper wrote:
> On Mon, Nov 11, 2019 at 12:50:24PM -0800, Lucas De Marchi wrote:
> > The current dsb API is not really prepared to handle multithread access.
> > I was debugging an issue that ended up fixed by commit a096883dda2c
> > ("drm/i915/dsb: Remove PIN_MAPPABLE from the DSB object VMA") and was
> > puzzled how these atomic operations were guaranteeing atomicity.
> > 
> > 	if (atomic_add_return(1, &dsb->refcount) != 1)
> > 		return dsb;
> > 
> > Thread A could still be initializing dsb struct (and even fail in the
> > middle) while thread B would take a reference and use it (even
> > derefencing a NULL cmd_buf).
> > 
> > I don't think the atomic operations here will help much if this were
> > to support multithreaded scenario in future, so just remove them to
> > avoid confusion.
> > 
> > Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
> 
> Agreed; the synchronization here doesn't appear to make sense.  But
> also I believe everywhere this would get called is on the atomic commit
> path and we already hold the CRTC lock at that point which will prevent
> concurrent threads calling this.  So

Nonblocking commits are unlocked. And I'm thinking we should make
blocking commits unlocked as well. However commits for a specific
crtc are serialized so assuming this dsb stuff is per-crtc we should
probably be fine.

This whole refcount stuff seems a bit overkill tbh. We have a 
fixed number of dsbs per pipe and fixed roles we could assign
to them. So I have a feeling all of this should just go away.

> 
> Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
> 
> > ---
> >  drivers/gpu/drm/i915/display/intel_dsb.c | 10 +++++-----
> >  drivers/gpu/drm/i915/display/intel_dsb.h |  2 +-
> >  2 files changed, 6 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c
> > index d8ad5fe1efef..4feebbeb0b0c 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dsb.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dsb.c
> > @@ -107,7 +107,7 @@ intel_dsb_get(struct intel_crtc *crtc)
> >  	if (!HAS_DSB(i915))
> >  		return dsb;
> >  
> > -	if (atomic_add_return(1, &dsb->refcount) != 1)
> > +	if (++dsb->refcount != 1)

The usual pattern my brain is accustomed to is

if (ref++ == 0)
	enable();

if (--ref == 0)
	disabble();

> >  		return dsb;
> >  
> >  	dsb->id = DSB1;
> > @@ -123,7 +123,7 @@ intel_dsb_get(struct intel_crtc *crtc)
> >  	if (IS_ERR(vma)) {
> >  		DRM_ERROR("Vma creation failed\n");
> >  		i915_gem_object_put(obj);
> > -		atomic_dec(&dsb->refcount);
> > +		dsb->refcount--;
> >  		goto err;
> >  	}
> >  
> > @@ -132,7 +132,7 @@ intel_dsb_get(struct intel_crtc *crtc)
> >  		DRM_ERROR("Command buffer creation failed\n");
> >  		i915_vma_unpin_and_release(&vma, 0);
> >  		dsb->cmd_buf = NULL;
> > -		atomic_dec(&dsb->refcount);
> > +		dsb->refcount--;
> >  		goto err;
> >  	}
> >  	dsb->vma = vma;
> > @@ -158,10 +158,10 @@ void intel_dsb_put(struct intel_dsb *dsb)
> >  	if (!HAS_DSB(i915))
> >  		return;
> >  
> > -	if (WARN_ON(atomic_read(&dsb->refcount) == 0))
> > +	if (WARN_ON(dsb->refcount == 0))
> >  		return;
> >  
> > -	if (atomic_dec_and_test(&dsb->refcount)) {
> > +	if (--dsb->refcount == 0) {
> >  		i915_vma_unpin_and_release(&dsb->vma, I915_VMA_RELEASE_MAP);
> >  		dsb->cmd_buf = NULL;
> >  		dsb->free_pos = 0;
> > diff --git a/drivers/gpu/drm/i915/display/intel_dsb.h b/drivers/gpu/drm/i915/display/intel_dsb.h
> > index 6f95c8e909e6..395ef9ce558e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dsb.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dsb.h
> > @@ -22,7 +22,7 @@ enum dsb_id {
> >  };
> >  
> >  struct intel_dsb {
> > -	atomic_t refcount;
> > +	long refcount;
> >  	enum dsb_id id;
> >  	u32 *cmd_buf;
> >  	struct i915_vma *vma;
> > -- 
> > 2.24.0
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> -- 
> Matt Roper
> Graphics Software Engineer
> VTT-OSGC Platform Enablement
> Intel Corporation
> (916) 356-2795
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2019-11-15 21:09 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-11 20:50 [PATCH 0/2] Improve error handling on DSB Lucas De Marchi
2019-11-11 20:50 ` [Intel-gfx] " Lucas De Marchi
2019-11-11 20:50 ` [PATCH 1/2] drm/i915/dsb: remove atomic operations Lucas De Marchi
2019-11-11 20:50   ` [Intel-gfx] " Lucas De Marchi
2019-11-15 20:29   ` Matt Roper
2019-11-15 20:29     ` [Intel-gfx] " Matt Roper
2019-11-15 21:09     ` Ville Syrjälä [this message]
2019-11-15 21:09       ` Ville Syrjälä
2019-11-15 23:01       ` Lucas De Marchi
2019-11-15 23:01         ` [Intel-gfx] " Lucas De Marchi
2019-11-16  1:15   ` [PATCH v2] " Lucas De Marchi
2019-11-16  1:15     ` [Intel-gfx] " Lucas De Marchi
2019-11-11 20:50 ` [PATCH 2/2] drm/i915/dsb: fix extra warning on error path handling Lucas De Marchi
2019-11-11 20:50   ` [Intel-gfx] " Lucas De Marchi
2019-11-15 20:52   ` Matt Roper
2019-11-15 20:52     ` [Intel-gfx] " Matt Roper
2019-11-15 23:04     ` Lucas De Marchi
2019-11-15 23:04       ` [Intel-gfx] " Lucas De Marchi
2019-11-18 16:07       ` Jani Nikula
2019-11-18 16:07         ` [Intel-gfx] " Jani Nikula
2019-11-11 22:13 ` ✓ Fi.CI.BAT: success for Improve error handling on DSB Patchwork
2019-11-11 22:13   ` [Intel-gfx] " Patchwork
2019-11-12  9:16 ` ✗ Fi.CI.IGT: failure " Patchwork
2019-11-12  9:16   ` [Intel-gfx] " Patchwork
2019-11-15  2:35 ` ✓ Fi.CI.BAT: success for Improve error handling on DSB (rev2) Patchwork
2019-11-15  2:35   ` [Intel-gfx] " Patchwork
2019-11-16  2:40 ` ✓ Fi.CI.BAT: success for Improve error handling on DSB (rev3) Patchwork
2019-11-16  2:40   ` [Intel-gfx] " Patchwork
2019-11-16 11:05 ` ✗ Fi.CI.IGT: failure for Improve error handling on DSB (rev2) Patchwork
2019-11-16 11:05   ` [Intel-gfx] " Patchwork
2019-11-16 16:47 ` ✓ Fi.CI.BAT: success for Improve error handling on DSB (rev4) Patchwork
2019-11-16 16:47   ` [Intel-gfx] " Patchwork
2019-11-17 22:59 ` ✓ Fi.CI.IGT: " Patchwork
2019-11-17 22:59   ` [Intel-gfx] " Patchwork

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=20191115210943.GQ1208@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=lucas.demarchi@intel.com \
    --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.