diff options
Diffstat (limited to 'drivers/acpi/executer/exmutex.c')
-rw-r--r-- | drivers/acpi/executer/exmutex.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c index 4eb883bda6ae..5101bad5baf8 100644 --- a/drivers/acpi/executer/exmutex.c +++ b/drivers/acpi/executer/exmutex.c | |||
@@ -66,9 +66,10 @@ acpi_ex_link_mutex(union acpi_operand_object *obj_desc, | |||
66 | * | 66 | * |
67 | ******************************************************************************/ | 67 | ******************************************************************************/ |
68 | 68 | ||
69 | void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc, | 69 | void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc) |
70 | struct acpi_thread_state *thread) | ||
71 | { | 70 | { |
71 | struct acpi_thread_state *thread = obj_desc->mutex.owner_thread; | ||
72 | |||
72 | if (!thread) { | 73 | if (!thread) { |
73 | return; | 74 | return; |
74 | } | 75 | } |
@@ -173,13 +174,16 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | |||
173 | 174 | ||
174 | /* Support for multiple acquires by the owning thread */ | 175 | /* Support for multiple acquires by the owning thread */ |
175 | 176 | ||
176 | if (obj_desc->mutex.owner_thread_id == acpi_os_get_thread_id()) { | 177 | if (obj_desc->mutex.owner_thread) { |
177 | /* | 178 | if (obj_desc->mutex.owner_thread->thread_id == |
178 | * The mutex is already owned by this thread, just increment the | 179 | walk_state->thread->thread_id) { |
179 | * acquisition depth | 180 | /* |
180 | */ | 181 | * The mutex is already owned by this thread, just increment the |
181 | obj_desc->mutex.acquisition_depth++; | 182 | * acquisition depth |
182 | return_ACPI_STATUS(AE_OK); | 183 | */ |
184 | obj_desc->mutex.acquisition_depth++; | ||
185 | return_ACPI_STATUS(AE_OK); | ||
186 | } | ||
183 | } | 187 | } |
184 | 188 | ||
185 | /* Acquire the mutex, wait if necessary. Special case for Global Lock */ | 189 | /* Acquire the mutex, wait if necessary. Special case for Global Lock */ |
@@ -202,7 +206,7 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | |||
202 | 206 | ||
203 | /* Have the mutex: update mutex and walk info and save the sync_level */ | 207 | /* Have the mutex: update mutex and walk info and save the sync_level */ |
204 | 208 | ||
205 | obj_desc->mutex.owner_thread_id = acpi_os_get_thread_id(); | 209 | obj_desc->mutex.owner_thread = walk_state->thread; |
206 | obj_desc->mutex.acquisition_depth = 1; | 210 | obj_desc->mutex.acquisition_depth = 1; |
207 | obj_desc->mutex.original_sync_level = | 211 | obj_desc->mutex.original_sync_level = |
208 | walk_state->thread->current_sync_level; | 212 | walk_state->thread->current_sync_level; |
@@ -242,7 +246,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
242 | 246 | ||
243 | /* The mutex must have been previously acquired in order to release it */ | 247 | /* The mutex must have been previously acquired in order to release it */ |
244 | 248 | ||
245 | if (!obj_desc->mutex.owner_thread_id) { | 249 | if (!obj_desc->mutex.owner_thread) { |
246 | ACPI_ERROR((AE_INFO, | 250 | ACPI_ERROR((AE_INFO, |
247 | "Cannot release Mutex [%4.4s], not acquired", | 251 | "Cannot release Mutex [%4.4s], not acquired", |
248 | acpi_ut_get_node_name(obj_desc->mutex.node))); | 252 | acpi_ut_get_node_name(obj_desc->mutex.node))); |
@@ -262,14 +266,14 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
262 | * The Mutex is owned, but this thread must be the owner. | 266 | * The Mutex is owned, but this thread must be the owner. |
263 | * Special case for Global Lock, any thread can release | 267 | * Special case for Global Lock, any thread can release |
264 | */ | 268 | */ |
265 | if ((obj_desc->mutex.owner_thread_id != | 269 | if ((obj_desc->mutex.owner_thread->thread_id != |
266 | walk_state->thread->thread_id) | 270 | walk_state->thread->thread_id) |
267 | && (obj_desc->mutex.os_mutex != acpi_gbl_global_lock_mutex)) { | 271 | && (obj_desc->mutex.os_mutex != acpi_gbl_global_lock_mutex)) { |
268 | ACPI_ERROR((AE_INFO, | 272 | ACPI_ERROR((AE_INFO, |
269 | "Thread %lX cannot release Mutex [%4.4s] acquired by thread %lX", | 273 | "Thread %lX cannot release Mutex [%4.4s] acquired by thread %lX", |
270 | (unsigned long)walk_state->thread->thread_id, | 274 | (unsigned long)walk_state->thread->thread_id, |
271 | acpi_ut_get_node_name(obj_desc->mutex.node), | 275 | acpi_ut_get_node_name(obj_desc->mutex.node), |
272 | (unsigned long)obj_desc->mutex.owner_thread_id)); | 276 | (unsigned long)obj_desc->mutex.owner_thread->thread_id)); |
273 | return_ACPI_STATUS(AE_AML_NOT_OWNER); | 277 | return_ACPI_STATUS(AE_AML_NOT_OWNER); |
274 | } | 278 | } |
275 | 279 | ||
@@ -296,7 +300,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
296 | 300 | ||
297 | /* Unlink the mutex from the owner's list */ | 301 | /* Unlink the mutex from the owner's list */ |
298 | 302 | ||
299 | acpi_ex_unlink_mutex(obj_desc, walk_state->thread); | 303 | acpi_ex_unlink_mutex(obj_desc); |
300 | 304 | ||
301 | /* Release the mutex, special case for Global Lock */ | 305 | /* Release the mutex, special case for Global Lock */ |
302 | 306 | ||
@@ -308,7 +312,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
308 | 312 | ||
309 | /* Update the mutex and restore sync_level */ | 313 | /* Update the mutex and restore sync_level */ |
310 | 314 | ||
311 | obj_desc->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED; | 315 | obj_desc->mutex.owner_thread = NULL; |
312 | walk_state->thread->current_sync_level = | 316 | walk_state->thread->current_sync_level = |
313 | obj_desc->mutex.original_sync_level; | 317 | obj_desc->mutex.original_sync_level; |
314 | 318 | ||
@@ -363,7 +367,7 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread) | |||
363 | 367 | ||
364 | /* Mark mutex unowned */ | 368 | /* Mark mutex unowned */ |
365 | 369 | ||
366 | obj_desc->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED; | 370 | obj_desc->mutex.owner_thread = NULL; |
367 | 371 | ||
368 | /* Update Thread sync_level (Last mutex is the important one) */ | 372 | /* Update Thread sync_level (Last mutex is the important one) */ |
369 | 373 | ||