Print this page
XXXX cpudrv attach is racy

*** 275,286 **** ddi_soft_state_free(cpudrv_state, instance); cpudrv_enabled = B_FALSE; return (DDI_FAILURE); } mutex_init(&cpudsp->lock, NULL, MUTEX_DRIVER, NULL); - if (cpudrv_is_enabled(cpudsp)) { if (cpudrv_init(cpudsp) != DDI_SUCCESS) { cpudrv_enabled = B_FALSE; cpudrv_free(cpudsp); ddi_soft_state_free(cpudrv_state, instance); return (DDI_FAILURE); --- 275,294 ---- ddi_soft_state_free(cpudrv_state, instance); cpudrv_enabled = B_FALSE; return (DDI_FAILURE); } + if (!cpudrv_is_enabled(cpudsp)) { + cmn_err(CE_WARN, "cpudrv_attach: instance %d: " + "not supported or it got disabled on us", + instance); + cpudrv_enabled = B_FALSE; + ddi_soft_state_free(cpudrv_state, instance); + return (DDI_FAILURE); + } + mutex_init(&cpudsp->lock, NULL, MUTEX_DRIVER, NULL); if (cpudrv_init(cpudsp) != DDI_SUCCESS) { cpudrv_enabled = B_FALSE; cpudrv_free(cpudsp); ddi_soft_state_free(cpudrv_state, instance); return (DDI_FAILURE);
*** 334,345 **** * has been initialized. */ CPUDRV_MONITOR_INIT(cpudsp); mutex_exit(&cpudsp->lock); - } - if (!cpudrv_mach_init(cpudsp)) { cmn_err(CE_WARN, "cpudrv_attach: instance %d: " "cpudrv_mach_init failed", instance); cpudrv_enabled = B_FALSE; cpudrv_free(cpudsp); --- 342,351 ----