diff options
author | Bob Moore <robert.moore@intel.com> | 2013-04-11 20:25:41 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-04-12 07:29:48 -0400 |
commit | 58892c962a0f8b7187b036e787223365864bde3f (patch) | |
tree | fcf84c2f3f4152331aa0536e0819f3067fa3b369 /drivers/acpi/acpica/utmutex.c | |
parent | 475df486f5191ce0671b99aff029b38bff7a72f1 (diff) |
ACPICA: Add a lock to the internal object reference count mechanism
Certain external interfaces need to update object references
without holding the interpreter or namespace mutex objects. To
prevent race conditions, add a spinlock around the increment
and decrement of the reference counts for internal ACPI
objects. Reported by Andriy Gapon (avg@FreeBSD.org).
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Andriy Gapon <avg@FreeBSD.org>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/utmutex.c')
-rw-r--r-- | drivers/acpi/acpica/utmutex.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/acpi/acpica/utmutex.c b/drivers/acpi/acpica/utmutex.c index 22feb99b8e35..08c323245584 100644 --- a/drivers/acpi/acpica/utmutex.c +++ b/drivers/acpi/acpica/utmutex.c | |||
@@ -81,7 +81,7 @@ acpi_status acpi_ut_mutex_initialize(void) | |||
81 | } | 81 | } |
82 | } | 82 | } |
83 | 83 | ||
84 | /* Create the spinlocks for use at interrupt level */ | 84 | /* Create the spinlocks for use at interrupt level or for speed */ |
85 | 85 | ||
86 | status = acpi_os_create_lock (&acpi_gbl_gpe_lock); | 86 | status = acpi_os_create_lock (&acpi_gbl_gpe_lock); |
87 | if (ACPI_FAILURE (status)) { | 87 | if (ACPI_FAILURE (status)) { |
@@ -93,7 +93,13 @@ acpi_status acpi_ut_mutex_initialize(void) | |||
93 | return_ACPI_STATUS (status); | 93 | return_ACPI_STATUS (status); |
94 | } | 94 | } |
95 | 95 | ||
96 | status = acpi_os_create_lock(&acpi_gbl_reference_count_lock); | ||
97 | if (ACPI_FAILURE(status)) { | ||
98 | return_ACPI_STATUS(status); | ||
99 | } | ||
100 | |||
96 | /* Mutex for _OSI support */ | 101 | /* Mutex for _OSI support */ |
102 | |||
97 | status = acpi_os_create_mutex(&acpi_gbl_osi_mutex); | 103 | status = acpi_os_create_mutex(&acpi_gbl_osi_mutex); |
98 | if (ACPI_FAILURE(status)) { | 104 | if (ACPI_FAILURE(status)) { |
99 | return_ACPI_STATUS(status); | 105 | return_ACPI_STATUS(status); |
@@ -136,6 +142,7 @@ void acpi_ut_mutex_terminate(void) | |||
136 | 142 | ||
137 | acpi_os_delete_lock(acpi_gbl_gpe_lock); | 143 | acpi_os_delete_lock(acpi_gbl_gpe_lock); |
138 | acpi_os_delete_lock(acpi_gbl_hardware_lock); | 144 | acpi_os_delete_lock(acpi_gbl_hardware_lock); |
145 | acpi_os_delete_lock(acpi_gbl_reference_count_lock); | ||
139 | 146 | ||
140 | /* Delete the reader/writer lock */ | 147 | /* Delete the reader/writer lock */ |
141 | 148 | ||