Date: Wed, 27 Feb 2013 14:28:12 -0500 From: Jung-uk Kim <jkim@FreeBSD.org> To: Hans Petter Selasky <hps@bitfrost.no> Cc: freebsd-acpi@freebsd.org Subject: Re: ACPI locking bugs? Message-ID: <512E5E4C.807@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
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 2013-02-27 08:53:43 -0500, Hans Petter Selasky wrote: > 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? > > Reference: sys/dev/acpica/Osd/OsdSynch.c:AcpiOsWaitSemaphore I don't exactly remember why it was written like that, sorry. Probably it was to work around broken mutex uses in ACPICA at the time. FYI, many ACPICA patches are contributed by Linux developers. Unfortunately, the Linux OS-dependent code does not implement the ACPICA OSL API fully and omits some corner cases. [1] For example, ACPICA mutex is implemented via semaphore: http://lxr.linux.no/#linux+v3.8/include/acpi/platform/aclinux.h#L51 http://lxr.linux.no/#linux+v3.8/include/acpi/actypes.h#L239 And the semaphore does not support unit > 1 and ACPI_WAIT_FOREVER: http://lxr.linux.no/#linux+v3.8/drivers/acpi/osl.c#L1227 So, a lot of locking related ACPICA patches ignored these corner cases. Another problem is that we are very serious about locking orders but ACPICA doesn't really care much because Linux and others don't care, really. Another example is the ACPICA "cache" allocator. It is actually modeled after Linux's slab allocator, i.e., kmem_cache_*(): http://lxr.linux.no/#linux+v3.8/drivers/acpi/osl.c#L1636 Unfortunately, it doesn't really fit into our closest KPI, i.e., zone(9). [2] We always tried our best to *fully* implement OSL but it is not an easy task. :-( Jung-uk Kim 1. For the official ACPICA OS-dependent API, please see "ACPI Component Architecture User Guide and Programmer Reference". You can get it from here: https://www.acpica.org/documentation/ 2. There were some patches but I am not really comfortable with any of these patches yet. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (FreeBSD) iQEcBAEBAgAGBQJRLl5MAAoJECXpabHZMqHOyi0IAMbzAggbm+XRlVeSFaEtZpvc 6VyceBmTh/OBgO8rdUEXbWuY/CpyQixYBlKIowDa+vJrzhAbA1louywWRvLXlfCc sbw6yGsX8gMbucU648duTDTePw80JxMLs/Rl7aSXm4Rq+wVNRlnBzs/pOrLjdhfU 0ChK+atphQED9DKNfa7aYAlkANaQ6pDgI03E8Te8Bu5zeflaaSpj2rE7VLlXH/kK XBbO+83Tsy7/gBdWqdTXtVP2FQQvg39M932ZeD0qFaefd25R9yVr6UppqIF4BtIO dq9yavmZbkmkM9bstWPdu6D8pV9UlsbyAk6dseXNwpiL1adkacAsigwcXoSa6mE= =o9HQ -----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?512E5E4C.807>