Linux kernel -stable discussions
 help / color / mirror / Atom feed
* [PATCH 0/3] amdgpu DC fixes for stable
@ 2019-09-20 14:03 Alex Deucher
  2019-09-20 14:03 ` [PATCH 1/3] drm/amd/display: Allow cursor async updates for framebuffer swaps Alex Deucher
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Alex Deucher @ 2019-09-20 14:03 UTC (permalink / raw)
  To: stable; +Cc: nicholas.kazlauskas, Alex Deucher

This set of patches is cherry-picked from 5.4 to stable to fix:
https://bugzilla.kernel.org/show_bug.cgi?id=204181

Please apply!

Thanks,

Alex

Nicholas Kazlauskas (3):
  drm/amd/display: Allow cursor async updates for framebuffer swaps
  drm/amd/display: Skip determining update type for async updates
  drm/amd/display: Don't replace the dc_state for fast updates

 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 56 ++++++++++++++-----
 1 file changed, 41 insertions(+), 15 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] drm/amd/display: Allow cursor async updates for framebuffer swaps
  2019-09-20 14:03 [PATCH 0/3] amdgpu DC fixes for stable Alex Deucher
@ 2019-09-20 14:03 ` Alex Deucher
  2019-09-20 14:03 ` [PATCH 2/3] drm/amd/display: Skip determining update type for async updates Alex Deucher
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Alex Deucher @ 2019-09-20 14:03 UTC (permalink / raw)
  To: stable; +Cc: nicholas.kazlauskas, Alex Deucher, David Francis

From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>

[Why]
We previously allowed framebuffer swaps as async updates for cursor
planes but had to disable them due to a bug in DRM with async update
handling and incorrect ref counting. The check to block framebuffer
swaps has been added to DRM for a while now, so this check is redundant.

The real fix that allows this to properly in DRM has also finally been
merged and is getting backported into stable branches, so dropping
this now seems to be the right time to do so.

[How]
Drop the redundant check for old_fb != new_fb.

With the proper fix in DRM, this should also fix some cursor stuttering
issues with xf86-video-amdgpu since it double buffers the cursor.

IGT tests that swap framebuffers (-varying-size for example) should
also pass again.

Bug: https://bugzilla.kernel.org/show_bug.cgi?id=204181
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: David Francis <david.francis@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit e16e37efb4c9eb7bcb9dab756c975040c5257e98)
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 45be7a2132bb..ab341fca9647 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4548,20 +4548,10 @@ static int dm_plane_atomic_check(struct drm_plane *plane,
 static int dm_plane_atomic_async_check(struct drm_plane *plane,
 				       struct drm_plane_state *new_plane_state)
 {
-	struct drm_plane_state *old_plane_state =
-		drm_atomic_get_old_plane_state(new_plane_state->state, plane);
-
 	/* Only support async updates on cursor planes. */
 	if (plane->type != DRM_PLANE_TYPE_CURSOR)
 		return -EINVAL;
 
-	/*
-	 * DRM calls prepare_fb and cleanup_fb on new_plane_state for
-	 * async commits so don't allow fb changes.
-	 */
-	if (old_plane_state->fb != new_plane_state->fb)
-		return -EINVAL;
-
 	return 0;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] drm/amd/display: Skip determining update type for async updates
  2019-09-20 14:03 [PATCH 0/3] amdgpu DC fixes for stable Alex Deucher
  2019-09-20 14:03 ` [PATCH 1/3] drm/amd/display: Allow cursor async updates for framebuffer swaps Alex Deucher
@ 2019-09-20 14:03 ` Alex Deucher
  2019-09-20 14:03 ` [PATCH 3/3] drm/amd/display: Don't replace the dc_state for fast updates Alex Deucher
  2019-09-20 14:11 ` [PATCH 0/3] amdgpu DC fixes for stable Greg KH
  3 siblings, 0 replies; 7+ messages in thread
From: Alex Deucher @ 2019-09-20 14:03 UTC (permalink / raw)
  To: stable; +Cc: nicholas.kazlauskas, Alex Deucher, David Francis

From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>

[Why]
By passing through the dm_determine_update_type_for_commit for atomic
commits that can be done asynchronously we are incurring a
performance penalty by locking access to the global private object
and holding that access until the end of the programming sequence.

This is also allocating a new large dc_state on every access in addition
to retaining all the references on each stream and plane until the end
of the programming sequence.

[How]
Shift the determination for async update before validation. Return early
if it's going to be an async update.

Bug: https://bugzilla.kernel.org/show_bug.cgi?id=204181
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: David Francis <david.francis@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 43d10d30df156f7834fa91aecb69614fefc8bb0a)
Cc: stable@vger.kernel.org
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 ++++++++++++++-----
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index ab341fca9647..8df49740518e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7274,6 +7274,26 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
 	if (ret)
 		goto fail;
 
+	if (state->legacy_cursor_update) {
+		/*
+		 * This is a fast cursor update coming from the plane update
+		 * helper, check if it can be done asynchronously for better
+		 * performance.
+		 */
+		state->async_update =
+			!drm_atomic_helper_async_check(dev, state);
+
+		/*
+		 * Skip the remaining global validation if this is an async
+		 * update. Cursor updates can be done without affecting
+		 * state or bandwidth calcs and this avoids the performance
+		 * penalty of locking the private state object and
+		 * allocating a new dc_state.
+		 */
+		if (state->async_update)
+			return 0;
+	}
+
 	/* Check scaling and underscan changes*/
 	/* TODO Removed scaling changes validation due to inability to commit
 	 * new stream into context w\o causing full reset. Need to
@@ -7326,13 +7346,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
 			ret = -EINVAL;
 			goto fail;
 		}
-	} else if (state->legacy_cursor_update) {
-		/*
-		 * This is a fast cursor update coming from the plane update
-		 * helper, check if it can be done asynchronously for better
-		 * performance.
-		 */
-		state->async_update = !drm_atomic_helper_async_check(dev, state);
 	}
 
 	/* Must be success */
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] drm/amd/display: Don't replace the dc_state for fast updates
  2019-09-20 14:03 [PATCH 0/3] amdgpu DC fixes for stable Alex Deucher
  2019-09-20 14:03 ` [PATCH 1/3] drm/amd/display: Allow cursor async updates for framebuffer swaps Alex Deucher
  2019-09-20 14:03 ` [PATCH 2/3] drm/amd/display: Skip determining update type for async updates Alex Deucher
@ 2019-09-20 14:03 ` Alex Deucher
  2019-09-20 14:11 ` [PATCH 0/3] amdgpu DC fixes for stable Greg KH
  3 siblings, 0 replies; 7+ messages in thread
From: Alex Deucher @ 2019-09-20 14:03 UTC (permalink / raw)
  To: stable; +Cc: nicholas.kazlauskas, Alex Deucher, David Francis

From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>

[Why]
DRM private objects have no hw_done/flip_done fencing mechanism on their
own and cannot be used to sequence commits accordingly.

When issuing commits that don't touch the same set of hardware resources
like page-flips on different CRTCs we can run into the issue below
because of this:

1. Client requests non-blocking Commit #1, has a new dc_state #1,
state is swapped, commit tail is deferred to work queue

2. Client requests non-blocking Commit #2, has a new dc_state #2,
state is swapped, commit tail is deferred to work queue

3. Commit #2 work starts, commit tail finishes,
atomic state is cleared, dc_state #1 is freed

4. Commit #1 work starts,
commit tail encounters null pointer deref on dc_state #1

In order to change the DC state as in the private object we need to
ensure that we wait for all outstanding commits to finish and that
any other pending commits must wait for the current one to finish as
well.

We do this for MEDIUM and FULL updates. But not for FAST updates, nor
would we want to since it would cause stuttering from the delays.

FAST updates that go through dm_determine_update_type_for_commit always
create a new dc_state and lock the DRM private object if there are
any changed planes.

We need the old state to validate, but we don't actually need the new
state here.

[How]
If the commit isn't a full update then the use after free can be
resolved by simply discarding the new state entirely and retaining
the existing one instead.

With this change the sequence above can be reexamined. Commit #2 will
still free Commit #1's reference, but before this happens we actually
added an additional reference as part of Commit #2.

If an update comes in during this that needs to change the dc_state
it will need to wait on Commit #1 and Commit #2 to finish. Then it'll
swap the state, finish the work in commit tail and drop the last
reference on Commit #2's dc_state.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204181
Fixes: 004b3938e637 ("drm/amd/display: Check scaling info when determing update type")

Bug: https://bugzilla.kernel.org/show_bug.cgi?id=204181
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: David Francis <david.francis@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit bd200d190f45b62c006d1ad0a63eeffd87db7a47)
Cc: stable@vger.kernel.org
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 8df49740518e..beb2d268d1ef 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -7346,6 +7346,29 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
 			ret = -EINVAL;
 			goto fail;
 		}
+	} else {
+		/*
+		 * The commit is a fast update. Fast updates shouldn't change
+		 * the DC context, affect global validation, and can have their
+		 * commit work done in parallel with other commits not touching
+		 * the same resource. If we have a new DC context as part of
+		 * the DM atomic state from validation we need to free it and
+		 * retain the existing one instead.
+		 */
+		struct dm_atomic_state *new_dm_state, *old_dm_state;
+
+		new_dm_state = dm_atomic_get_new_state(state);
+		old_dm_state = dm_atomic_get_old_state(state);
+
+		if (new_dm_state && old_dm_state) {
+			if (new_dm_state->context)
+				dc_release_state(new_dm_state->context);
+
+			new_dm_state->context = old_dm_state->context;
+
+			if (old_dm_state->context)
+				dc_retain_state(old_dm_state->context);
+		}
 	}
 
 	/* Must be success */
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/3] amdgpu DC fixes for stable
  2019-09-20 14:03 [PATCH 0/3] amdgpu DC fixes for stable Alex Deucher
                   ` (2 preceding siblings ...)
  2019-09-20 14:03 ` [PATCH 3/3] drm/amd/display: Don't replace the dc_state for fast updates Alex Deucher
@ 2019-09-20 14:11 ` Greg KH
  2019-09-20 14:15   ` Deucher, Alexander
  3 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2019-09-20 14:11 UTC (permalink / raw)
  To: Alex Deucher; +Cc: stable, nicholas.kazlauskas, Alex Deucher

On Fri, Sep 20, 2019 at 09:03:35AM -0500, Alex Deucher wrote:
> This set of patches is cherry-picked from 5.4 to stable to fix:
> https://bugzilla.kernel.org/show_bug.cgi?id=204181
> 
> Please apply!

What stable tree(s) do you wish to see this applied to?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH 0/3] amdgpu DC fixes for stable
  2019-09-20 14:11 ` [PATCH 0/3] amdgpu DC fixes for stable Greg KH
@ 2019-09-20 14:15   ` Deucher, Alexander
  2019-09-22  8:14     ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Deucher, Alexander @ 2019-09-20 14:15 UTC (permalink / raw)
  To: Greg KH, Alex Deucher; +Cc: stable@vger.kernel.org, Kazlauskas, Nicholas

> -----Original Message-----
> From: Greg KH <gregkh@linuxfoundation.org>
> Sent: Friday, September 20, 2019 10:12 AM
> To: Alex Deucher <alexdeucher@gmail.com>
> Cc: stable@vger.kernel.org; Kazlauskas, Nicholas
> <Nicholas.Kazlauskas@amd.com>; Deucher, Alexander
> <Alexander.Deucher@amd.com>
> Subject: Re: [PATCH 0/3] amdgpu DC fixes for stable
> 
> On Fri, Sep 20, 2019 at 09:03:35AM -0500, Alex Deucher wrote:
> > This set of patches is cherry-picked from 5.4 to stable to fix:
> > https://bugzilla.kernel.org/show_bug.cgi?id=204181
> >
> > Please apply!
> 
> What stable tree(s) do you wish to see this applied to?

5.3 and 5.2 would be great.  Thanks!

Alex

> 
> thanks,
> 
> greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/3] amdgpu DC fixes for stable
  2019-09-20 14:15   ` Deucher, Alexander
@ 2019-09-22  8:14     ` Greg KH
  0 siblings, 0 replies; 7+ messages in thread
From: Greg KH @ 2019-09-22  8:14 UTC (permalink / raw)
  To: Deucher, Alexander
  Cc: Alex Deucher, stable@vger.kernel.org, Kazlauskas, Nicholas

On Fri, Sep 20, 2019 at 02:15:11PM +0000, Deucher, Alexander wrote:
> > -----Original Message-----
> > From: Greg KH <gregkh@linuxfoundation.org>
> > Sent: Friday, September 20, 2019 10:12 AM
> > To: Alex Deucher <alexdeucher@gmail.com>
> > Cc: stable@vger.kernel.org; Kazlauskas, Nicholas
> > <Nicholas.Kazlauskas@amd.com>; Deucher, Alexander
> > <Alexander.Deucher@amd.com>
> > Subject: Re: [PATCH 0/3] amdgpu DC fixes for stable
> > 
> > On Fri, Sep 20, 2019 at 09:03:35AM -0500, Alex Deucher wrote:
> > > This set of patches is cherry-picked from 5.4 to stable to fix:
> > > https://bugzilla.kernel.org/show_bug.cgi?id=204181
> > >
> > > Please apply!
> > 
> > What stable tree(s) do you wish to see this applied to?
> 
> 5.3 and 5.2 would be great.  Thanks!

All queued up now, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-09-22  8:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-09-20 14:03 [PATCH 0/3] amdgpu DC fixes for stable Alex Deucher
2019-09-20 14:03 ` [PATCH 1/3] drm/amd/display: Allow cursor async updates for framebuffer swaps Alex Deucher
2019-09-20 14:03 ` [PATCH 2/3] drm/amd/display: Skip determining update type for async updates Alex Deucher
2019-09-20 14:03 ` [PATCH 3/3] drm/amd/display: Don't replace the dc_state for fast updates Alex Deucher
2019-09-20 14:11 ` [PATCH 0/3] amdgpu DC fixes for stable Greg KH
2019-09-20 14:15   ` Deucher, Alexander
2019-09-22  8:14     ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox