Re: [PATCH 06/12] drm/panic: Pass global module parameters to drm_panic_dispatch()
Thomas Zimmermann <[email protected]>
| Newsgroups | org.kernel.vger.linux-hyperv,dev.linux.lists.imx,dev.linux.lists.sashiko-reviews,org.freedesktop.lists.dri-devel,org.freedesktop.lists.intel-gfx,org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
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)