* [PATCH 0/3] drm/client: Wire up sysrq for all clients and update drm_log
@ 2025-11-07 14:19 Thomas Zimmermann
2025-11-07 14:19 ` [PATCH 1/3] drm/client: Pass force parameter to client restore Thomas Zimmermann
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-07 14:19 UTC (permalink / raw)
To: jfalempe, javierm, simona, airlied, mripard, maarten.lankhorst,
gregkh, jirislaby
Cc: dri-devel, linux-kernel, linux-serial, Thomas Zimmermann
DRM's fbdev emulation has long supported SysRq+v to bring up the
framebuffer console for emergency output. Wire up sysrq for all
DRM clients and make it work with drm_log.
Patch 1 and 2 set up DRM client functionality for sysrq. The patches
adopt existing conventions from fbdev emulation, so that there's no
visible change to users. Invoke SysRq+v to bring up the in-kernel DRM
client.
Patch 3 adds restore functionality to drm_log. This enables SysRq, but
also brings back drm_log when the user-space releases control of the
display.
Tested on amdgpu and bochs.
Thomas Zimmermann (3):
drm/client: Pass force parameter to client restore
drm/client: Support emergency restore via sysrq for all clients
drm/client: log: Implement struct drm_client_funcs.restore
drivers/gpu/drm/Makefile | 3 +-
drivers/gpu/drm/clients/drm_fbdev_client.c | 6 +-
drivers/gpu/drm/clients/drm_log.c | 13 ++++
drivers/gpu/drm/drm_client.c | 1 +
drivers/gpu/drm/drm_client_event.c | 4 +-
drivers/gpu/drm/drm_client_sysrq.c | 65 ++++++++++++++++++++
drivers/gpu/drm/drm_drv.c | 3 +
drivers/gpu/drm/drm_fb_helper.c | 69 +++-------------------
drivers/gpu/drm/drm_file.c | 2 +-
drivers/gpu/drm/drm_internal.h | 11 ++++
include/drm/drm_client.h | 8 ++-
include/drm/drm_client_event.h | 4 +-
include/drm/drm_device.h | 8 +++
include/drm/drm_fb_helper.h | 8 +--
14 files changed, 126 insertions(+), 79 deletions(-)
create mode 100644 drivers/gpu/drm/drm_client_sysrq.c
--
2.51.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/3] drm/client: Pass force parameter to client restore
2025-11-07 14:19 [PATCH 0/3] drm/client: Wire up sysrq for all clients and update drm_log Thomas Zimmermann
@ 2025-11-07 14:19 ` Thomas Zimmermann
2025-11-10 14:02 ` Jocelyn Falempe
2025-11-07 14:19 ` [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients Thomas Zimmermann
2025-11-07 14:19 ` [PATCH 3/3] drm/client: log: Implement struct drm_client_funcs.restore Thomas Zimmermann
2 siblings, 1 reply; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-07 14:19 UTC (permalink / raw)
To: jfalempe, javierm, simona, airlied, mripard, maarten.lankhorst,
gregkh, jirislaby
Cc: dri-devel, linux-kernel, linux-serial, Thomas Zimmermann
Add force parameter to client restore and pass value through the
layers. The only currently used value is false.
If force is true, the client should restore its display even if it
does not hold the DRM master lock. This is be required for emergency
output, such as sysrq.
While at it, inline drm_fb_helper_lastclose(), which is a trivial
wrapper around drm_fb_helper_restore_fbdev_mode_unlocked().
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/clients/drm_fbdev_client.c | 6 ++++--
drivers/gpu/drm/drm_client_event.c | 4 ++--
drivers/gpu/drm/drm_fb_helper.c | 24 ++++++----------------
drivers/gpu/drm/drm_file.c | 2 +-
include/drm/drm_client.h | 8 +++++---
include/drm/drm_client_event.h | 4 ++--
include/drm/drm_fb_helper.h | 8 ++------
7 files changed, 22 insertions(+), 34 deletions(-)
diff --git a/drivers/gpu/drm/clients/drm_fbdev_client.c b/drivers/gpu/drm/clients/drm_fbdev_client.c
index 47e5f27eee58..28951e392482 100644
--- a/drivers/gpu/drm/clients/drm_fbdev_client.c
+++ b/drivers/gpu/drm/clients/drm_fbdev_client.c
@@ -38,9 +38,11 @@ static void drm_fbdev_client_unregister(struct drm_client_dev *client)
}
}
-static int drm_fbdev_client_restore(struct drm_client_dev *client)
+static int drm_fbdev_client_restore(struct drm_client_dev *client, bool force)
{
- drm_fb_helper_lastclose(client->dev);
+ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+ drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);
return 0;
}
diff --git a/drivers/gpu/drm/drm_client_event.c b/drivers/gpu/drm/drm_client_event.c
index d25dc5250983..7b3e362f7926 100644
--- a/drivers/gpu/drm/drm_client_event.c
+++ b/drivers/gpu/drm/drm_client_event.c
@@ -102,7 +102,7 @@ void drm_client_dev_hotplug(struct drm_device *dev)
}
EXPORT_SYMBOL(drm_client_dev_hotplug);
-void drm_client_dev_restore(struct drm_device *dev)
+void drm_client_dev_restore(struct drm_device *dev, bool force)
{
struct drm_client_dev *client;
int ret;
@@ -115,7 +115,7 @@ void drm_client_dev_restore(struct drm_device *dev)
if (!client->funcs || !client->funcs->restore)
continue;
- ret = client->funcs->restore(client);
+ ret = client->funcs->restore(client, force);
drm_dbg_kms(dev, "%s: ret=%d\n", client->name, ret);
if (!ret) /* The first one to return zero gets the privilege to restore */
break;
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 53e9dc0543de..1392738ce2fe 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -255,6 +255,7 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
/**
* drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
* @fb_helper: driver-allocated fbdev helper, can be NULL
+ * @force: ignore present DRM master
*
* This helper should be called from fbdev emulation's &drm_client_funcs.restore
* callback. It ensures that the user isn't greeted with a black screen when the
@@ -263,9 +264,9 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
* Returns:
* 0 on success, or a negative errno code otherwise.
*/
-int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
+int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper, bool force)
{
- return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, false);
+ return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);
}
EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);
@@ -1328,9 +1329,9 @@ int drm_fb_helper_set_par(struct fb_info *info)
* the KDSET IOCTL with KD_TEXT, and only after that drops the master
* status when exiting.
*
- * In the past this was caught by drm_fb_helper_lastclose(), but on
- * modern systems where logind always keeps a drm fd open to orchestrate
- * the vt switching, this doesn't work.
+ * In the past this was caught by drm_fb_helper_restore_fbdev_mode_unlocked(),
+ * but on modern systems where logind always keeps a drm fd open to
+ * orchestrate the vt switching, this doesn't work.
*
* To not break the userspace ABI we have this special case here, which
* is only used for the above case. Everything else uses the normal
@@ -1955,16 +1956,3 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
return 0;
}
EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
-
-/**
- * drm_fb_helper_lastclose - DRM driver lastclose helper for fbdev emulation
- * @dev: DRM device
- *
- * This function is obsolete. Call drm_fb_helper_restore_fbdev_mode_unlocked()
- * instead.
- */
-void drm_fb_helper_lastclose(struct drm_device *dev)
-{
- drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper);
-}
-EXPORT_SYMBOL(drm_fb_helper_lastclose);
diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
index eebd1a05ee97..be5e617ceb9f 100644
--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -405,7 +405,7 @@ EXPORT_SYMBOL(drm_open);
static void drm_lastclose(struct drm_device *dev)
{
- drm_client_dev_restore(dev);
+ drm_client_dev_restore(dev, false);
if (dev_is_pci(dev->dev))
vga_switcheroo_process_delayed_switch();
diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
index 5ecde0f6f591..c972a8a3385b 100644
--- a/include/drm/drm_client.h
+++ b/include/drm/drm_client.h
@@ -57,12 +57,14 @@ struct drm_client_funcs {
*
* Note that the core does not guarantee exclusion against concurrent
* drm_open(). Clients need to ensure this themselves, for example by
- * using drm_master_internal_acquire() and
- * drm_master_internal_release().
+ * using drm_master_internal_acquire() and drm_master_internal_release().
+ *
+ * If the caller passes force, the client should ignore any present DRM
+ * master and restore the display anyway.
*
* This callback is optional.
*/
- int (*restore)(struct drm_client_dev *client);
+ int (*restore)(struct drm_client_dev *client, bool force);
/**
* @hotplug:
diff --git a/include/drm/drm_client_event.h b/include/drm/drm_client_event.h
index 985d6f02a4c4..79369c755bc9 100644
--- a/include/drm/drm_client_event.h
+++ b/include/drm/drm_client_event.h
@@ -10,7 +10,7 @@ struct drm_device;
#if defined(CONFIG_DRM_CLIENT)
void drm_client_dev_unregister(struct drm_device *dev);
void drm_client_dev_hotplug(struct drm_device *dev);
-void drm_client_dev_restore(struct drm_device *dev);
+void drm_client_dev_restore(struct drm_device *dev, bool force);
void drm_client_dev_suspend(struct drm_device *dev);
void drm_client_dev_resume(struct drm_device *dev);
#else
@@ -18,7 +18,7 @@ static inline void drm_client_dev_unregister(struct drm_device *dev)
{ }
static inline void drm_client_dev_hotplug(struct drm_device *dev)
{ }
-static inline void drm_client_dev_restore(struct drm_device *dev)
+static inline void drm_client_dev_restore(struct drm_device *dev, bool force)
{ }
static inline void drm_client_dev_suspend(struct drm_device *dev)
{ }
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
index c1d38d54a112..63e3af8dd5ed 100644
--- a/include/drm/drm_fb_helper.h
+++ b/include/drm/drm_fb_helper.h
@@ -254,7 +254,8 @@ int drm_fb_helper_set_par(struct fb_info *info);
int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
struct fb_info *info);
-int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
+int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
+ bool force);
struct fb_info *drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper);
void drm_fb_helper_release_info(struct drm_fb_helper *fb_helper);
@@ -283,7 +284,6 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper);
int drm_fb_helper_debug_enter(struct fb_info *info);
int drm_fb_helper_debug_leave(struct fb_info *info);
-void drm_fb_helper_lastclose(struct drm_device *dev);
#else
static inline void drm_fb_helper_prepare(struct drm_device *dev,
struct drm_fb_helper *helper,
@@ -409,10 +409,6 @@ static inline int drm_fb_helper_debug_leave(struct fb_info *info)
{
return 0;
}
-
-static inline void drm_fb_helper_lastclose(struct drm_device *dev)
-{
-}
#endif
#endif
--
2.51.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
2025-11-07 14:19 [PATCH 0/3] drm/client: Wire up sysrq for all clients and update drm_log Thomas Zimmermann
2025-11-07 14:19 ` [PATCH 1/3] drm/client: Pass force parameter to client restore Thomas Zimmermann
@ 2025-11-07 14:19 ` Thomas Zimmermann
2025-11-10 11:29 ` kernel test robot
` (2 more replies)
2025-11-07 14:19 ` [PATCH 3/3] drm/client: log: Implement struct drm_client_funcs.restore Thomas Zimmermann
2 siblings, 3 replies; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-07 14:19 UTC (permalink / raw)
To: jfalempe, javierm, simona, airlied, mripard, maarten.lankhorst,
gregkh, jirislaby
Cc: dri-devel, linux-kernel, linux-serial, Thomas Zimmermann
Move the sysrq functionality from DRM fb-helpers to the DRM device
and in-kernel clients, so that all it becomes available on all clients.
DRM fbdev helpers support emergency restoration of the console output
via a special key combination. Press SysRq+v to replace the current
compositor with the kernel's output on the text-mode console. This
allows users to see the log messages during system emergencies.
By moving the functionality from fb-helper to DRM devices, any
in-kernel client can serve as emergency output. This can be used to
bring up drm_log, for example.
Each DRM device registers itself to the list possible sysrq handlers.
On receiving SysRq+v, the DRM core goes over all registered devices and
restores an in-kernel DRM client for each of them.
See Documentation/admin-guide/sysrq.rst on how to invoke SysRq. Switch
VTs to bring back the user-space compositor.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/Makefile | 3 +-
drivers/gpu/drm/drm_client.c | 1 +
drivers/gpu/drm/drm_client_sysrq.c | 65 ++++++++++++++++++++++++++++++
drivers/gpu/drm/drm_drv.c | 3 ++
drivers/gpu/drm/drm_fb_helper.c | 45 +--------------------
drivers/gpu/drm/drm_internal.h | 11 +++++
include/drm/drm_device.h | 8 ++++
7 files changed, 91 insertions(+), 45 deletions(-)
create mode 100644 drivers/gpu/drm/drm_client_sysrq.c
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index c2672f369aed..9901534948e5 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -76,7 +76,8 @@ drm-y := \
drm-$(CONFIG_DRM_CLIENT) += \
drm_client.o \
drm_client_event.o \
- drm_client_modeset.o
+ drm_client_modeset.o \
+ drm_client_sysrq.o
drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o
drm-$(CONFIG_COMPAT) += drm_ioc32.o
drm-$(CONFIG_DRM_PANEL) += drm_panel.o
diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c
index 504ec5bdfa2c..a82d741e6630 100644
--- a/drivers/gpu/drm/drm_client.c
+++ b/drivers/gpu/drm/drm_client.c
@@ -11,6 +11,7 @@
#include <linux/slab.h>
#include <drm/drm_client.h>
+#include <drm/drm_client_event.h>
#include <drm/drm_device.h>
#include <drm/drm_drv.h>
#include <drm/drm_file.h>
diff --git a/drivers/gpu/drm/drm_client_sysrq.c b/drivers/gpu/drm/drm_client_sysrq.c
new file mode 100644
index 000000000000..eea660096f1b
--- /dev/null
+++ b/drivers/gpu/drm/drm_client_sysrq.c
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+
+#include <linux/sysrq.h>
+
+#include <drm/drm_client_event.h>
+#include <drm/drm_device.h>
+#include <drm/drm_print.h>
+
+#include "drm_internal.h"
+
+#ifdef CONFIG_MAGIC_SYSRQ
+static LIST_HEAD(drm_client_sysrq_dev_list);
+static DEFINE_MUTEX(drm_client_sysrq_dev_lock);
+
+/* emergency restore, don't bother with error reporting */
+static void drm_client_sysrq_restore_work_fn(struct work_struct *ignored)
+{
+ struct drm_device *dev;
+
+ guard(mutex)(&drm_client_sysrq_dev_lock);
+
+ list_for_each_entry(dev, &drm_client_sysrq_dev_list, client_sysrq_list) {
+ if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
+ continue;
+
+ drm_client_dev_restore(dev, true);
+ }
+}
+
+static DECLARE_WORK(drm_client_sysrq_restore_work, drm_client_sysrq_restore_work_fn);
+
+static void drm_client_sysrq_restore_handler(u8 ignored)
+{
+ schedule_work(&drm_client_sysrq_restore_work);
+}
+
+static const struct sysrq_key_op drm_client_sysrq_restore_op = {
+ .handler = drm_client_sysrq_restore_handler,
+ .help_msg = "force-fb(v)",
+ .action_msg = "Restore framebuffer console",
+};
+
+void drm_client_sysrq_register(struct drm_device *dev)
+{
+ guard(mutex)(&drm_client_sysrq_dev_lock);
+
+ if (list_empty(&drm_client_sysrq_dev_list))
+ register_sysrq_key('v', &drm_client_sysrq_restore_op);
+
+ list_add(&dev->client_sysrq_list, &drm_client_sysrq_dev_list);
+}
+
+void drm_client_sysrq_unregister(struct drm_device *dev)
+{
+ guard(mutex)(&drm_client_sysrq_dev_lock);
+
+ /* remove device from global restore list */
+ if (!drm_WARN_ON(dev, list_empty(&dev->client_sysrq_list)))
+ list_del(&dev->client_sysrq_list);
+
+ /* no devices left; unregister key */
+ if (list_empty(&drm_client_sysrq_dev_list))
+ unregister_sysrq_key('v', &drm_client_sysrq_restore_op);
+}
+#endif
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 8e3cb08241c8..2915118436ce 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -733,6 +733,7 @@ static int drm_dev_init(struct drm_device *dev,
INIT_LIST_HEAD(&dev->filelist);
INIT_LIST_HEAD(&dev->filelist_internal);
INIT_LIST_HEAD(&dev->clientlist);
+ INIT_LIST_HEAD(&dev->client_sysrq_list);
INIT_LIST_HEAD(&dev->vblank_event_list);
spin_lock_init(&dev->event_lock);
@@ -1100,6 +1101,7 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
goto err_unload;
}
drm_panic_register(dev);
+ drm_client_sysrq_register(dev);
DRM_INFO("Initialized %s %d.%d.%d for %s on minor %d\n",
driver->name, driver->major, driver->minor,
@@ -1144,6 +1146,7 @@ void drm_dev_unregister(struct drm_device *dev)
{
dev->registered = false;
+ drm_client_sysrq_unregister(dev);
drm_panic_unregister(dev);
drm_client_dev_unregister(dev);
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 1392738ce2fe..9a734017756b 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -32,7 +32,6 @@
#include <linux/console.h>
#include <linux/export.h>
#include <linux/pci.h>
-#include <linux/sysrq.h>
#include <linux/vga_switcheroo.h>
#include <drm/drm_atomic.h>
@@ -270,42 +269,6 @@ int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper, b
}
EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);
-#ifdef CONFIG_MAGIC_SYSRQ
-/* emergency restore, don't bother with error reporting */
-static void drm_fb_helper_restore_work_fn(struct work_struct *ignored)
-{
- struct drm_fb_helper *helper;
-
- mutex_lock(&kernel_fb_helper_lock);
- list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
- struct drm_device *dev = helper->dev;
-
- if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
- continue;
-
- mutex_lock(&helper->lock);
- drm_client_modeset_commit_locked(&helper->client);
- mutex_unlock(&helper->lock);
- }
- mutex_unlock(&kernel_fb_helper_lock);
-}
-
-static DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn);
-
-static void drm_fb_helper_sysrq(u8 dummy1)
-{
- schedule_work(&drm_fb_helper_restore_work);
-}
-
-static const struct sysrq_key_op sysrq_drm_fb_helper_restore_op = {
- .handler = drm_fb_helper_sysrq,
- .help_msg = "force-fb(v)",
- .action_msg = "Restore framebuffer console",
-};
-#else
-static const struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { };
-#endif
-
static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
{
struct drm_fb_helper *fb_helper = info->par;
@@ -602,11 +565,8 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
drm_fb_helper_release_info(fb_helper);
mutex_lock(&kernel_fb_helper_lock);
- if (!list_empty(&fb_helper->kernel_fb_list)) {
+ if (!list_empty(&fb_helper->kernel_fb_list))
list_del(&fb_helper->kernel_fb_list);
- if (list_empty(&kernel_fb_helper_list))
- unregister_sysrq_key('v', &sysrq_drm_fb_helper_restore_op);
- }
mutex_unlock(&kernel_fb_helper_lock);
if (!fb_helper->client.funcs)
@@ -1840,9 +1800,6 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper)
info->node, info->fix.id);
mutex_lock(&kernel_fb_helper_lock);
- if (list_empty(&kernel_fb_helper_list))
- register_sysrq_key('v', &sysrq_drm_fb_helper_restore_op);
-
list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list);
mutex_unlock(&kernel_fb_helper_lock);
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index 5a3bed48ab1f..59cbac12a6d6 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -56,6 +56,17 @@ static inline void drm_client_debugfs_init(struct drm_device *dev)
{ }
#endif
+/* drm_client_sysrq.c */
+#if defined(CONFIG_DRM_CLIENT) && defined(CONFIG_MAGIC_SYSRQ)
+void drm_client_sysrq_register(struct drm_device *dev);
+void drm_client_sysrq_unregister(struct drm_device *dev);
+#else
+void drm_client_sysrq_register(struct drm_device *dev)
+{ }
+void drm_client_sysrq_unregister(struct drm_device *dev)
+{ }
+#endif
+
/* drm_file.c */
extern struct mutex drm_global_mutex;
bool drm_dev_needs_global_mutex(struct drm_device *dev);
diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h
index 778b2cca6c49..5af49c5c3778 100644
--- a/include/drm/drm_device.h
+++ b/include/drm/drm_device.h
@@ -238,6 +238,14 @@ struct drm_device {
*/
struct list_head clientlist;
+ /**
+ * @client_sysrq_list:
+ *
+ * Entry into list of devices registered for sysrq. Allows in-kernel
+ * clients on this device to handle sysrq keys.
+ */
+ struct list_head client_sysrq_list;
+
/**
* @vblank_disable_immediate:
*
--
2.51.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] drm/client: log: Implement struct drm_client_funcs.restore
2025-11-07 14:19 [PATCH 0/3] drm/client: Wire up sysrq for all clients and update drm_log Thomas Zimmermann
2025-11-07 14:19 ` [PATCH 1/3] drm/client: Pass force parameter to client restore Thomas Zimmermann
2025-11-07 14:19 ` [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients Thomas Zimmermann
@ 2025-11-07 14:19 ` Thomas Zimmermann
2025-11-10 14:05 ` Jocelyn Falempe
2 siblings, 1 reply; 9+ messages in thread
From: Thomas Zimmermann @ 2025-11-07 14:19 UTC (permalink / raw)
To: jfalempe, javierm, simona, airlied, mripard, maarten.lankhorst,
gregkh, jirislaby
Cc: dri-devel, linux-kernel, linux-serial, Thomas Zimmermann
Restore the log client's output when the DRM core invokes the restore
callback. Follow the existing behavior of fbdev emulation wrt. the
value of the force parameter.
If force is false, acquire the DRM master lock and reprogram the
display. This is the case when the user-space compositor exists and
the DRM core transfers the display back to the in-kernel client. This
also enables log output during reboots.
If force is true, reprogram without considering the master lock. This
overrides the current compositor and prints the log to the screen. In
case of system malfunction, users can enter SysRq+v to invoke the
emergency error reporting. See Documentation/admin-guide/sysrq.rst for
more information.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/clients/drm_log.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
index 19e55aa0ed74..4d3005273b27 100644
--- a/drivers/gpu/drm/clients/drm_log.c
+++ b/drivers/gpu/drm/clients/drm_log.c
@@ -315,6 +315,18 @@ static void drm_log_client_unregister(struct drm_client_dev *client)
drm_client_release(client);
}
+static int drm_log_client_restore(struct drm_client_dev *client, bool force)
+{
+ int ret;
+
+ if (force)
+ ret = drm_client_modeset_commit_locked(client);
+ else
+ ret = drm_client_modeset_commit(client);
+
+ return ret;
+}
+
static int drm_log_client_hotplug(struct drm_client_dev *client)
{
struct drm_log *dlog = client_to_drm_log(client);
@@ -348,6 +360,7 @@ static const struct drm_client_funcs drm_log_client_funcs = {
.owner = THIS_MODULE,
.free = drm_log_client_free,
.unregister = drm_log_client_unregister,
+ .restore = drm_log_client_restore,
.hotplug = drm_log_client_hotplug,
.suspend = drm_log_client_suspend,
.resume = drm_log_client_resume,
--
2.51.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
2025-11-07 14:19 ` [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients Thomas Zimmermann
@ 2025-11-10 11:29 ` kernel test robot
2025-11-10 12:12 ` kernel test robot
2025-11-10 13:47 ` kernel test robot
2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2025-11-10 11:29 UTC (permalink / raw)
To: Thomas Zimmermann, jfalempe, javierm, simona, airlied, mripard,
maarten.lankhorst, gregkh, jirislaby
Cc: oe-kbuild-all, dri-devel, linux-kernel, linux-serial,
Thomas Zimmermann
Hi Thomas,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20251107]
[cannot apply to drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-misc/drm-misc-next drm-tip/drm-tip linus/master v6.18-rc4 v6.18-rc3 v6.18-rc2 v6.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-client-Pass-force-parameter-to-client-restore/20251107-223026
base: next-20251107
patch link: https://lore.kernel.org/r/20251107142612.467817-3-tzimmermann%40suse.de
patch subject: [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
config: parisc-randconfig-002-20251110 (https://download.01.org/0day-ci/archive/20251110/202511101914.Rt1WtmfO-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 14.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251110/202511101914.Rt1WtmfO-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511101914.Rt1WtmfO-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
In file included from drivers/gpu/drm/drm_dumb_buffers.c:35:
>> drivers/gpu/drm/drm_internal.h:64:6: warning: no previous prototype for 'drm_client_sysrq_register' [-Wmissing-prototypes]
64 | void drm_client_sysrq_register(struct drm_device *dev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/drm_internal.h:66:6: warning: no previous prototype for 'drm_client_sysrq_unregister' [-Wmissing-prototypes]
66 | void drm_client_sysrq_unregister(struct drm_device *dev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
--
In file included from drivers/gpu/drm/clients/drm_log.c:22:
>> drivers/gpu/drm/clients/../drm_internal.h:64:6: warning: no previous prototype for 'drm_client_sysrq_register' [-Wmissing-prototypes]
64 | void drm_client_sysrq_register(struct drm_device *dev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/clients/../drm_internal.h:66:6: warning: no previous prototype for 'drm_client_sysrq_unregister' [-Wmissing-prototypes]
66 | void drm_client_sysrq_unregister(struct drm_device *dev)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
--
hppa-linux-ld: drivers/gpu/drm/drm_auth.o: in function `drm_client_sysrq_register':
>> (.text+0x45c): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_auth.o: in function `drm_client_sysrq_unregister':
>> (.text+0x460): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_connector.o: in function `drm_client_sysrq_register':
(.text+0x1e90): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_connector.o: in function `drm_client_sysrq_unregister':
(.text+0x1e94): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_crtc.o: in function `drm_client_sysrq_register':
(.text+0xab8): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_crtc.o: in function `drm_client_sysrq_unregister':
(.text+0xabc): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_drv.o: in function `drm_client_sysrq_register':
(.text+0x14f4): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_drv.o: in function `drm_client_sysrq_unregister':
(.text+0x14f8): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_dumb_buffers.o: in function `drm_client_sysrq_register':
(.text+0x20c): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_dumb_buffers.o: in function `drm_client_sysrq_unregister':
(.text+0x210): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_edid.o: in function `drm_client_sysrq_register':
(.text+0x734c): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_edid.o: in function `drm_client_sysrq_unregister':
(.text+0x7350): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_encoder.o: in function `drm_client_sysrq_register':
(.text+0x444): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_encoder.o: in function `drm_client_sysrq_unregister':
(.text+0x448): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_file.o: in function `drm_client_sysrq_register':
(.text+0xf10): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_file.o: in function `drm_client_sysrq_unregister':
(.text+0xf14): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_framebuffer.o: in function `drm_client_sysrq_register':
(.text+0x1028): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_framebuffer.o: in function `drm_client_sysrq_unregister':
(.text+0x102c): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_gem.o: in function `drm_client_sysrq_register':
(.text+0x1738): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_gem.o: in function `drm_client_sysrq_unregister':
(.text+0x173c): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_ioctl.o: in function `drm_client_sysrq_register':
(.text+0xe10): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_ioctl.o: in function `drm_client_sysrq_unregister':
(.text+0xe14): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_lease.o: in function `drm_client_sysrq_register':
(.text+0x7a0): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_lease.o: in function `drm_client_sysrq_unregister':
(.text+0x7a4): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_managed.o: in function `drm_client_sysrq_register':
(.text+0x6b8): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_managed.o: in function `drm_client_sysrq_unregister':
(.text+0x6bc): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_mode_config.o: in function `drm_client_sysrq_register':
(.text+0xc34): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_mode_config.o: in function `drm_client_sysrq_unregister':
(.text+0xc38): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_prime.o: in function `drm_client_sysrq_register':
(.text+0xb74): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_prime.o: in function `drm_client_sysrq_unregister':
(.text+0xb78): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_syncobj.o: in function `drm_client_sysrq_register':
(.text+0x174c): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_syncobj.o: in function `drm_client_sysrq_unregister':
(.text+0x1750): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_sysfs.o: in function `drm_client_sysrq_register':
(.text+0x758): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_sysfs.o: in function `drm_client_sysrq_unregister':
(.text+0x75c): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_vblank.o: in function `drm_client_sysrq_register':
(.text+0x2458): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_vblank.o: in function `drm_client_sysrq_unregister':
(.text+0x245c): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_vblank_work.o: in function `drm_client_sysrq_register':
(.text+0x594): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_vblank_work.o: in function `drm_client_sysrq_unregister':
(.text+0x598): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_sysrq_register':
(.text+0x830): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client.o: in function `drm_client_sysrq_unregister':
(.text+0x834): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client_event.o: in function `drm_client_sysrq_register':
(.text+0x544): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client_event.o: in function `drm_client_sysrq_unregister':
(.text+0x548): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client_modeset.o: in function `drm_client_sysrq_register':
(.text+0x2d90): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client_modeset.o: in function `drm_client_sysrq_unregister':
(.text+0x2d94): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client_sysrq.o: in function `drm_client_sysrq_register':
(.text+0x0): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_client_sysrq.o: in function `drm_client_sysrq_unregister':
(.text+0x4): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_debugfs.o: in function `drm_client_sysrq_register':
(.text+0x1048): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_debugfs.o: in function `drm_client_sysrq_unregister':
(.text+0x104c): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_debugfs_crc.o: in function `drm_client_sysrq_register':
(.text+0x9c0): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_debugfs_crc.o: in function `drm_client_sysrq_unregister':
(.text+0x9c4): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_gem_atomic_helper.o: in function `drm_client_sysrq_register':
(.text+0x5c8): multiple definition of `drm_client_sysrq_register'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e18): first defined here
hppa-linux-ld: drivers/gpu/drm/drm_gem_atomic_helper.o: in function `drm_client_sysrq_unregister':
(.text+0x5cc): multiple definition of `drm_client_sysrq_unregister'; drivers/gpu/drm/drm_atomic.o:(.text+0x2e1c): first defined here
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for OF_GPIO
Depends on [n]: GPIOLIB [=y] && OF [=n] && HAS_IOMEM [=y]
Selected by [y]:
- GPIO_TB10X [=y] && GPIOLIB [=y] && HAS_IOMEM [=y] && (ARC_PLAT_TB10X || COMPILE_TEST [=y])
WARNING: unmet direct dependencies detected for MFD_STMFX
Depends on [n]: HAS_IOMEM [=y] && I2C [=y] && OF [=n]
Selected by [y]:
- PINCTRL_STMFX [=y] && PINCTRL [=y] && I2C [=y] && OF_GPIO [=y] && HAS_IOMEM [=y]
WARNING: unmet direct dependencies detected for I2C_K1
Depends on [n]: I2C [=y] && HAS_IOMEM [=y] && (ARCH_SPACEMIT || COMPILE_TEST [=y]) && OF [=n]
Selected by [y]:
- MFD_SPACEMIT_P1 [=y] && HAS_IOMEM [=y] && (ARCH_SPACEMIT || COMPILE_TEST [=y]) && I2C [=y]
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
2025-11-07 14:19 ` [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients Thomas Zimmermann
2025-11-10 11:29 ` kernel test robot
@ 2025-11-10 12:12 ` kernel test robot
2025-11-10 13:47 ` kernel test robot
2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2025-11-10 12:12 UTC (permalink / raw)
To: Thomas Zimmermann, jfalempe, javierm, simona, airlied, mripard,
maarten.lankhorst, gregkh, jirislaby
Cc: llvm, oe-kbuild-all, dri-devel, linux-kernel, linux-serial,
Thomas Zimmermann
Hi Thomas,
kernel test robot noticed the following build warnings:
[auto build test WARNING on next-20251107]
[cannot apply to drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-misc/drm-misc-next drm-tip/drm-tip linus/master v6.18-rc4 v6.18-rc3 v6.18-rc2 v6.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-client-Pass-force-parameter-to-client-restore/20251107-223026
base: next-20251107
patch link: https://lore.kernel.org/r/20251107142612.467817-3-tzimmermann%40suse.de
patch subject: [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
config: powerpc64-randconfig-001-20251110 (https://download.01.org/0day-ci/archive/20251110/202511101950.bIUDG3LX-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 0d786b9a207aa0e6d88dde7fd9ffe0b364db69a4)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251110/202511101950.bIUDG3LX-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511101950.bIUDG3LX-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from drivers/gpu/drm/drm_debugfs_crc.c:41:
>> drivers/gpu/drm/drm_internal.h:64:6: warning: no previous prototype for function 'drm_client_sysrq_register' [-Wmissing-prototypes]
64 | void drm_client_sysrq_register(struct drm_device *dev)
| ^
drivers/gpu/drm/drm_internal.h:64:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
64 | void drm_client_sysrq_register(struct drm_device *dev)
| ^
| static
>> drivers/gpu/drm/drm_internal.h:66:6: warning: no previous prototype for function 'drm_client_sysrq_unregister' [-Wmissing-prototypes]
66 | void drm_client_sysrq_unregister(struct drm_device *dev)
| ^
drivers/gpu/drm/drm_internal.h:66:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
66 | void drm_client_sysrq_unregister(struct drm_device *dev)
| ^
| static
2 warnings generated.
vim +/drm_client_sysrq_register +64 drivers/gpu/drm/drm_internal.h
58
59 /* drm_client_sysrq.c */
60 #if defined(CONFIG_DRM_CLIENT) && defined(CONFIG_MAGIC_SYSRQ)
61 void drm_client_sysrq_register(struct drm_device *dev);
62 void drm_client_sysrq_unregister(struct drm_device *dev);
63 #else
> 64 void drm_client_sysrq_register(struct drm_device *dev)
65 { }
> 66 void drm_client_sysrq_unregister(struct drm_device *dev)
67 { }
68 #endif
69
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
2025-11-07 14:19 ` [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients Thomas Zimmermann
2025-11-10 11:29 ` kernel test robot
2025-11-10 12:12 ` kernel test robot
@ 2025-11-10 13:47 ` kernel test robot
2 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2025-11-10 13:47 UTC (permalink / raw)
To: Thomas Zimmermann, jfalempe, javierm, simona, airlied, mripard,
maarten.lankhorst, gregkh, jirislaby
Cc: llvm, oe-kbuild-all, dri-devel, linux-kernel, linux-serial,
Thomas Zimmermann
Hi Thomas,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20251107]
[cannot apply to drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-misc/drm-misc-next drm-tip/drm-tip linus/master v6.18-rc4 v6.18-rc3 v6.18-rc2 v6.18-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Thomas-Zimmermann/drm-client-Pass-force-parameter-to-client-restore/20251107-223026
base: next-20251107
patch link: https://lore.kernel.org/r/20251107142612.467817-3-tzimmermann%40suse.de
patch subject: [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients
config: powerpc64-randconfig-001-20251110 (https://download.01.org/0day-ci/archive/20251110/202511102156.RRA8JQGz-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 0d786b9a207aa0e6d88dde7fd9ffe0b364db69a4)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251110/202511102156.RRA8JQGz-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511102156.RRA8JQGz-lkp@intel.com/
All errors (new ones prefixed by >>):
>> ld.lld: error: duplicate symbol: drm_client_sysrq_register
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_register) in archive vmlinux.a
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_auth.o:(.text+0x0) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_unregister
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_unregister) in archive vmlinux.a
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_auth.o:(.text+0x40) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_register
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_register) in archive vmlinux.a
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_edid.o:(.text+0x0) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_unregister
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_unregister) in archive vmlinux.a
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_edid.o:(.text+0x40) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_register
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_register) in archive vmlinux.a
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_encoder.o:(.text+0x0) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_unregister
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_unregister) in archive vmlinux.a
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_encoder.o:(.text+0x40) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_register
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_register) in archive vmlinux.a
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_file.o:(.text+0x0) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_unregister
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_unregister) in archive vmlinux.a
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_file.o:(.text+0x40) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_register
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_register) in archive vmlinux.a
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_framebuffer.o:(.text+0x0) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_unregister
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_unregister) in archive vmlinux.a
>>> defined at drm_internal.h:67 (drivers/gpu/drm/drm_internal.h:67)
>>> drivers/gpu/drm/drm_framebuffer.o:(.text+0x40) in archive vmlinux.a
--
>> ld.lld: error: duplicate symbol: drm_client_sysrq_register
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_atomic.o:(drm_client_sysrq_register) in archive vmlinux.a
>>> defined at drm_internal.h:65 (drivers/gpu/drm/drm_internal.h:65)
>>> drivers/gpu/drm/drm_gem.o:(.text+0x0) in archive vmlinux.a
..
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] drm/client: Pass force parameter to client restore
2025-11-07 14:19 ` [PATCH 1/3] drm/client: Pass force parameter to client restore Thomas Zimmermann
@ 2025-11-10 14:02 ` Jocelyn Falempe
0 siblings, 0 replies; 9+ messages in thread
From: Jocelyn Falempe @ 2025-11-10 14:02 UTC (permalink / raw)
To: Thomas Zimmermann, javierm, simona, airlied, mripard,
maarten.lankhorst, gregkh, jirislaby
Cc: dri-devel, linux-kernel, linux-serial
On 07/11/2025 15:19, Thomas Zimmermann wrote:
> Add force parameter to client restore and pass value through the
> layers. The only currently used value is false.
>
> If force is true, the client should restore its display even if it
> does not hold the DRM master lock. This is be required for emergency
> output, such as sysrq.
>
> While at it, inline drm_fb_helper_lastclose(), which is a trivial
> wrapper around drm_fb_helper_restore_fbdev_mode_unlocked().
Thanks for this work, it looks good to me.
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/clients/drm_fbdev_client.c | 6 ++++--
> drivers/gpu/drm/drm_client_event.c | 4 ++--
> drivers/gpu/drm/drm_fb_helper.c | 24 ++++++----------------
> drivers/gpu/drm/drm_file.c | 2 +-
> include/drm/drm_client.h | 8 +++++---
> include/drm/drm_client_event.h | 4 ++--
> include/drm/drm_fb_helper.h | 8 ++------
> 7 files changed, 22 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/gpu/drm/clients/drm_fbdev_client.c b/drivers/gpu/drm/clients/drm_fbdev_client.c
> index 47e5f27eee58..28951e392482 100644
> --- a/drivers/gpu/drm/clients/drm_fbdev_client.c
> +++ b/drivers/gpu/drm/clients/drm_fbdev_client.c
> @@ -38,9 +38,11 @@ static void drm_fbdev_client_unregister(struct drm_client_dev *client)
> }
> }
>
> -static int drm_fbdev_client_restore(struct drm_client_dev *client)
> +static int drm_fbdev_client_restore(struct drm_client_dev *client, bool force)
> {
> - drm_fb_helper_lastclose(client->dev);
> + struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
> +
> + drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);
>
> return 0;
> }
> diff --git a/drivers/gpu/drm/drm_client_event.c b/drivers/gpu/drm/drm_client_event.c
> index d25dc5250983..7b3e362f7926 100644
> --- a/drivers/gpu/drm/drm_client_event.c
> +++ b/drivers/gpu/drm/drm_client_event.c
> @@ -102,7 +102,7 @@ void drm_client_dev_hotplug(struct drm_device *dev)
> }
> EXPORT_SYMBOL(drm_client_dev_hotplug);
>
> -void drm_client_dev_restore(struct drm_device *dev)
> +void drm_client_dev_restore(struct drm_device *dev, bool force)
> {
> struct drm_client_dev *client;
> int ret;
> @@ -115,7 +115,7 @@ void drm_client_dev_restore(struct drm_device *dev)
> if (!client->funcs || !client->funcs->restore)
> continue;
>
> - ret = client->funcs->restore(client);
> + ret = client->funcs->restore(client, force);
> drm_dbg_kms(dev, "%s: ret=%d\n", client->name, ret);
> if (!ret) /* The first one to return zero gets the privilege to restore */
> break;
> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
> index 53e9dc0543de..1392738ce2fe 100644
> --- a/drivers/gpu/drm/drm_fb_helper.c
> +++ b/drivers/gpu/drm/drm_fb_helper.c
> @@ -255,6 +255,7 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
> /**
> * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
> * @fb_helper: driver-allocated fbdev helper, can be NULL
> + * @force: ignore present DRM master
> *
> * This helper should be called from fbdev emulation's &drm_client_funcs.restore
> * callback. It ensures that the user isn't greeted with a black screen when the
> @@ -263,9 +264,9 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
> * Returns:
> * 0 on success, or a negative errno code otherwise.
> */
> -int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
> +int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper, bool force)
> {
> - return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, false);
> + return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);
> }
> EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);
>
> @@ -1328,9 +1329,9 @@ int drm_fb_helper_set_par(struct fb_info *info)
> * the KDSET IOCTL with KD_TEXT, and only after that drops the master
> * status when exiting.
> *
> - * In the past this was caught by drm_fb_helper_lastclose(), but on
> - * modern systems where logind always keeps a drm fd open to orchestrate
> - * the vt switching, this doesn't work.
> + * In the past this was caught by drm_fb_helper_restore_fbdev_mode_unlocked(),
> + * but on modern systems where logind always keeps a drm fd open to
> + * orchestrate the vt switching, this doesn't work.
> *
> * To not break the userspace ABI we have this special case here, which
> * is only used for the above case. Everything else uses the normal
> @@ -1955,16 +1956,3 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
> return 0;
> }
> EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
> -
> -/**
> - * drm_fb_helper_lastclose - DRM driver lastclose helper for fbdev emulation
> - * @dev: DRM device
> - *
> - * This function is obsolete. Call drm_fb_helper_restore_fbdev_mode_unlocked()
> - * instead.
> - */
> -void drm_fb_helper_lastclose(struct drm_device *dev)
> -{
> - drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper);
> -}
> -EXPORT_SYMBOL(drm_fb_helper_lastclose);
> diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c
> index eebd1a05ee97..be5e617ceb9f 100644
> --- a/drivers/gpu/drm/drm_file.c
> +++ b/drivers/gpu/drm/drm_file.c
> @@ -405,7 +405,7 @@ EXPORT_SYMBOL(drm_open);
>
> static void drm_lastclose(struct drm_device *dev)
> {
> - drm_client_dev_restore(dev);
> + drm_client_dev_restore(dev, false);
>
> if (dev_is_pci(dev->dev))
> vga_switcheroo_process_delayed_switch();
> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h
> index 5ecde0f6f591..c972a8a3385b 100644
> --- a/include/drm/drm_client.h
> +++ b/include/drm/drm_client.h
> @@ -57,12 +57,14 @@ struct drm_client_funcs {
> *
> * Note that the core does not guarantee exclusion against concurrent
> * drm_open(). Clients need to ensure this themselves, for example by
> - * using drm_master_internal_acquire() and
> - * drm_master_internal_release().
> + * using drm_master_internal_acquire() and drm_master_internal_release().
> + *
> + * If the caller passes force, the client should ignore any present DRM
> + * master and restore the display anyway.
> *
> * This callback is optional.
> */
> - int (*restore)(struct drm_client_dev *client);
> + int (*restore)(struct drm_client_dev *client, bool force);
>
> /**
> * @hotplug:
> diff --git a/include/drm/drm_client_event.h b/include/drm/drm_client_event.h
> index 985d6f02a4c4..79369c755bc9 100644
> --- a/include/drm/drm_client_event.h
> +++ b/include/drm/drm_client_event.h
> @@ -10,7 +10,7 @@ struct drm_device;
> #if defined(CONFIG_DRM_CLIENT)
> void drm_client_dev_unregister(struct drm_device *dev);
> void drm_client_dev_hotplug(struct drm_device *dev);
> -void drm_client_dev_restore(struct drm_device *dev);
> +void drm_client_dev_restore(struct drm_device *dev, bool force);
> void drm_client_dev_suspend(struct drm_device *dev);
> void drm_client_dev_resume(struct drm_device *dev);
> #else
> @@ -18,7 +18,7 @@ static inline void drm_client_dev_unregister(struct drm_device *dev)
> { }
> static inline void drm_client_dev_hotplug(struct drm_device *dev)
> { }
> -static inline void drm_client_dev_restore(struct drm_device *dev)
> +static inline void drm_client_dev_restore(struct drm_device *dev, bool force)
> { }
> static inline void drm_client_dev_suspend(struct drm_device *dev)
> { }
> diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
> index c1d38d54a112..63e3af8dd5ed 100644
> --- a/include/drm/drm_fb_helper.h
> +++ b/include/drm/drm_fb_helper.h
> @@ -254,7 +254,8 @@ int drm_fb_helper_set_par(struct fb_info *info);
> int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
> struct fb_info *info);
>
> -int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
> +int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
> + bool force);
>
> struct fb_info *drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper);
> void drm_fb_helper_release_info(struct drm_fb_helper *fb_helper);
> @@ -283,7 +284,6 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
> int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper);
> int drm_fb_helper_debug_enter(struct fb_info *info);
> int drm_fb_helper_debug_leave(struct fb_info *info);
> -void drm_fb_helper_lastclose(struct drm_device *dev);
> #else
> static inline void drm_fb_helper_prepare(struct drm_device *dev,
> struct drm_fb_helper *helper,
> @@ -409,10 +409,6 @@ static inline int drm_fb_helper_debug_leave(struct fb_info *info)
> {
> return 0;
> }
> -
> -static inline void drm_fb_helper_lastclose(struct drm_device *dev)
> -{
> -}
> #endif
>
> #endif
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] drm/client: log: Implement struct drm_client_funcs.restore
2025-11-07 14:19 ` [PATCH 3/3] drm/client: log: Implement struct drm_client_funcs.restore Thomas Zimmermann
@ 2025-11-10 14:05 ` Jocelyn Falempe
0 siblings, 0 replies; 9+ messages in thread
From: Jocelyn Falempe @ 2025-11-10 14:05 UTC (permalink / raw)
To: Thomas Zimmermann, javierm, simona, airlied, mripard,
maarten.lankhorst, gregkh, jirislaby
Cc: dri-devel, linux-kernel, linux-serial
On 07/11/2025 15:19, Thomas Zimmermann wrote:
> Restore the log client's output when the DRM core invokes the restore
> callback. Follow the existing behavior of fbdev emulation wrt. the
> value of the force parameter.
>
> If force is false, acquire the DRM master lock and reprogram the
> display. This is the case when the user-space compositor exists and
> the DRM core transfers the display back to the in-kernel client. This
> also enables log output during reboots.
>
> If force is true, reprogram without considering the master lock. This
> overrides the current compositor and prints the log to the screen. In
> case of system malfunction, users can enter SysRq+v to invoke the
> emergency error reporting. See Documentation/admin-guide/sysrq.rst for
> more information.
Thanks, it looks good to me.
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/clients/drm_log.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/drivers/gpu/drm/clients/drm_log.c b/drivers/gpu/drm/clients/drm_log.c
> index 19e55aa0ed74..4d3005273b27 100644
> --- a/drivers/gpu/drm/clients/drm_log.c
> +++ b/drivers/gpu/drm/clients/drm_log.c
> @@ -315,6 +315,18 @@ static void drm_log_client_unregister(struct drm_client_dev *client)
> drm_client_release(client);
> }
>
> +static int drm_log_client_restore(struct drm_client_dev *client, bool force)
> +{
> + int ret;
> +
> + if (force)
> + ret = drm_client_modeset_commit_locked(client);
> + else
> + ret = drm_client_modeset_commit(client);
> +
> + return ret;
> +}
> +
> static int drm_log_client_hotplug(struct drm_client_dev *client)
> {
> struct drm_log *dlog = client_to_drm_log(client);
> @@ -348,6 +360,7 @@ static const struct drm_client_funcs drm_log_client_funcs = {
> .owner = THIS_MODULE,
> .free = drm_log_client_free,
> .unregister = drm_log_client_unregister,
> + .restore = drm_log_client_restore,
> .hotplug = drm_log_client_hotplug,
> .suspend = drm_log_client_suspend,
> .resume = drm_log_client_resume,
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-11-10 14:05 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-07 14:19 [PATCH 0/3] drm/client: Wire up sysrq for all clients and update drm_log Thomas Zimmermann
2025-11-07 14:19 ` [PATCH 1/3] drm/client: Pass force parameter to client restore Thomas Zimmermann
2025-11-10 14:02 ` Jocelyn Falempe
2025-11-07 14:19 ` [PATCH 2/3] drm/client: Support emergency restore via sysrq for all clients Thomas Zimmermann
2025-11-10 11:29 ` kernel test robot
2025-11-10 12:12 ` kernel test robot
2025-11-10 13:47 ` kernel test robot
2025-11-07 14:19 ` [PATCH 3/3] drm/client: log: Implement struct drm_client_funcs.restore Thomas Zimmermann
2025-11-10 14:05 ` Jocelyn Falempe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox