Am 18.08.26 um 15:09 schrieb [email protected]:
Thank you for your contribution! Sashiko AI review found 1 potential issue(s)
to consider:
Pre-existing issues:
- [High] Concurrent debugfs writes or KUnit tests across multiple DRM devices
race on global static buffers without adequate synchronization.
A fix would be nice, but is beyond this series. As it affects debugfs
and kunit test there's no urgency.
--
--- Patch [6]: [PATCH 06/12] drm/panic: Pass global module parameters to
drm_panic_dispatch() ---
commit 9f2a1b5158feac614c09a17c83f387591642e034
Author: Thomas Zimmermann <[email protected]>
drm/panic: Pass global module parameters to drm_panic_dispatch()
This patch sets the panic type and QR version in draw_panic_plane() as a single
point of truth, passing these values into the individual drawing functions.
In the test case, it always creates a QR code with version 40.
diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c
index ede620b27515a..12c39217cbcb5 100644
--- a/drivers/gpu/drm/drm_panic.c
+++ b/drivers/gpu/drm/drm_panic.c
[ ... ]
@@ -951,6 +955,11 @@ static void draw_panic_plane(struct drm_plane *plane,
const char *description)
#else
u32 bg_color = 0x00000000;
#endif
+#if IS_ENABLED(CONFIG_DRM_PANIC_SCREEN_QR_CODE)
+ unsigned int qr_version = panic_qr_version;
+#else
+ unsigned int qr_version = 0;
+#endif
if (!drm_panic_trylock(plane->dev, flags))
return;
@@ -966,7 +975,7 @@ static void draw_panic_plane(struct drm_plane *plane, const
char *description)
drm_panic_set_description(description);
- ret = draw_panic_dispatch(&sb, fg_color, bg_color);
+ ret = draw_panic_dispatch(&sb, drm_panic_type, fg_color, bg_color,
qr_version);
[Severity: High]
This is a pre-existing issue, but does the per-device locking in
drm_panic_trylock() adequately protect the global buffers?
Since the lock is per-device (plane->dev->mode_config.panic_lock), concurrent
debugfs writes across multiple DRM devices can still race and mutate global
static variables, such as the zlib stream workspace (struct z_stream_s stream)
or qrbuf1 and qrbuf2.
If a real kernel panic occurs while a debugfs write is concurrently using these
buffers, the true panic handler could inherit a corrupted zlib workspace state,
which might lead to a recursive fault and failure to display the panic screen.
Could this be protected by a global lock for non-panic paths?
[ ... ]
diff --git a/drivers/gpu/drm/tests/drm_panic_test.c
b/drivers/gpu/drm/tests/drm_panic_test.c
index 969a096ec840f..196496238d231 100644
--- a/drivers/gpu/drm/tests/drm_panic_test.c
+++ b/drivers/gpu/drm/tests/drm_panic_test.c
@@ -58,7 +58,7 @@ static int draw_panic_screen_kmsg_default(struct
drm_scanout_buffer *sb)
#if IS_ENABLED(CONFIG_DRM_PANIC_SCREEN_QR_CODE)
static int draw_panic_screen_qr_code_default(struct drm_scanout_buffer *sb)
{
- return draw_panic_screen_qr_code(sb, 0x00ffffff, 0x00000000);
+ return draw_panic_screen_qr_code(sb, 0x00ffffff, 0x00000000, 40);
}
#endif
[Severity: High]
This isn't a bug introduced by this patch, but do the KUnit tests safely access
the global drawing state?
It appears the KUnit tests bypass draw_panic_plane() entirely and directly call
drawing functions like draw_panic_screen_qr_code() without acquiring any locks.
Could running the tests race on the global buffers and corrupt the zlib
workspace?
--
--
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)