svn commit: r303076 - head/sys/dev/fb
Roger Pau Monné
royger at FreeBSD.org
Wed Jul 20 09:29:41 UTC 2016
Author: royger
Date: Wed Jul 20 09:29:39 2016
New Revision: 303076
URL: https://svnweb.freebsd.org/changeset/base/303076
Log:
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.
Sponsored by: Citrix Systems R&D
MFC after: 3 days
PR: 209203
Reviewed by: dumbbell
Differential revision: https://reviews.freebsd.org/D7196
Modified:
head/sys/dev/fb/vesa.c
Modified: head/sys/dev/fb/vesa.c
==============================================================================
--- head/sys/dev/fb/vesa.c Wed Jul 20 07:33:48 2016 (r303075)
+++ head/sys/dev/fb/vesa.c Wed Jul 20 09:29:39 2016 (r303076)
@@ -134,6 +134,7 @@ static vi_fill_rect_t vesa_fill_rect;
static vi_bitblt_t vesa_bitblt;
static vi_diag_t vesa_diag;
static int vesa_bios_info(int level);
+static int vesa_late_load(int flags);
static video_switch_t vesavidsw = {
vesa_probe,
@@ -1141,7 +1142,7 @@ vesa_configure(int flags)
* initialization for now and try again later.
*/
if (adp == NULL) {
- vga_sub_configure = vesa_configure;
+ vga_sub_configure = vesa_late_load;
return (ENODEV);
}
@@ -1909,6 +1910,17 @@ vesa_bios_info(int level)
static int
vesa_load(void)
{
+
+ return (vesa_late_load(0));
+}
+
+/*
+ * To be called from the vga_sub_configure hook in case the VGA adapter is
+ * not found when VESA is loaded.
+ */
+static int
+vesa_late_load(int flags)
+{
int error;
if (vesa_init_done)
@@ -1918,7 +1930,7 @@ vesa_load(void)
/* locate a VGA adapter */
vesa_adp = NULL;
- error = vesa_configure(0);
+ error = vesa_configure(flags);
if (error == 0)
vesa_bios_info(bootverbose);
More information about the svn-src-all
mailing list