Hi Thomas,
On Tue, 18 Aug 2026 at 15:00, Thomas Zimmermann <[email protected]> wrote:
> Declare qrbuf1 and qrbuf2 as static arrays so that the module loader
> allocates them for us. Avoids the kmalloc later on. Also allows for
> using sizeof() to get the number of bytes in each array. Access the
> arrays once with memset, so that the physical pages are available on
> a panic.
>
> Signed-off-by: Thomas Zimmermann <[email protected]>
Thanks for your patch!
> --- a/drivers/gpu/drm/drm_panic.c
> +++ b/drivers/gpu/drm/drm_panic.c
> @@ -628,24 +628,23 @@ MODULE_PARM_DESC(panic_qr_version, "maximum version
> (size) of the QR code");
> #define WINDOW_BITS 12
> #define MEM_LEVEL 4
>
> -static char *qrbuf1;
> -static char *qrbuf2;
> +static u8 qrbuf1[QR_BUFFER1_SIZE];
> +static u8 qrbuf2[QR_BUFFER2_SIZE];
I am not a big fan of increasing kernel size like this.
You may run (faster) into boot loader limitations.
> static struct z_stream_s stream;
>
> static void __init drm_panic_qr_init(void)
> {
> - qrbuf1 = kmalloc(QR_BUFFER1_SIZE, GFP_KERNEL);
> - qrbuf2 = kmalloc(QR_BUFFER2_SIZE, GFP_KERNEL);
> + /* best-effort allocation; can be NULL */
> stream.workspace = kmalloc(zlib_deflate_workspacesize(WINDOW_BITS,
> MEM_LEVEL),
> GFP_KERNEL);
<ironic>Why not use a static array for this, too?</ironic>
> +
> + /* touch memory so that pages are there in the case of a panic */
> + memset(qrbuf1, 0, sizeof(qrbuf1));
> + memset(qrbuf2, 0, sizeof(qrbuf2));
Please clarify "there"?
In cache? Not all systems have sufficient data cache, so it may be
evicted at any time.
In RAM? AFAIK kernel and module memory is not demand-paged.
In TLB? Like cache, it may be evicted at any time.
So IMHO this is futile.
> }
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds