summaryrefslogtreecommitdiffstats
path: root/sys/dev/fb/vesa.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-08-06 23:53:33 +0000
committerjhb <jhb@FreeBSD.org>2016-08-06 23:53:33 +0000
commitc8bdb243bc1eb49a193502f9725f9e13665e5abc (patch)
tree136b021da88395a4decd3b2a798fd205d3c2ca44 /sys/dev/fb/vesa.c
parentdf3e76ed69709768cf4e4bd3020afac5a70b7b28 (diff)
downloadFreeBSD-src-c8bdb243bc1eb49a193502f9725f9e13665e5abc.zip
FreeBSD-src-c8bdb243bc1eb49a193502f9725f9e13665e5abc.tar.gz
MFC 303076,303225: Use MTX_SYSINIT for the VESA lock.
303076: vesa: fix panic on suspend Fix the following panic seen when migrating a FreeBSD guest on Xen: panic: mtx_lock() of destroyed mutex @ /usr/src/sys/dev/fb/vesa.c:541 cpuid = 0 KDB: stack backtrace: db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe001d2fa4f0 vpanic() at vpanic+0x182/frame 0xfffffe001d2fa570 kassert_panic() at kassert_panic+0x126/frame 0xfffffe001d2fa5e0 __mtx_lock_flags() at __mtx_lock_flags+0x15b/frame 0xfffffe001d2fa630 vesa_bios_save_restore() at vesa_bios_save_restore+0x78/frame 0xfffffe001d2fa680 vga_suspend() at vga_suspend+0xa3/frame 0xfffffe001d2fa6b0 isavga_suspend() at isavga_suspend+0x1d/frame 0xfffffe001d2fa6d0 bus_generic_suspend_child() at bus_generic_suspend_child+0x44/frame [...] This is caused because vga_sub_configure (which is called if the VGA adapter is attached after VESA tried to initialize), points to vesa_configure, which doesn't initialize the VESA mutex. In order to fix it, make sure vga_sub_configure points to vesa_load, so that all the needed vesa components are properly initialized. 303225: Use MTX_SYSINIT for the VESA lock. vesa_init_done isn't a reliable guard for the mutex init. If vesa_configure() doesn't find valid VESA info it will not set vesa_init_done, but the lock will remain initialized. Revert r303076 and use MTX_SYSINIT to deterministically init the lock. PR: 209203
Diffstat (limited to 'sys/dev/fb/vesa.c')
-rw-r--r--sys/dev/fb/vesa.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/sys/dev/fb/vesa.c b/sys/dev/fb/vesa.c
index 1db24bd..bd4b261 100644
--- a/sys/dev/fb/vesa.c
+++ b/sys/dev/fb/vesa.c
@@ -79,6 +79,7 @@ struct adp_state {
typedef struct adp_state adp_state_t;
static struct mtx vesa_lock;
+MTX_SYSINIT(vesa_lock, &vesa_lock, "VESA lock", MTX_DEF);
static int vesa_state;
static void *vesa_state_buf;
@@ -1915,8 +1916,6 @@ vesa_load(void)
if (vesa_init_done)
return (0);
- mtx_init(&vesa_lock, "VESA lock", NULL, MTX_DEF);
-
/* locate a VGA adapter */
vesa_adp = NULL;
error = vesa_configure(0);
@@ -1955,7 +1954,6 @@ vesa_unload(void)
}
vesa_bios_uninit();
- mtx_destroy(&vesa_lock);
return (error);
}
OpenPOWER on IntegriCloud