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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.