[PATCH v8 3/8] drm/panic: Add debugfs entry to test without triggering panic.

Jocelyn Falempe jfalempe at redhat.com
Thu Feb 29 13:56:24 UTC 2024



On 29/02/2024 12:21, Daniel Vetter wrote:
> On Tue, Feb 27, 2024 at 11:04:14AM +0100, Jocelyn Falempe wrote:
>> Add a debugfs file, so you can test drm_panic without freezing
>> your machine. This is unsafe, and should be enabled only for
>> developer or tester.
>>
>> to display the drm_panic screen, just run:
>> echo 1 > /sys/kernel/debug/drm_panic/trigger
>>
>> Signed-off-by: Jocelyn Falempe <jfalempe at redhat.com>
>> ---
>>   drivers/gpu/drm/Kconfig     |  9 +++++++
>>   drivers/gpu/drm/drm_panic.c | 47 +++++++++++++++++++++++++++++++++++++
>>   2 files changed, 56 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
>> index c17d8a8f6877..8dcea29f595c 100644
>> --- a/drivers/gpu/drm/Kconfig
>> +++ b/drivers/gpu/drm/Kconfig
>> @@ -125,6 +125,15 @@ config DRM_PANIC_BACKGROUND_COLOR
>>   	depends on DRM_PANIC
>>   	default 0x000000
>>   
>> +config DRM_PANIC_DEBUG
>> +	bool "Add a debug fs entry to trigger drm_panic"
>> +	depends on DRM_PANIC && DEBUG_FS
>> +	help
>> +	  Add drm_panic/trigger in the kernel debugfs, to force the panic
>> +	  handler to write the panic message to the scanout buffer. This is
>> +	  unsafe and should not be enabled on a production build.
>> +	  If in doubt, say "N".
>> +
>>   config DRM_DEBUG_DP_MST_TOPOLOGY_REFS
>>           bool "Enable refcount backtrace history in the DP MST helpers"
>>   	depends on STACKTRACE_SUPPORT
>> diff --git a/drivers/gpu/drm/drm_panic.c b/drivers/gpu/drm/drm_panic.c
>> index c9f386476ef9..c5d3f725c5f5 100644
>> --- a/drivers/gpu/drm/drm_panic.c
>> +++ b/drivers/gpu/drm/drm_panic.c
>> @@ -398,3 +398,50 @@ void drm_panic_unregister(struct drm_plane *plane)
>>   }
>>   EXPORT_SYMBOL(drm_panic_unregister);
>>   
>> +
>> +/*
>> + * DEBUG, This is currently unsafe.
>> + * Also it will call all panic_notifier, since there is no way to filter and
>> + * only call the drm_panic notifier.
>> + */
>> +#ifdef CONFIG_DRM_PANIC_DEBUG
>> +#include <linux/debugfs.h>
>> +
>> +static struct dentry *debug_dir;
>> +static struct dentry *debug_trigger;
>> +
>> +static ssize_t dbgfs_trigger_write(struct file *file, const char __user *user_buf,
>> +				   size_t count, loff_t *ppos)
>> +{
>> +	bool run;
>> +
>> +	if (kstrtobool_from_user(user_buf, count, &run) == 0 && run)
>> +		atomic_notifier_call_chain(&panic_notifier_list, 0, "Test drm panic from debugfs");
> 
> Since this is just the general panic notifier it feels very misplaced in
> the drm subsystem. I think moving that code into the core panic code makes
> a lot more sense, then we'd also have all the right people on Cc: to
> figure out how we can best recreate the correct calling context (like nmi
> context or whatever) for best case simulation of panic code. John Ogness
> definitely needs to see this and ack, wherever we put it.

I'm not sure it makes sense to test all panic notifiers at once.

So maybe I can write an atomic_notifier_call_chain_with_filter(), and 
filter on the callback address, so it will only call the drm_panic 
handlers ?

-- 

Jocelyn

> -Sima
> 
>> +	return count;
>> +}
>> +
>> +static const struct file_operations dbg_drm_panic_ops = {
>> +	.owner = THIS_MODULE,
>> +	.write = dbgfs_trigger_write,
>> +};
>> +
>> +static int __init debugfs_start(void)
>> +{
>> +	debug_dir = debugfs_create_dir("drm_panic", NULL);
>> +
>> +	if (IS_ERR(debug_dir))
>> +		return PTR_ERR(debug_dir);
>> +	debug_trigger = debugfs_create_file("trigger", 0200, debug_dir,
>> +					    NULL, &dbg_drm_panic_ops);
>> +	return 0;
>> +}
>> +
>> +static void __exit debugfs_end(void)
>> +{
>> +	debugfs_remove_recursive(debug_dir);
>> +}
>> +
>> +module_init(debugfs_start);
>> +module_exit(debugfs_end);
>> +
>> +#endif
>> -- 
>> 2.43.0
>>
> 



More information about the dri-devel mailing list