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.

Reviewed by:	royger
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D7290
This commit is contained in:
John Baldwin 2016-07-23 14:38:09 +00:00
parent b3033826a6
commit ab59c4d9f1

View File

@ -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;
@ -134,7 +135,6 @@ 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,
@ -1142,7 +1142,7 @@ vesa_configure(int flags)
* initialization for now and try again later.
*/
if (adp == NULL) {
vga_sub_configure = vesa_late_load;
vga_sub_configure = vesa_configure;
return (ENODEV);
}
@ -1909,28 +1909,15 @@ 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)
return (0);
mtx_init(&vesa_lock, "VESA lock", NULL, MTX_DEF);
/* locate a VGA adapter */
vesa_adp = NULL;
error = vesa_configure(flags);
error = vesa_configure(0);
if (error == 0)
vesa_bios_info(bootverbose);
@ -1966,7 +1953,6 @@ vesa_unload(void)
}
vesa_bios_uninit();
mtx_destroy(&vesa_lock);
return (error);
}