Skip site navigation (1)Skip section navigation (2)
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>