Skip to contentSkip to conversation

cbus-retu: Add locking around register access in irq handler

PATCH In review Michael Buesch 3 participants 3 messages Feb 28, 2011 – Mar 1, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cbus-retu: Add locking around register access in irq handler

This adds locking around the register access in the interrupt service routine.

---

drivers/cbus/retu.c +3 -1
Index: linux-omap-2.6/drivers/cbus/retu.c
===================================================================
@@ -198,10 +198,12 @@ static irqreturn_t retu_irq_handler(int
 	u16			idr;
 	u16			imr;
 
+	mutex_lock(&retu->mutex);
 	idr = __retu_read_reg(retu, RETU_REG_IDR);
 	imr = __retu_read_reg(retu, RETU_REG_IMR);
-	idr &= ~imr;
+	mutex_unlock(&retu->mutex);
 
+	idr &= ~imr;
 	if (!idr) {
 		dev_vdbg(retu->dev, "No IRQ, spurious?\n");
 		return IRQ_NONE;
#2 lore raw
Quoted 8 lines · Felipe Balbi
Quoted 5 lines · Michael Buesch

This adds locking around the register access in the interrupt service routine.

Fine by me. Tony, you can apply.

Only applied the first two to add the register defines because of:

BUG: sleeping function called from invalid context at kernel/mutex.c:278

in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper
INFO: lockdep is turned off.
[<c0063c24>] (unwind_backtrace+0x0/0xec) from [<c0402f98>] (mutex_lock_nested+0x24/0x340) [<c0402f98>] (mutex_lock_nested+0x24/0x340) from [<c032b4e4>] (retu_write_reg+0x20/0x3c) [<c032b4e4>] (retu_write_reg+0x20/0x3c) from [<c032bc4c>] (_retu_modify_counter+0x28/0x34) [<c032bc4c>] (_retu_modify_counter+0x28/0x34) from [<c032be48>] (retu_wdt_set_ping_timer+0x10/0x50) [<c032be48>] (retu_wdt_set_ping_timer+0x10/0x50) from [<c00a2000>] (run_timer_softirq+0x260/0x368) [<c00a2000>] (run_timer_softirq+0x260/0x368) from [<c009bdb8>] (__do_softirq+0xe8/0x1e0) [<c009bdb8>] (__do_softirq+0xe8/0x1e0) from [<c009bf04>] (irq_exit+0x54/0xa0) [<c009bf04>] (irq_exit+0x54/0xa0) from [<c0052090>] (asm_do_IRQ+0x90/0xcc) [<c0052090>] (asm_do_IRQ+0x90/0xcc) from [<c0404adc>] (__irq_svc+0x3c/0x100)

Tony