Re: [PATCH v3] drm/drv: Convert wedged event string building to seq_buf

"Mallesh, Koujalagi" <[email protected]>
Newsgroups org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
On 28-07-2026 11:26 pm, Jani Nikula wrote:
> On Tue, 28 Jul 2026, Mallesh Koujalagi<[email protected]> wrote:
>> event_string[] has a fixed size of WEDGE_STR_LEN (32) bytes.
>> The original scnprintf()-based loop required a manual pre-flight
>> bounds check.
>>
>> Replace the manual bookkeeping with seq_buf, which tracks overflow
>> internally. seq_buf_printf() writes each "method," token into the
>> buffer, and seq_buf_has_overflowed() detects truncation immediately
>> after the write that caused it — using drm_WARN_ONCE() to report it.
>>
>> On overflow, len retains the position of the last
>> successful write, so the trailing comma is stripped cleanly without
>> including any partial method name in the uevent payload.
>>
>> Fixes: b7cf9f4ac1b8 ("drm: Introduce device wedged event")
>> Signed-off-by: Mallesh Koujalagi<[email protected]>
>> ---
>> v2:
>> - Add proper logic to handle recovery string. (Raag)
>>
>> v3:
>> - Convert manual bounds check to seq_buf. (Jani Nikula)
>> - Use drm_WARN_ONCE() instead of drm_WARN_ON() for overflow. (Raag)
>> ---
>>   drivers/gpu/drm/drm_drv.c | 12 ++++++++++--
>>   1 file changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
>> index e51ed959da89..6a5e3fa1350c 100644
>> --- a/drivers/gpu/drm/drm_drv.c
>> +++ b/drivers/gpu/drm/drm_drv.c
>> @@ -36,6 +36,7 @@
>>   #include <linux/mount.h>
>>   #include <linux/pseudo_fs.h>
>>   #include <linux/sched.h>
>> +#include <linux/seq_buf.h>
>>   #include <linux/slab.h>
>>   #include <linux/sprintf.h>
>>   #include <linux/srcu.h>
>> @@ -578,15 +579,22 @@ int drm_dev_wedged_event(struct drm_device *dev, unsigned long method,
>>   	char *envp[] = { event_string, NULL, NULL, NULL };
>>   	const char *recovery = NULL;
>>   	unsigned int len, opt;
>> +	struct seq_buf buf;
>>   
>> -	len = scnprintf(event_string, sizeof(event_string), "%s", "WEDGED=");
>> +	seq_buf_init(&buf, event_string, sizeof(event_string));
> See DECLARE_SEQ_BUF(). Remove event_string altogether (or make that the
> seq_buf name).
Sure!
>> +	seq_buf_puts(&buf, "WEDGED=");
>> +	len = seq_buf_used(&buf);
> Why do you need to keep len around?

|len is kept as the end of the last complete entry, not as an append 
cursor.
On overflow I use it to roll back to the last known-good comma and 
NUL-terminate there,
avoiding a partially written recovery method in the uevent string.|

>
>>   
>>   	for_each_set_bit(opt, &method, BITS_PER_TYPE(method)) {
>>   		recovery = drm_get_wedge_recovery(opt);
>>   		if (drm_WARN_ONCE(dev, !recovery, "invalid recovery method %u\n", opt))
>>   			break;
>>   
>> -		len += scnprintf(event_string + len, sizeof(event_string) - len, "%s,", recovery);
>> +		seq_buf_printf(&buf, "%s,", recovery);
>> +		if (drm_WARN_ONCE(dev, seq_buf_has_overflowed(&buf),
>> +				  "WEDGED event string truncated\n"))
>> +			break;
> Nah, you can keep printing to seq_buf, and only check at the end once
> instead of looping.

Agreed!, will update next revision.

Thanks,

-/Mallesh

>> +		len = seq_buf_used(&buf);
>>   	}
>>   
>>   	if (recovery)
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.