* [PATCH 5/8] ipmi: Reduce polling when interrupts are available
@ 2010-05-03 13:36 Corey Minyard
0 siblings, 0 replies; only message in thread
From: Corey Minyard @ 2010-05-03 13:36 UTC (permalink / raw)
To: Linux Kernel, Andrew Morton; +Cc: OpenIPMI Developers, Matthew Garrett
From: Matthew Garrett <mjg@redhat.com>
If we're not currently in the middle of a transaction, and if we have
interrupts, there's no real reason to poll the controller more frequently
than the core IPMI code does. Set the interrupt_disabled flag appropriately
as the interrupt state changes, and make the timeout code reset itself
only if the transaction is incomplete or we have no interrupts.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
---
Index: linux-2.6/drivers/char/ipmi/ipmi_si_intf.c
===================================================================
--- linux-2.6.orig/drivers/char/ipmi/ipmi_si_intf.c
+++ linux-2.6/drivers/char/ipmi/ipmi_si_intf.c
@@ -453,6 +453,9 @@ static inline void disable_si_irq(struct
if ((smi_info->irq) && (!smi_info->interrupt_disabled)) {
start_disable_irq(smi_info);
smi_info->interrupt_disabled = 1;
+ if (!atomic_read(&smi_info->stop_operation))
+ mod_timer(&smi_info->si_timer,
+ jiffies + SI_TIMEOUT_JIFFIES);
}
}
@@ -705,6 +708,8 @@ static void handle_transaction_done(stru
printk(KERN_WARNING
"ipmi_si: Could not enable interrupts"
", failed set, using polled mode.\n");
+ } else {
+ smi_info->interrupt_disabled = 0;
}
smi_info->si_state = SI_NORMAL;
break;
@@ -885,6 +890,8 @@ static void sender(void *
printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec);
#endif
+ mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES);
+
if (smi_info->run_to_completion) {
/*
* If we are running to completion, then throw it in
@@ -1085,7 +1092,8 @@ static void smi_timeout(unsigned long da
}
do_add_timer:
- add_timer(&(smi_info->si_timer));
+ if ((smi_result != SI_SM_IDLE) || smi_info->interrupt_disabled)
+ add_timer(&(smi_info->si_timer));
}
static irqreturn_t si_irq_handler(int irq, void *data)
@@ -3115,7 +3123,7 @@ static int try_smi_init(struct smi_info
for (i = 0; i < SI_NUM_STATS; i++)
atomic_set(&new_smi->stats[i], 0);
- new_smi->interrupt_disabled = 0;
+ new_smi->interrupt_disabled = 1;
atomic_set(&new_smi->stop_operation, 0);
new_smi->intf_num = smi_num;
smi_num++;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2010-05-03 13:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-03 13:36 [PATCH 5/8] ipmi: Reduce polling when interrupts are available Corey Minyard
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.