Re: kernel panic on "wsconsctl display.screen_off=10000"

Jonathan Gray <[email protected]> Sat, 20 Jun 2026 23:45:26 +1000
Newsgroups gmane.os.openbsd.bugs
Message-ID <[email protected]>
On Fri, Jun 19, 2026 at 10:38:46PM +0200, Philippe wrote:
> > Synopsis:	kernel panic on "wsconsctl display.screen_off=10000"
> > Category:	kernel
> > Environment:
> 	System      : OpenBSD 7.9
> 	Details     : OpenBSD 7.9 (GENERIC.MP) #449: Wed May  6 13:17:25 MDT 2026
> 			 [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> 
> 	Architecture: OpenBSD.amd64
> 	Machine     : amd64
> > Description:
> 	I have a laptop without X and I tried to turn off the screen
> 	with the wsconsctl command.  I found out that none of the
> 	wsconsctl commands regarding the screen work, and the
> 	display.screen_off actually creates a kernel panic.
> 	A picture of the kernel panic is attached to this email.
> 
> 	I didn't previously work with OpenBSD on this machine before,
> 	so I don't know if it's a regression.
> 
> > How-To-Repeat:
> 	wsconsctl display.screen_off=10000
> 
> 	This leads to a kernel crash 10 seconds later.

thanks, fix committed to -current

Index: sys/dev/pci/drm/radeon/radeon_drv.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_drv.c,v
diff -u -p -r1.22 radeon_drv.c
--- sys/dev/pci/drm/radeon/radeon_drv.c	9 Mar 2026 23:58:03 -0000	1.22
+++ sys/dev/pci/drm/radeon/radeon_drv.c	20 Jun 2026 13:18:12 -0000
@@ -733,6 +733,7 @@ radeondrm_detach_kms(struct device *self
 }
 
 void radeondrm_burner(void *, u_int, u_int);
+void radeondrm_burner_cb(void *);
 int radeondrm_wsioctl(void *, u_long, caddr_t, int, struct proc *);
 paddr_t radeondrm_wsmmap(void *, off_t, int);
 int radeondrm_alloc_screen(void *, const struct wsscreen_descr *,
@@ -1265,6 +1266,7 @@ radeondrm_attachhook(struct device *self
 	const struct drm_format_info *format;
 
 	task_set(&rdev->switchtask, radeondrm_doswitch, ri);
+	task_set(&rdev->burner_task, radeondrm_burner_cb, rdev);
 
 	/* from linux radeon_pci_probe() */
 
@@ -1358,4 +1360,37 @@ radeondrm_activate_kms(struct device *se
 	}
 
 	return (rv);
+}
+
+void
+radeondrm_burner(void *v, u_int on, u_int flags)
+{
+	struct rasops_info *ri = v;
+	struct radeon_device *rdev = ri->ri_hw;
+
+	task_del(systq, &rdev->burner_task);
+
+	if (on)
+		rdev->burner_fblank = FB_BLANK_UNBLANK;
+	else {
+		if (flags & WSDISPLAY_BURN_VBLANK)
+			rdev->burner_fblank = FB_BLANK_VSYNC_SUSPEND;
+		else
+			rdev->burner_fblank = FB_BLANK_NORMAL;
+	}
+
+	/*
+	 * Setting the DPMS mode may sleep while waiting for vblank so
+	 * hand things off to a taskq.
+	 */
+	task_add(systq, &rdev->burner_task);
+}
+
+void
+radeondrm_burner_cb(void *arg1)
+{
+	struct radeon_device *rdev = arg1;
+	struct drm_fb_helper *helper = rdev_to_drm(rdev)->fb_helper;
+
+	drm_fb_helper_blank(rdev->burner_fblank, helper->info);
 }
Index: sys/dev/pci/drm/radeon/radeon_fbdev.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_fbdev.c,v
diff -u -p -r1.5 radeon_fbdev.c
--- sys/dev/pci/drm/radeon/radeon_fbdev.c	9 Mar 2026 23:58:03 -0000	1.5
+++ sys/dev/pci/drm/radeon/radeon_fbdev.c	20 Jun 2026 13:04:58 -0000
@@ -338,36 +338,3 @@ bool radeon_fbdev_robj_is_fb(struct rade
 
 	return true;
 }
-
-void
-radeondrm_burner(void *v, u_int on, u_int flags)
-{
-	struct rasops_info *ri = v;
-	struct radeon_device *rdev = ri->ri_hw;
-
-	task_del(systq, &rdev->burner_task);
-
-	if (on)
-		rdev->burner_fblank = FB_BLANK_UNBLANK;
-	else {
-		if (flags & WSDISPLAY_BURN_VBLANK)
-			rdev->burner_fblank = FB_BLANK_VSYNC_SUSPEND;
-		else
-			rdev->burner_fblank = FB_BLANK_NORMAL;
-	}
-
-	/*
-	 * Setting the DPMS mode may sleep while waiting for vblank so
-	 * hand things off to a taskq.
-	 */
-	task_add(systq, &rdev->burner_task);
-}
-
-void
-radeondrm_burner_cb(void *arg1)
-{
-	struct radeon_device *rdev = arg1;
-	struct drm_fb_helper *helper = rdev_to_drm(rdev)->fb_helper;
-
-	drm_fb_helper_blank(rdev->burner_fblank, helper->info);
-}