aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/utmutex.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2013-04-11 20:25:41 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-04-12 07:29:48 -0400
commit58892c962a0f8b7187b036e787223365864bde3f (patch)
treefcf84c2f3f4152331aa0536e0819f3067fa3b369 /drivers/acpi/acpica/utmutex.c
parent475df486f5191ce0671b99aff029b38bff7a72f1 (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.c9
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