Date: Wed, 27 Feb 2013 16:54:53 +0200 From: Andriy Gapon <avg@FreeBSD.org> To: Hans Petter Selasky <hps@bitfrost.no> Cc: freebsd-acpi@FreeBSD.org Subject: Re: ACPI locking bugs? Message-ID: <512E1E3D.7090501@FreeBSD.org> In-Reply-To: <201302271453.43985.hps@bitfrost.no> References: <201302271453.43985.hps@bitfrost.no>
next in thread | previous in thread | raw e-mail | index | archive | help
on 27/02/2013 15:53 Hans Petter Selasky said the following: > Hi, > > What is the reason for using cv_wait_sig() and cv_timedwait_sig() instead of > cv_wait() and cv_timedwait() inside of AcpiOsWaitSemaphore(). What signals are > supposed to be catched here? > > switch (Timeout) { > case ACPI_DO_NOT_WAIT: > if (!ACPISEM_AVAIL(as, Units)) > status = AE_TIME; > break; > case ACPI_WAIT_FOREVER: > while (!ACPISEM_AVAIL(as, Units)) { > as->as_waiters++; > error = cv_wait_sig(&as->as_cv, &as->as_lock); > as->as_waiters--; > if (error == EINTR || as->as_reset) { > status = AE_ERROR; > break; > } > } > break; > default: > tmo = timeout2hz(Timeout); > while (!ACPISEM_AVAIL(as, Units)) { > prevtick = ticks; > as->as_waiters++; > error = cv_timedwait_sig(&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; > if (slptick >= tmo || slptick < 0) { > status = AE_TIME; > break; > } > tmo -= slptick; > } > } > > I've observed an issue twice on my MacBookPro that some ACPI locking fails > during shutdown on 9-stable and then the power-off won't complete. I've been > unable to capture the full dmesg, because syslogd is killed at the moment this > happens. There are two ACPI error printouts about failed locking. > > I see that in the case of ACPI_WAIT_FOREVER, it appears to be incorrect to > catch signals, because sometimes the return argument is not checked for lock > operations: > > ./components/utilities/utosi.c: (void) AcpiOsAcquireMutex > (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); > ./components/utilities/utosi.c: (void) AcpiOsAcquireMutex > (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); > ./components/utilities/utosi.c: (void) AcpiOsAcquireMutex > (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); > > Any comments? kib drew my attention to this issue some time ago and I also pinged jkim about it. I completely agree with you that the signal handling should be removed. Are you willing to make the change or would you prefer me doing it? Thank you. -- Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?512E1E3D.7090501>