[PATCH] acpi/rt: convert acpi_gbl_gpe_lock to raw spinlock

From: Aaron Sierra
Date: Wed Nov 30 2016 - 14:52:17 EST


When testing GPE interrupts with CONFIG_PREEMPT_RT_FULL enabled, a
verbose WARN_ONCE message would print to the kernel log. It turned out
that the GPE interrupt handler was being called with local interrupts
enabled because acpi_gbl_gpe_lock was implemented as a spinlock_t. Full
preemption strips local interrupt disabling from spinlock_t operations,
but not for raw_spinlock_t operations.

This is the warning that was triggered:

------------[ cut here ]------------
WARNING: CPU: 8 PID: 483 at kernel/irq/handle.c:149 __handle_irq_event_percpu+0x6f/0xcf
irq 33 handler irq_default_primary_handler+0x0/0xb enabled interrupts
Modules linked in: gpio_irq_demo(O)
CPU: 8 PID: 483 Comm: irq/9-acpi Tainted: G O 4.8.6-rt5-00012-geaa3b7c #6
Hardware name: Extreme Engineering Solutions, Inc. XCalibur4643/XCalibur4643, BIOS 1-1.1.12.3_Alpha 04/29/2016
0000000000000000 ffff880858f3bc10 ffffffff81219a93 ffff880858f3bc60
0000000000000000 ffff880858f3bc50 ffffffff8104b84a 0000009500000000
ffff880855b76880 0000000000000021 0000000000000002 ffff880856356800
Call Trace:
[<ffffffff81219a93>] dump_stack+0x4d/0x63
[<ffffffff8104b84a>] __warn+0xc0/0xdb
[<ffffffff8104b8af>] warn_slowpath_fmt+0x4a/0x4c
[<ffffffff810f7192>] ? path_openat+0xbf8/0xc62
[<ffffffff8107d7c3>] ? handle_irq_event+0x75/0x75
[<ffffffff8107d68d>] __handle_irq_event_percpu+0x6f/0xcf
[<ffffffff8107d727>] handle_irq_event_percpu+0x3a/0x61
[<ffffffff8107d7a3>] handle_irq_event+0x55/0x75
[<ffffffff8107ff76>] handle_simple_irq+0x5c/0x92
[<ffffffff81243a53>] gpe_irq_handler+0x2a/0x31
[<ffffffff81281090>] acpi_ev_gpe_dispatch+0xb1/0x125
[<ffffffff81281259>] acpi_ev_gpe_detect+0x155/0x1a2
[<ffffffff8107e423>] ? irq_thread_fn+0x2f/0x2f
[<ffffffff81283125>] acpi_ev_sci_xrupt_handler+0x1d/0x35
[<ffffffff8126f02e>] acpi_irq+0x11/0x2c
[<ffffffff8107e441>] irq_forced_thread_fn+0x1e/0x4a
[<ffffffff8107e668>] irq_thread+0xe0/0x19b
[<ffffffff815fc594>] ? __schedule+0x262/0x310
[<ffffffff8107e4f2>] ? wake_threads_waitq+0x28/0x28
[<ffffffff8107e588>] ? irq_thread_dtor+0x96/0x96
[<ffffffff81061aa4>] kthread+0xcd/0xd5
[<ffffffff815fef7f>] ret_from_fork+0x1f/0x40
[<ffffffff810619d7>] ? kthread_worker_fn+0xe8/0xe8
---[ end trace 0000000000000002 ]---

Signed-off-by: Aaron Sierra <asierra@xxxxxxxxxxx>
---
drivers/acpi/acpica/acglobal.h | 2 +-
drivers/acpi/acpica/evgpe.c | 15 +++++++--------
drivers/acpi/acpica/evgpeblk.c | 8 ++++----
drivers/acpi/acpica/evgpeutil.c | 12 ++++++------
drivers/acpi/acpica/evsci.c | 8 ++++----
drivers/acpi/acpica/evxface.c | 22 +++++++++++-----------
drivers/acpi/acpica/evxfgpe.c | 36 ++++++++++++++++++------------------
drivers/acpi/acpica/utmutex.c | 4 ++--
8 files changed, 53 insertions(+), 54 deletions(-)

diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
index bda5232..c52d093 100644
--- a/drivers/acpi/acpica/acglobal.h
+++ b/drivers/acpi/acpica/acglobal.h
@@ -115,7 +115,7 @@ ACPI_GLOBAL(u8, acpi_gbl_global_lock_pending);
* Spinlocks are used for interfaces that can be possibly called at
* interrupt level
*/
-ACPI_GLOBAL(acpi_spinlock, acpi_gbl_gpe_lock); /* For GPE data structs and registers */
+ACPI_GLOBAL(acpi_raw_spinlock, acpi_gbl_gpe_lock); /* For GPE data structs and registers */
ACPI_GLOBAL(acpi_raw_spinlock, acpi_gbl_hardware_lock); /* For ACPI H/W except GPE registers */
ACPI_GLOBAL(acpi_spinlock, acpi_gbl_reference_count_lock);

diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c
index 4b4949c..ee97308 100644
--- a/drivers/acpi/acpica/evgpe.c
+++ b/drivers/acpi/acpica/evgpe.c
@@ -355,7 +355,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list)
* Note: Not necessary to obtain the hardware lock, since the GPE
* registers are owned by the gpe_lock.
*/
- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Examine all GPE blocks attached to this interrupt level */

@@ -479,7 +479,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list)
* acpi_os_wait_events_complete() before the
* destruction.
*/
- acpi_os_release_lock
+ raw_spin_unlock_irqrestore
(acpi_gbl_gpe_lock, flags);
int_status |=
gpe_handler_info->
@@ -487,9 +487,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list)
gpe_number,
gpe_handler_info->
context);
- flags =
- acpi_os_acquire_lock
- (acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(
+ acpi_gbl_gpe_lock, flags);
} else {
/*
* Dispatch the event to a standard handler or
@@ -509,7 +508,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list)

unlock_and_exit:

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return (int_status);
}

@@ -631,9 +630,9 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_enable_gpe(void *context)
struct acpi_gpe_event_info *gpe_event_info = context;
acpi_cpu_flags flags;

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);
(void)acpi_ev_finish_gpe(gpe_event_info);
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

return;
}
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c
index d54014c..131050c 100644
--- a/drivers/acpi/acpica/evgpeblk.c
+++ b/drivers/acpi/acpica/evgpeblk.c
@@ -95,7 +95,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,

/* Install the new block at the end of the list with lock */

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);
if (gpe_xrupt_block->gpe_block_list_head) {
next_gpe_block = gpe_xrupt_block->gpe_block_list_head;
while (next_gpe_block->next) {
@@ -109,7 +109,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
}

gpe_block->xrupt_block = gpe_xrupt_block;
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

unlock_and_exit:
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
@@ -156,7 +156,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
} else {
/* Remove the block on this interrupt with lock */

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);
if (gpe_block->previous) {
gpe_block->previous->next = gpe_block->next;
} else {
@@ -168,7 +168,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
gpe_block->next->previous = gpe_block->previous;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
}

acpi_current_gpe_count -= gpe_block->gpe_count;
diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c
index 3f150d5..5852fce 100644
--- a/drivers/acpi/acpica/evgpeutil.c
+++ b/drivers/acpi/acpica/evgpeutil.c
@@ -71,7 +71,7 @@ acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context)

ACPI_FUNCTION_TRACE(ev_walk_gpe_list);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Walk the interrupt level descriptor list */

@@ -102,7 +102,7 @@ acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context)
}

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -195,7 +195,7 @@ acpi_ev_get_gpe_xrupt_block(u32 interrupt_number,

/* Install new interrupt descriptor with spin lock */

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);
if (acpi_gbl_gpe_xrupt_list_head) {
next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head;
while (next_gpe_xrupt->next) {
@@ -208,7 +208,7 @@ acpi_ev_get_gpe_xrupt_block(u32 interrupt_number,
acpi_gbl_gpe_xrupt_list_head = gpe_xrupt;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

/* Install new interrupt handler if not SCI_INT */

@@ -266,7 +266,7 @@ acpi_status acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)

/* Unlink the interrupt block with lock */

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);
if (gpe_xrupt->previous) {
gpe_xrupt->previous->next = gpe_xrupt->next;
} else {
@@ -278,7 +278,7 @@ acpi_status acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
if (gpe_xrupt->next) {
gpe_xrupt->next->previous = gpe_xrupt->previous;
}
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

/* Free the block */

diff --git a/drivers/acpi/acpica/evsci.c b/drivers/acpi/acpica/evsci.c
index 3b7757c..e60c0b8 100644
--- a/drivers/acpi/acpica/evsci.c
+++ b/drivers/acpi/acpica/evsci.c
@@ -78,7 +78,7 @@ u32 acpi_ev_sci_dispatch(void)
return (int_status);
}

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Invoke all host-installed SCI handlers */

@@ -92,7 +92,7 @@ u32 acpi_ev_sci_dispatch(void)
sci_handler = sci_handler->next;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return (int_status);
}

@@ -233,7 +233,7 @@ acpi_status acpi_ev_remove_all_sci_handlers(void)
return (status);
}

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Free all host-installed SCI handlers */

@@ -243,7 +243,7 @@ acpi_status acpi_ev_remove_all_sci_handlers(void)
ACPI_FREE(sci_handler);
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c
index e4e9260..36c5661 100644
--- a/drivers/acpi/acpica/evxface.c
+++ b/drivers/acpi/acpica/evxface.c
@@ -450,7 +450,7 @@ acpi_status acpi_install_sci_handler(acpi_sci_handler address, void *context)

/* Lock list during installation */

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);
sci_handler = acpi_gbl_sci_handler_list;

/* Ensure handler does not already exist */
@@ -471,7 +471,7 @@ acpi_status acpi_install_sci_handler(acpi_sci_handler address, void *context)

unlock_and_exit:

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);

exit:
@@ -514,7 +514,7 @@ acpi_status acpi_remove_sci_handler(acpi_sci_handler address)

/* Remove the SCI handler with lock */

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

prev_sci_handler = NULL;
next_sci_handler = acpi_gbl_sci_handler_list;
@@ -530,7 +530,7 @@ acpi_status acpi_remove_sci_handler(acpi_sci_handler address)
next_sci_handler->next;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
ACPI_FREE(next_sci_handler);
goto unlock_and_exit;
}
@@ -539,7 +539,7 @@ acpi_status acpi_remove_sci_handler(acpi_sci_handler address)
next_sci_handler = next_sci_handler->next;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
status = AE_NOT_EXIST;

unlock_and_exit:
@@ -779,7 +779,7 @@ acpi_ev_install_gpe_handler(acpi_handle gpe_device,
goto unlock_and_exit;
}

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -840,14 +840,14 @@ acpi_ev_install_gpe_handler(acpi_handle gpe_device,
(is_raw_handler ? ACPI_GPE_DISPATCH_RAW_HANDLER :
ACPI_GPE_DISPATCH_HANDLER));

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

unlock_and_exit:
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
return_ACPI_STATUS(status);

free_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
ACPI_FREE(handler);
goto unlock_and_exit;
}
@@ -957,7 +957,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
return_ACPI_STATUS(status);
}

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -1008,7 +1008,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
(void)acpi_ev_add_gpe_reference(gpe_event_info);
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);

/* Make sure all deferred GPE tasks are completed */
@@ -1021,7 +1021,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
return_ACPI_STATUS(status);

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
return_ACPI_STATUS(status);
diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c
index 17cfef7..5854bd9 100644
--- a/drivers/acpi/acpica/evxfgpe.c
+++ b/drivers/acpi/acpica/evxfgpe.c
@@ -123,7 +123,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number)

ACPI_FUNCTION_TRACE(acpi_enable_gpe);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/*
* Ensure that we have a valid GPE number and that there is some way
@@ -140,7 +140,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number)
}
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}
ACPI_EXPORT_SYMBOL(acpi_enable_gpe)
@@ -168,7 +168,7 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number)

ACPI_FUNCTION_TRACE(acpi_disable_gpe);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -177,7 +177,7 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number)
status = acpi_ev_remove_gpe_reference(gpe_event_info) ;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -219,7 +219,7 @@ acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action)

ACPI_FUNCTION_TRACE(acpi_set_gpe);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -249,7 +249,7 @@ acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action)
}

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -283,7 +283,7 @@ acpi_status acpi_mark_gpe_for_wake(acpi_handle gpe_device, u32 gpe_number)

ACPI_FUNCTION_TRACE(acpi_mark_gpe_for_wake);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -296,7 +296,7 @@ acpi_status acpi_mark_gpe_for_wake(acpi_handle gpe_device, u32 gpe_number)
status = AE_OK;
}

- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -368,7 +368,7 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device,
return_ACPI_STATUS(AE_NO_MEMORY);
}

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -426,7 +426,7 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device,
status = AE_OK;

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);

/* Delete the notify object if it was not used above */

@@ -463,7 +463,7 @@ acpi_set_gpe_wake_mask(acpi_handle gpe_device, u32 gpe_number, u8 action)

ACPI_FUNCTION_TRACE(acpi_set_gpe_wake_mask);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/*
* Ensure that we have a valid GPE number and that this GPE is in
@@ -511,7 +511,7 @@ acpi_set_gpe_wake_mask(acpi_handle gpe_device, u32 gpe_number, u8 action)
}

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -537,7 +537,7 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number)

ACPI_FUNCTION_TRACE(acpi_clear_gpe);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -550,7 +550,7 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number)
status = acpi_hw_clear_gpe(gpe_event_info);

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -580,7 +580,7 @@ acpi_get_gpe_status(acpi_handle gpe_device,

ACPI_FUNCTION_TRACE(acpi_get_gpe_status);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -595,7 +595,7 @@ acpi_get_gpe_status(acpi_handle gpe_device,
status = acpi_hw_get_gpe_status(gpe_event_info, event_status);

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

@@ -625,7 +625,7 @@ acpi_status acpi_finish_gpe(acpi_handle gpe_device, u32 gpe_number)

ACPI_FUNCTION_TRACE(acpi_finish_gpe);

- flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
+ raw_spin_lock_irqsave(acpi_gbl_gpe_lock, flags);

/* Ensure that we have a valid GPE number */

@@ -638,7 +638,7 @@ acpi_status acpi_finish_gpe(acpi_handle gpe_device, u32 gpe_number)
status = acpi_ev_finish_gpe(gpe_event_info);

unlock_and_exit:
- acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
+ raw_spin_unlock_irqrestore(acpi_gbl_gpe_lock, flags);
return_ACPI_STATUS(status);
}

diff --git a/drivers/acpi/acpica/utmutex.c b/drivers/acpi/acpica/utmutex.c
index 357e7ca..d7257a1 100644
--- a/drivers/acpi/acpica/utmutex.c
+++ b/drivers/acpi/acpica/utmutex.c
@@ -83,7 +83,7 @@ acpi_status acpi_ut_mutex_initialize(void)

/* Create the spinlocks for use at interrupt level or for speed */

- status = acpi_os_create_lock (&acpi_gbl_gpe_lock);
+ status = acpi_os_create_raw_lock (&acpi_gbl_gpe_lock);
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
@@ -144,7 +144,7 @@ void acpi_ut_mutex_terminate(void)

/* Delete the spinlocks */

- acpi_os_delete_lock(acpi_gbl_gpe_lock);
+ acpi_os_delete_raw_lock(acpi_gbl_gpe_lock);
acpi_os_delete_raw_lock(acpi_gbl_hardware_lock);
acpi_os_delete_lock(acpi_gbl_reference_count_lock);

--
1.9.1