Index: sys/dev/acpica/Osd/OsdSynch.c =================================================================== --- sys/dev/acpica/Osd/OsdSynch.c (revision 247614) +++ sys/dev/acpica/Osd/OsdSynch.c (working copy) @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #define _COMPONENT ACPI_OS_SERVICES ACPI_MODULE_NAME("SYNCH") -MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore"); +static MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore"); /* * Convert milliseconds to ticks. @@ -71,9 +71,10 @@ struct acpi_sema { UINT32 as_maxunits; UINT32 as_units; int as_waiters; - int as_reset; }; +#define ACPISEM_AVAIL(s, u) ((s)->as_units >= (u)) + ACPI_STATUS AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_SEMAPHORE *OutHandle) @@ -109,34 +110,14 @@ AcpiOsDeleteSemaphore(ACPI_SEMAPHORE Handle) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (as == NULL) - return_ACPI_STATUS (AE_BAD_PARAMETER); - mtx_lock(&as->as_lock); ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "delete %s\n", as->as_name)); + KASSERT(ACPISEM_AVAIL(as, 1), + ("deleting busy acpi semaphore %s", as->as_name)); + KASSERT(as->as_waiters == 0, + ("deleting used acpi semaphore %s", as->as_name)); - if (as->as_waiters > 0) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "reset %s, units %u, waiters %d\n", - as->as_name, as->as_units, as->as_waiters)); - as->as_reset = 1; - cv_broadcast(&as->as_cv); - while (as->as_waiters > 0) { - if (mtx_sleep(&as->as_reset, &as->as_lock, - PCATCH, "acsrst", hz) == EINTR) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "failed to reset %s, waiters %d\n", - as->as_name, as->as_waiters)); - mtx_unlock(&as->as_lock); - return_ACPI_STATUS (AE_ERROR); - } - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "wait %s, units %u, waiters %d\n", - as->as_name, as->as_units, as->as_waiters)); - } - } - mtx_unlock(&as->as_lock); mtx_destroy(&as->as_lock); @@ -146,18 +127,16 @@ AcpiOsDeleteSemaphore(ACPI_SEMAPHORE Handle) return_ACPI_STATUS (AE_OK); } -#define ACPISEM_AVAIL(s, u) ((s)->as_units >= (u)) - ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units, UINT16 Timeout) { struct acpi_sema *as = (struct acpi_sema *)Handle; - int error, prevtick, slptick, tmo; + int prevtick, slptick, tmo; ACPI_STATUS status = AE_OK; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (as == NULL || Units == 0) + if (Units == 0) return_ACPI_STATUS (AE_BAD_PARAMETER); mtx_lock(&as->as_lock); @@ -179,12 +158,8 @@ AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 case ACPI_WAIT_FOREVER: while (!ACPISEM_AVAIL(as, Units)) { as->as_waiters++; - error = cv_wait_sig(&as->as_cv, &as->as_lock); + cv_wait(&as->as_cv, &as->as_lock); as->as_waiters--; - if (error == EINTR || as->as_reset) { - status = AE_ERROR; - break; - } } break; default: @@ -192,12 +167,8 @@ AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 while (!ACPISEM_AVAIL(as, Units)) { prevtick = ticks; as->as_waiters++; - error = cv_timedwait_sig(&as->as_cv, &as->as_lock, tmo); + cv_timedwait(&as->as_cv, &as->as_lock, tmo); as->as_waiters--; - if (error == EINTR || as->as_reset) { - status = AE_ERROR; - break; - } if (ACPISEM_AVAIL(as, Units)) break; slptick = ticks - prevtick; @@ -208,8 +179,11 @@ AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 tmo -= slptick; } } - if (status == AE_OK) + if (ACPI_SUCCESS(status)) { + KASSERT(as->as_units >= Units, + ("acpi semaphore negative count")); as->as_units -= Units; + } mtx_unlock(&as->as_lock); @@ -220,11 +194,10 @@ ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units) { struct acpi_sema *as = (struct acpi_sema *)Handle; - UINT32 i; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (as == NULL || Units == 0) + if (Units == 0) return_ACPI_STATUS (AE_BAD_PARAMETER); mtx_lock(&as->as_lock); @@ -236,16 +209,19 @@ AcpiOsSignalSemaphore(ACPI_SEMAPHORE Handle, UINT3 if (as->as_maxunits != ACPI_NO_UNIT_LIMIT && (as->as_maxunits < Units || as->as_maxunits - Units < as->as_units)) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, + ACPI_ERROR((AE_INFO, "exceeded max units %u\n", as->as_maxunits)); mtx_unlock(&as->as_lock); return_ACPI_STATUS (AE_LIMIT); } as->as_units += Units; - if (as->as_waiters > 0 && ACPISEM_AVAIL(as, Units)) - for (i = 0; i < Units; i++) + if (as->as_waiters > 0) { + if (as->as_maxunits > 1) + cv_broadcast(&as->as_cv); + else cv_signal(&as->as_cv); + } mtx_unlock(&as->as_lock); @@ -258,18 +234,15 @@ AcpiOsSignalSemaphore(ACPI_SEMAPHORE Handle, UINT3 * ACPI_MUTEX */ struct acpi_mutex { - struct mtx am_lock; - char am_name[32]; + ACPI_SEMAPHORE am_sema; struct thread *am_owner; - int am_nested; - int am_waiters; - int am_reset; }; ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX *OutHandle) { struct acpi_mutex *am; + ACPI_STATUS status; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -279,17 +252,18 @@ AcpiOsCreateMutex(ACPI_MUTEX *OutHandle) if ((am = malloc(sizeof(*am), M_ACPISEM, M_NOWAIT | M_ZERO)) == NULL) return_ACPI_STATUS (AE_NO_MEMORY); - snprintf(am->am_name, sizeof(am->am_name), "ACPI mutex (%p)", am); - mtx_init(&am->am_lock, am->am_name, NULL, MTX_DEF); + status = AcpiOsCreateSemaphore(1, 1, &am->am_sema); + if (ACPI_FAILURE(status)) { + free(am, M_ACPISEM); + return_ACPI_STATUS (status); + } - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "created %s\n", am->am_name)); - + ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "created %p\n", am)); *OutHandle = (ACPI_MUTEX)am; - return_ACPI_STATUS (AE_OK); } -#define ACPIMTX_AVAIL(m) ((m)->am_owner == NULL) +#define ACPIMTX_AVAIL(m) ((m)->am_owner == NULL) #define ACPIMTX_OWNED(m) ((m)->am_owner == curthread) void @@ -298,44 +272,7 @@ AcpiOsDeleteMutex(ACPI_MUTEX Handle) struct acpi_mutex *am = (struct acpi_mutex *)Handle; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - - if (am == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "cannot delete null mutex\n")); - return_VOID; - } - - mtx_lock(&am->am_lock); - - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "delete %s\n", am->am_name)); - - if (am->am_waiters > 0) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "reset %s, owner %p\n", am->am_name, am->am_owner)); - am->am_reset = 1; - wakeup(am); - while (am->am_waiters > 0) { - if (mtx_sleep(&am->am_reset, &am->am_lock, - PCATCH, "acmrst", hz) == EINTR) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "failed to reset %s, waiters %d\n", - am->am_name, am->am_waiters)); - mtx_unlock(&am->am_lock); - return_VOID; - } - if (ACPIMTX_AVAIL(am)) - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "wait %s, waiters %d\n", - am->am_name, am->am_waiters)); - else - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "wait %s, owner %p, waiters %d\n", - am->am_name, am->am_owner, am->am_waiters)); - } - } - - mtx_unlock(&am->am_lock); - - mtx_destroy(&am->am_lock); + AcpiOsDeleteSemaphore(am->am_sema); free(am, M_ACPISEM); } @@ -343,70 +280,16 @@ ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX Handle, UINT16 Timeout) { struct acpi_mutex *am = (struct acpi_mutex *)Handle; - int error, prevtick, slptick, tmo; - ACPI_STATUS status = AE_OK; + ACPI_STATUS status; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (am == NULL) - return_ACPI_STATUS (AE_BAD_PARAMETER); - - mtx_lock(&am->am_lock); - - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "acquire %s\n", am->am_name)); - - if (ACPIMTX_OWNED(am)) { - am->am_nested++; - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "acquire nested %s, depth %d\n", - am->am_name, am->am_nested)); - mtx_unlock(&am->am_lock); - return_ACPI_STATUS (AE_OK); + KASSERT(!ACPIMTX_OWNED(am), ("recursed on acpi mutex")); + status = AcpiOsWaitSemaphore(am->am_sema, 1, Timeout); + if (ACPI_SUCCESS(status)) { + KASSERT(ACPIMTX_AVAIL(am), ("obtained owned acpi mutex")); + am->am_owner = curthread; } - - switch (Timeout) { - case ACPI_DO_NOT_WAIT: - if (!ACPIMTX_AVAIL(am)) - status = AE_TIME; - break; - case ACPI_WAIT_FOREVER: - while (!ACPIMTX_AVAIL(am)) { - am->am_waiters++; - error = mtx_sleep(am, &am->am_lock, PCATCH, "acmtx", 0); - am->am_waiters--; - if (error == EINTR || am->am_reset) { - status = AE_ERROR; - break; - } - } - break; - default: - tmo = timeout2hz(Timeout); - while (!ACPIMTX_AVAIL(am)) { - prevtick = ticks; - am->am_waiters++; - error = mtx_sleep(am, &am->am_lock, PCATCH, - "acmtx", tmo); - am->am_waiters--; - if (error == EINTR || am->am_reset) { - status = AE_ERROR; - break; - } - if (ACPIMTX_AVAIL(am)) - break; - slptick = ticks - prevtick; - if (slptick >= tmo || slptick < 0) { - status = AE_TIME; - break; - } - tmo -= slptick; - } - } - if (status == AE_OK) - am->am_owner = curthread; - - mtx_unlock(&am->am_lock); - return_ACPI_STATUS (status); } @@ -417,37 +300,9 @@ AcpiOsReleaseMutex(ACPI_MUTEX Handle) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (am == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "cannot release null mutex\n")); - return_VOID; - } - - mtx_lock(&am->am_lock); - - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "release %s\n", am->am_name)); - - if (ACPIMTX_OWNED(am)) { - if (am->am_nested > 0) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "release nested %s, depth %d\n", - am->am_name, am->am_nested)); - am->am_nested--; - } else - am->am_owner = NULL; - } else { - if (ACPIMTX_AVAIL(am)) - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "release already available %s\n", am->am_name)); - else - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "release unowned %s from %p, depth %d\n", - am->am_name, am->am_owner, am->am_nested)); - } - if (am->am_waiters > 0 && ACPIMTX_AVAIL(am)) - wakeup_one(am); - - mtx_unlock(&am->am_lock); + KASSERT(ACPIMTX_OWNED(am), ("releasing unowned acpi mutex")); + am->am_owner = NULL; + AcpiOsSignalSemaphore(am->am_sema, 1); } #undef ACPIMTX_AVAIL @@ -458,14 +313,13 @@ AcpiOsReleaseMutex(ACPI_MUTEX Handle) */ struct acpi_spinlock { struct mtx al_lock; - char al_name[32]; - int al_nested; }; ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK *OutHandle) { struct acpi_spinlock *al; + char al_name[32]; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -477,18 +331,15 @@ AcpiOsCreateLock(ACPI_SPINLOCK *OutHandle) #ifdef ACPI_DEBUG if (OutHandle == &AcpiGbl_GpeLock) - snprintf(al->al_name, sizeof(al->al_name), "ACPI lock (GPE)"); + snprintf(al_name, sizeof(al_name), "ACPI lock (GPE)"); else if (OutHandle == &AcpiGbl_HardwareLock) - snprintf(al->al_name, sizeof(al->al_name), "ACPI lock (HW)"); + snprintf(al_name, sizeof(al_name), "ACPI lock (HW)"); else #endif - snprintf(al->al_name, sizeof(al->al_name), "ACPI lock (%p)", al); - mtx_init(&al->al_lock, al->al_name, NULL, MTX_SPIN); + snprintf(al_name, sizeof(al_name), "ACPI lock (%p)", al); + mtx_init(&al->al_lock, al_name, NULL, MTX_SPIN); - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "created %s\n", al->al_name)); - *OutHandle = (ACPI_SPINLOCK)al; - return_ACPI_STATUS (AE_OK); } @@ -499,14 +350,6 @@ AcpiOsDeleteLock(ACPI_SPINLOCK Handle) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (al == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "cannot delete null spinlock\n")); - return_VOID; - } - - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "delete %s\n", al->al_name)); - mtx_destroy(&al->al_lock); free(al, M_ACPISEM); } @@ -517,23 +360,7 @@ AcpiOsAcquireLock(ACPI_SPINLOCK Handle) struct acpi_spinlock *al = (struct acpi_spinlock *)Handle; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - - if (al == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "cannot acquire null spinlock\n")); - return (0); - } - - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "acquire %s\n", al->al_name)); - - if (mtx_owned(&al->al_lock)) { - al->al_nested++; - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "acquire nested %s, depth %d\n", - al->al_name, al->al_nested)); - } else - mtx_lock_spin(&al->al_lock); - + mtx_lock_spin(&al->al_lock); return (0); } @@ -543,26 +370,7 @@ AcpiOsReleaseLock(ACPI_SPINLOCK Handle, ACPI_CPU_F struct acpi_spinlock *al = (struct acpi_spinlock *)Handle; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - - if (al == NULL) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "cannot release null spinlock\n")); - return_VOID; - } - - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "release %s\n", al->al_name)); - - if (mtx_owned(&al->al_lock)) { - if (al->al_nested > 0) { - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "release nested %s, depth %d\n", - al->al_name, al->al_nested)); - al->al_nested--; - } else - mtx_unlock_spin(&al->al_lock); - } else - ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, - "cannot release unowned %s\n", al->al_name)); + mtx_unlock_spin(&al->al_lock); } /* Section 5.2.10.1: global lock acquire/release functions */