* [PATCH] drm/gud: Merge damage clips in full update mode
@ 2026-09-07 23:08 Sophie D
2026-09-08 6:32 ` Thomas Zimmermann
2026-09-10 1:49 ` [PATCH v2] drm/gud: Ignore " Sophie D
0 siblings, 2 replies; 7+ messages in thread
From: Sophie D @ 2026-09-07 23:08 UTC (permalink / raw)
To: rubenru09; +Cc: tzimmermann, dri-devel, linux-kernel, stable, Sophie D
When running in full update mode, previously small updates (such as
moving the mouse across the screen) would cause many full frames to be
generated. This would bog down the bus and lower the effective framerate
significantly - I was seeing a drop from 60 FPS to 2 FPS.
This patch fixes the bug by merging damage clips together.
Fixes: 73cfd166e045 ("drm/gud: Replace simple display pipe with DRM atomic helpers")
Cc: <stable@vger.kernel.org> # 6.18.x
Signed-off-by: Sophie D <patches@scd31.com>
---
drivers/gpu/drm/gud/gud_pipe.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c
index 5ef887d84..20418bf81 100644
--- a/drivers/gpu/drm/gud/gud_pipe.c
+++ b/drivers/gpu/drm/gud/gud_pipe.c
@@ -647,9 +647,14 @@ void gud_plane_atomic_update(struct drm_plane *plane,
if (ret)
goto out;
- drm_atomic_helper_damage_iter_init(&iter, old_state, new_state);
- drm_atomic_for_each_plane_damage(&iter, &damage)
- gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage);
+ if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE) {
+ if (drm_atomic_helper_damage_merged(old_state, new_state, &damage))
+ gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage);
+ } else {
+ drm_atomic_helper_damage_iter_init(&iter, old_state, new_state);
+ drm_atomic_for_each_plane_damage(&iter, &damage)
+ gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage);
+ }
drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/gud: Merge damage clips in full update mode
2026-09-07 23:08 [PATCH] drm/gud: Merge damage clips in full update mode Sophie D
@ 2026-09-08 6:32 ` Thomas Zimmermann
2026-09-10 1:59 ` Sophie D
2026-09-10 1:49 ` [PATCH v2] drm/gud: Ignore " Sophie D
1 sibling, 1 reply; 7+ messages in thread
From: Thomas Zimmermann @ 2026-09-08 6:32 UTC (permalink / raw)
To: Sophie D, rubenru09; +Cc: dri-devel, linux-kernel, stable
Hi
Am 08.09.26 um 01:08 schrieb Sophie D:
> When running in full update mode, previously small updates (such as
> moving the mouse across the screen) would cause many full frames to be
> generated. This would bog down the bus and lower the effective framerate
> significantly - I was seeing a drop from 60 FPS to 2 FPS.
>
> This patch fixes the bug by merging damage clips together.
>
> Fixes: 73cfd166e045 ("drm/gud: Replace simple display pipe with DRM atomic helpers")
> Cc: <stable@vger.kernel.org> # 6.18.x
> Signed-off-by: Sophie D <patches@scd31.com>
> ---
> drivers/gpu/drm/gud/gud_pipe.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c
> index 5ef887d84..20418bf81 100644
> --- a/drivers/gpu/drm/gud/gud_pipe.c
> +++ b/drivers/gpu/drm/gud/gud_pipe.c
> @@ -647,9 +647,14 @@ void gud_plane_atomic_update(struct drm_plane *plane,
> if (ret)
> goto out;
>
> - drm_atomic_helper_damage_iter_init(&iter, old_state, new_state);
> - drm_atomic_for_each_plane_damage(&iter, &damage)
> - gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage);
> + if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE) {
> + if (drm_atomic_helper_damage_merged(old_state, new_state, &damage))
> + gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage);
> + } else {
> + drm_atomic_helper_damage_iter_init(&iter, old_state, new_state);
> + drm_atomic_for_each_plane_damage(&iter, &damage)
> + gud_fb_handle_damage(gdrm, fb, &shadow_plane_state->data[0], &damage);
> + }
Such state needs to be checked much earlier. Please set
plane_state->ignore_damage_clips [1] at the end of
gud_plane_atomic_check [2] if in full-update mode. The damage iterator
will then do the right thing.
[1]
https://elixir.bootlin.com/linux/v7.2.2/source/include/drm/drm_plane.h#L207
[2]
https://elixir.bootlin.com/linux/v7.2.2/source/drivers/gpu/drm/gud/gud_pipe.c#L569
Best regards
Thomas
>
> drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] drm/gud: Ignore damage clips in full update mode
2026-09-07 23:08 [PATCH] drm/gud: Merge damage clips in full update mode Sophie D
2026-09-08 6:32 ` Thomas Zimmermann
@ 2026-09-10 1:49 ` Sophie D
2026-09-10 1:58 ` sashiko-bot
2026-09-10 6:17 ` Thomas Zimmermann
1 sibling, 2 replies; 7+ messages in thread
From: Sophie D @ 2026-09-10 1:49 UTC (permalink / raw)
To: Ruben Wauters, Thomas Zimmermann
Cc: Maarten Lankhorst, Maxime Ripard, David Airlie, Simona Vetter,
dri-devel, linux-kernel, Sophie D, stable
When running in full update mode, previously small updates (such as
moving the mouse across the screen) would cause many full frames to be
generated. This would bog down the bus and lower the effective framerate
significantly - I was seeing a drop from 60 FPS to 2 FPS.
Set ignore_damage_clips in full update mode so the damage iterator
yields a single full-plane rectangle instead of one per clip.
Fixes: 73cfd166e045 ("drm/gud: Replace simple display pipe with DRM atomic helpers")
Cc: <stable@vger.kernel.org> # 6.18.x
Signed-off-by: Sophie D <patches@scd31.com>
---
v2: set ignore_damage_clips in atomic_check instead of merging clips in
atomic_update (Thomas Zimmermann)
drivers/gpu/drm/gud/gud_pipe.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c
index 5ef887d84..3388fdc8e 100644
--- a/drivers/gpu/drm/gud/gud_pipe.c
+++ b/drivers/gpu/drm/gud/gud_pipe.c
@@ -482,6 +482,9 @@ int gud_plane_atomic_check(struct drm_plane *plane,
if (!new_plane_state->visible)
return 0;
+ if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE)
+ new_plane_state->ignore_damage_clips = true;
+
if (old_plane_state->rotation != new_plane_state->rotation)
crtc_state->mode_changed = true;
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2] drm/gud: Ignore damage clips in full update mode
2026-09-10 1:49 ` [PATCH v2] drm/gud: Ignore " Sophie D
@ 2026-09-10 1:58 ` sashiko-bot
2026-09-10 6:17 ` Thomas Zimmermann
1 sibling, 0 replies; 7+ messages in thread
From: sashiko-bot @ 2026-09-10 1:58 UTC (permalink / raw)
To: Sophie D; +Cc: dri-devel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] The iterator variable `connector_state` leaks out of `for_each_new_connector_in_state`, bypassing the fallback search.
--
commit 4deed33a0bafa9e2ff82e53d1da0f3130451d673
Author: Sophie D <patches@scd31.com>
drm/gud: Ignore damage clips in full update mode
When running in full update mode, previously small updates (such as
moving the mouse across the screen) would cause many full frames to be
generated. This would bog down the bus and lower the effective framerate
significantly - I was seeing a drop from 60 FPS to 2 FPS.
> diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c
> index 5ef887d8485a3..3388fdc8ea7b5 100644
> --- a/drivers/gpu/drm/gud/gud_pipe.c
> +++ b/drivers/gpu/drm/gud/gud_pipe.c
> @@ -482,6 +482,9 @@ int gud_plane_atomic_check(struct drm_plane *plane,
> if (!new_plane_state->visible)
> return 0;
>
> + if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE)
> + new_plane_state->ignore_damage_clips = true;
> +
> if (old_plane_state->rotation != new_plane_state->rotation)
> crtc_state->mode_changed = true;
>
[Severity: High]
This isn't a bug introduced by this patch, but while reviewing
gud_plane_atomic_check(), I noticed an issue with the fallback search for
the connector.
Does connector_state bypass the fallback search here?
for_each_new_connector_in_state(state, connector, connector_state, i) {
if (connector_state->crtc)
break;
}
/*
* DRM_IOCTL_MODE_OBJ_SETPROPERTY on the rotation property will not have
* the connector included in the state.
*/
if (!connector_state) {
struct drm_connector_list_iter conn_iter;
If the loop finishes without finding a matching CRTC, connector_state retains
the pointer to the last evaluated connector rather than evaluating to NULL.
This happens because short-circuit evaluation prevents the macro's assignment
block from running on the final iteration.
Could this cause the driver to extract properties and the connector index from
an unrelated or disconnected connector and send them to the hardware device
during the atomic check phase, leading to hardware misconfiguration?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910014910.8564-1-patches@scd31.com?part=1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/gud: Merge damage clips in full update mode
2026-09-08 6:32 ` Thomas Zimmermann
@ 2026-09-10 1:59 ` Sophie D
0 siblings, 0 replies; 7+ messages in thread
From: Sophie D @ 2026-09-10 1:59 UTC (permalink / raw)
To: Thomas Zimmermann; +Cc: dri-devel, linux-kernel, stable
Hello,
>
> Such state needs to be checked much earlier. Please set
> plane_state->ignore_damage_clips [1] at the end of
> gud_plane_atomic_check [2] if in full-update mode. The damage iterator
> will then do the right thing.
Thank you for reviewing! I've made this change and have tested it on my
hardware.
Sophie
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] drm/gud: Ignore damage clips in full update mode
2026-09-10 1:49 ` [PATCH v2] drm/gud: Ignore " Sophie D
2026-09-10 1:58 ` sashiko-bot
@ 2026-09-10 6:17 ` Thomas Zimmermann
2026-09-12 12:21 ` Ruben Wauters
1 sibling, 1 reply; 7+ messages in thread
From: Thomas Zimmermann @ 2026-09-10 6:17 UTC (permalink / raw)
To: Sophie D, Ruben Wauters
Cc: Maarten Lankhorst, Maxime Ripard, David Airlie, Simona Vetter,
dri-devel, linux-kernel, stable
Am 10.09.26 um 03:49 schrieb Sophie D:
> When running in full update mode, previously small updates (such as
> moving the mouse across the screen) would cause many full frames to be
> generated. This would bog down the bus and lower the effective framerate
> significantly - I was seeing a drop from 60 FPS to 2 FPS.
>
> Set ignore_damage_clips in full update mode so the damage iterator
> yields a single full-plane rectangle instead of one per clip.
>
> Fixes: 73cfd166e045 ("drm/gud: Replace simple display pipe with DRM atomic helpers")
> Cc: <stable@vger.kernel.org> # 6.18.x
> Signed-off-by: Sophie D <patches@scd31.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Thanks for the fix.
> ---
> v2: set ignore_damage_clips in atomic_check instead of merging clips in
> atomic_update (Thomas Zimmermann)
>
> drivers/gpu/drm/gud/gud_pipe.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c
> index 5ef887d84..3388fdc8e 100644
> --- a/drivers/gpu/drm/gud/gud_pipe.c
> +++ b/drivers/gpu/drm/gud/gud_pipe.c
> @@ -482,6 +482,9 @@ int gud_plane_atomic_check(struct drm_plane *plane,
> if (!new_plane_state->visible)
> return 0;
>
> + if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE)
> + new_plane_state->ignore_damage_clips = true;
> +
> if (old_plane_state->rotation != new_plane_state->rotation)
> crtc_state->mode_changed = true;
>
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] drm/gud: Ignore damage clips in full update mode
2026-09-10 6:17 ` Thomas Zimmermann
@ 2026-09-12 12:21 ` Ruben Wauters
0 siblings, 0 replies; 7+ messages in thread
From: Ruben Wauters @ 2026-09-12 12:21 UTC (permalink / raw)
To: Thomas Zimmermann, Sophie D
Cc: Maarten Lankhorst, Maxime Ripard, David Airlie, Simona Vetter,
dri-devel, linux-kernel, stable
[-- Attachment #1: Type: text/plain, Size: 1674 bytes --]
On Thu, 2026-09-10 at 08:17 +0200, Thomas Zimmermann wrote:
>
> Am 10.09.26 um 03:49 schrieb Sophie D:
> > When running in full update mode, previously small updates (such as
> > moving the mouse across the screen) would cause many full frames to be
> > generated. This would bog down the bus and lower the effective framerate
> > significantly - I was seeing a drop from 60 FPS to 2 FPS.
> >
> > Set ignore_damage_clips in full update mode so the damage iterator
> > yields a single full-plane rectangle instead of one per clip.
> >
> > Fixes: 73cfd166e045 ("drm/gud: Replace simple display pipe with DRM atomic helpers")
> > Cc: <stable@vger.kernel.org> # 6.18.x
> > Signed-off-by: Sophie D <patches@scd31.com>
>
> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Ruben Wauters <rubenru09@aol.com>
>
> Thanks for the fix.
>
> > ---
> > v2: set ignore_damage_clips in atomic_check instead of merging clips in
> > atomic_update (Thomas Zimmermann)
> >
> > drivers/gpu/drm/gud/gud_pipe.c | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c
> > index 5ef887d84..3388fdc8e 100644
> > --- a/drivers/gpu/drm/gud/gud_pipe.c
> > +++ b/drivers/gpu/drm/gud/gud_pipe.c
> > @@ -482,6 +482,9 @@ int gud_plane_atomic_check(struct drm_plane *plane,
> > if (!new_plane_state->visible)
> > return 0;
> >
> > + if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE)
> > + new_plane_state->ignore_damage_clips = true;
> > +
> > if (old_plane_state->rotation != new_plane_state->rotation)
> > crtc_state->mode_changed = true;
> >
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 870 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-12 12:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-07 23:08 [PATCH] drm/gud: Merge damage clips in full update mode Sophie D
2026-09-08 6:32 ` Thomas Zimmermann
2026-09-10 1:59 ` Sophie D
2026-09-10 1:49 ` [PATCH v2] drm/gud: Ignore " Sophie D
2026-09-10 1:58 ` sashiko-bot
2026-09-10 6:17 ` Thomas Zimmermann
2026-09-12 12:21 ` Ruben Wauters
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox