ftrace function_graph shows ehca_poll_eqs taking and dropping a spinlock
a lot:
16) | .ehca_poll_eqs() {
16) 0.492 us | ._spin_lock();
16) 0.504 us | ._spin_lock_irqsave();
16) 0.502 us | ._spin_unlock_irqrestore();
16) 0.490 us | ._spin_lock_irqsave();
16) 0.488 us | ._spin_unlock_irqrestore();
16) 0.488 us | ._spin_lock_irqsave();
16) 0.488 us | ._spin_unlock_irqrestore();
16) 0.490 us | ._spin_lock_irqsave();
16) 0.492 us | ._spin_unlock_irqrestore();
Since it's all the same spinlock, we can just take and drop it once.
Signed-off-by: Anton Blanchard <[email protected]>
---
Index: linux.trees.git/drivers/infiniband/hw/ehca/ehca_main.c
===================================================================
--- linux.trees.git.orig/drivers/infiniband/hw/ehca/ehca_main.c 2009-11-27
10:17:29.000000000 +1100
+++ linux.trees.git/drivers/infiniband/hw/ehca/ehca_main.c 2009-11-27
10:19:08.000000000 +1100
@@ -957,15 +957,17 @@ void ehca_poll_eqs(unsigned long data)
int max = 3;
volatile u64 q_ofs, q_ofs2;
unsigned long flags;
+
spin_lock_irqsave(&eq->spinlock, flags);
+
q_ofs = eq->ipz_queue.current_q_offset;
- spin_unlock_irqrestore(&eq->spinlock, flags);
do {
- spin_lock_irqsave(&eq->spinlock, flags);
q_ofs2 = eq->ipz_queue.current_q_offset;
- spin_unlock_irqrestore(&eq->spinlock, flags);
max--;
} while (q_ofs == q_ofs2 && max > 0);
+
+ spin_unlock_irqrestore(&eq->spinlock, flags);
+
if (q_ofs == q_ofs2)
ehca_process_eq(shca, 0);
}
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html