MFV: r237650

Do not malloc(9) while holding a spin lock, to avoid panic.

Reported by:	kib (and many others)
Tested by:	kib (and many others)
This commit is contained in:
Jung-uk Kim 2012-06-27 16:15:13 +00:00
commit 3e2c973410
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=237652

View File

@ -298,7 +298,7 @@ AcpiSetupGpeForWake (
ACPI_STATUS Status;
ACPI_GPE_EVENT_INFO *GpeEventInfo;
ACPI_NAMESPACE_NODE *DeviceNode;
ACPI_GPE_NOTIFY_INFO *Notify;
ACPI_GPE_NOTIFY_INFO *NewNotify, *Notify;
ACPI_CPU_FLAGS Flags;
@ -334,6 +334,12 @@ AcpiSetupGpeForWake (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
NewNotify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
if (!NewNotify)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
/* Ensure that we have a valid GPE number */
@ -384,16 +390,10 @@ AcpiSetupGpeForWake (
/* Add this device to the notify list for this GPE */
Notify = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_NOTIFY_INFO));
if (!Notify)
{
Status = AE_NO_MEMORY;
goto UnlockAndExit;
}
Notify->DeviceNode = DeviceNode;
Notify->Next = GpeEventInfo->Dispatch.NotifyList;
GpeEventInfo->Dispatch.NotifyList = Notify;
NewNotify->DeviceNode = DeviceNode;
NewNotify->Next = GpeEventInfo->Dispatch.NotifyList;
GpeEventInfo->Dispatch.NotifyList = NewNotify;
NewNotify = NULL;
}
/* Mark the GPE as a possible wake event */
@ -403,6 +403,10 @@ AcpiSetupGpeForWake (
UnlockAndExit:
AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
if (NewNotify)
{
ACPI_FREE (NewNotify);
}
return_ACPI_STATUS (Status);
}