Thread (5 messages) 5 messages, 2 authors, 2011-02-28

[PATCH v5 1/2] PRUSS UIO driver support

From: Thomas Gleixner <hidden>
Date: 2011-02-25 09:54:48
Also in: lkml

On Fri, 25 Feb 2011, Pratheesh Gangadhar wrote:
+static irqreturn_t pruss_handler(int irq, struct uio_info *dev_info)
+{
+	void __iomem *base = dev_info->mem[0].internal_addr;
+	void __iomem *intren_reg = base + PINTC_HIER;
+	void __iomem *intrstat_reg = base + PINTC_HIPIR + ((irq - 1) << 2);
+	int val = ioread32(intren_reg), intr_mask = (1 << (irq - 1));
+
+	/* Is interrupt enabled and active ? */
+	if (!(val & intr_mask) && (ioread32(intrstat_reg) & HIPIR_NOPEND))
+		return IRQ_NONE;
+
+	/* Disable interrupt */
+	iowrite32((val & ~intr_mask), intren_reg);
+	return IRQ_HANDLED;
+}
Hmm, just noticed, that you fiddle with the interrupt enable register
here totally unprotected. So on a SMP system you might haandle two
different interrupts at the same time. That wants locking.

And even on UP, you have a problem as you reenable that thing from
user space which requires a read modify write. Racy as hell.

Please look at the other UIO drivers which have the same problem.
Sorry for not noticing earlier!

Thanks,

	tglx
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help