Commit d87af207 authored by Keith Owens's avatar Keith Owens Committed by David Mosberger

[PATCH] ia64: Convert cmc deadlock avoidance patch from 2.4 to 2.6

parent d1df9cdc
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/tqueue.h> #include <linux/workqueue.h>
#include <asm/delay.h> #include <asm/delay.h>
#include <asm/machvec.h> #include <asm/machvec.h>
...@@ -158,8 +158,6 @@ static int cpe_poll_enabled = 1; ...@@ -158,8 +158,6 @@ static int cpe_poll_enabled = 1;
extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size); extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size);
static struct tq_struct cmc_disable_tq, cmc_enable_tq;
/* /*
* ia64_mca_log_sal_error_record * ia64_mca_log_sal_error_record
* *
...@@ -622,14 +620,11 @@ verify_guid (efi_guid_t *test, efi_guid_t *target) ...@@ -622,14 +620,11 @@ verify_guid (efi_guid_t *test, efi_guid_t *target)
* *
* Called via keventd (smp_call_function() is not safe in interrupt context) to * Called via keventd (smp_call_function() is not safe in interrupt context) to
* disable the cmc interrupt vector. * disable the cmc interrupt vector.
*
* Note: needs preempt_disable() if you apply the preempt patch to 2.4.
*/ */
static void static void
ia64_mca_cmc_vector_disable_keventd(void *unused) ia64_mca_cmc_vector_disable_keventd(void *unused)
{ {
ia64_mca_cmc_vector_disable(NULL); on_each_cpu(ia64_mca_cmc_vector_disable, NULL, 1, 0);
smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 0);
} }
/* /*
...@@ -637,14 +632,11 @@ ia64_mca_cmc_vector_disable_keventd(void *unused) ...@@ -637,14 +632,11 @@ ia64_mca_cmc_vector_disable_keventd(void *unused)
* *
* Called via keventd (smp_call_function() is not safe in interrupt context) to * Called via keventd (smp_call_function() is not safe in interrupt context) to
* enable the cmc interrupt vector. * enable the cmc interrupt vector.
*
* Note: needs preempt_disable() if you apply the preempt patch to 2.4.
*/ */
static void static void
ia64_mca_cmc_vector_enable_keventd(void *unused) ia64_mca_cmc_vector_enable_keventd(void *unused)
{ {
smp_call_function(ia64_mca_cmc_vector_enable, NULL, 1, 0); on_each_cpu(ia64_mca_cmc_vector_enable, NULL, 1, 0);
ia64_mca_cmc_vector_enable(NULL);
} }
/* /*
...@@ -680,9 +672,6 @@ ia64_mca_init(void) ...@@ -680,9 +672,6 @@ ia64_mca_init(void)
IA64_MCA_DEBUG("ia64_mca_init: begin\n"); IA64_MCA_DEBUG("ia64_mca_init: begin\n");
INIT_TQUEUE(&cmc_disable_tq, ia64_mca_cmc_vector_disable_keventd, NULL);
INIT_TQUEUE(&cmc_enable_tq, ia64_mca_cmc_vector_enable_keventd, NULL);
/* initialize recovery success indicator */ /* initialize recovery success indicator */
ia64_os_mca_recovery_successful = 0; ia64_os_mca_recovery_successful = 0;
...@@ -1055,6 +1044,9 @@ ia64_mca_ucmc_handler(void) ...@@ -1055,6 +1044,9 @@ ia64_mca_ucmc_handler(void)
ia64_return_to_sal_check(); ia64_return_to_sal_check();
} }
static DECLARE_WORK(cmc_disable_work, ia64_mca_cmc_vector_disable_keventd, NULL);
static DECLARE_WORK(cmc_enable_work, ia64_mca_cmc_vector_enable_keventd, NULL);
/* /*
* ia64_mca_cmc_int_handler * ia64_mca_cmc_int_handler
* *
...@@ -1101,7 +1093,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs) ...@@ -1101,7 +1093,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs)
cmc_polling_enabled = 1; cmc_polling_enabled = 1;
spin_unlock(&cmc_history_lock); spin_unlock(&cmc_history_lock);
schedule_task(&cmc_disable_tq); schedule_work(&cmc_disable_work);
/* /*
* Corrected errors will still be corrected, but * Corrected errors will still be corrected, but
...@@ -1196,7 +1188,7 @@ ia64_mca_cmc_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs) ...@@ -1196,7 +1188,7 @@ ia64_mca_cmc_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) { if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) {
printk(KERN_WARNING "%s: Returning to interrupt driven CMC handler\n", __FUNCTION__); printk(KERN_WARNING "%s: Returning to interrupt driven CMC handler\n", __FUNCTION__);
schedule_task(&cmc_enable_tq); schedule_work(&cmc_enable_work);
cmc_polling_enabled = 0; cmc_polling_enabled = 0;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment