Re: System panic after upgrade from 7.8 to 7.9 on i386 related to screen blanking
Jonathan Gray <[email protected]> Sat, 20 Jun 2026 23:42:20 +1000
| Newsgroups | gmane.os.openbsd.bugs |
|---|---|
| Message-ID | <[email protected]> |
On Wed, Jun 17, 2026 at 07:35:00PM -0400, [email protected] wrote: > >Synopsis: Kernel Panic with wsconsctl screen blanking > >Category: Kernel Panic wsconsctl > >Environment: > System : OpenBSD 7.9 > Details : OpenBSD 7.9 (GENERIC) #329: Wed May 6 14:56:46 MDT 2026 > [email protected]:/usr/src/sys/arch/i386/compile/GENERIC > > Architecture: OpenBSD.i386 > Machine : i386 > >Description: > After upgrade to 7.9, i386 system panics when wsconsctl enables > display.screen_off=60000 > display.kbdact=on > display.vblank=on > All worked well on past 10 or 20 versions of OpenBSD > >How-To-Repeat: > enable wsconsctl with above configuration > panicing system is a Thinkpad T40 > note: does not affect my Thinkpad X40 > >Fix: > disable wsconsctl screen blanking 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); -}