Subject: [PATCH] When complaining about attempting to set the irq affinity to multiple cpus,

From: Mark Mason <[email-masked]>
Date: Mon, 21 Sep 2009 14:13:24 -0700

---
 arch/mips/sibyte/bcm1480/irq.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c
index ba59839..fc87ea4 100644
--- a/arch/mips/sibyte/bcm1480/irq.c
+++ b/arch/mips/sibyte/bcm1480/irq.c
@@ -118,7 +118,11 @@ static int bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask)
 	unsigned int irq_dirty;
 
 	if (cpumask_weight(mask) != 1) {
-		printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq);
+		printk("attempted to set irq affinity for irq %d to multiple CPUs:", irq);
+		/* Print the mask */
+		for_each_cpu(i, mask)
+			printk(" %d", i);
+		printk("\n");
 		return -1;
 	}
 	i = cpumask_first(mask);
-- 
1.6.0.2

---

From: Ralf Baechle <[email-masked]>
Date: Wed, 23 Sep 2009 21:50:04 +0100

> +		printk("attempted to set irq affinity for irq %d to multiple CPUs:", irq);

The whole if block is a zombie that was supposed to have been
removed by commit 14275ccdb1e4b487cca745aba994699c426a31ee but then
returned in 92241940be501f798cb21db344bbb3d1ec3c4f1c.  So I went for a
slightly different patch, see below.

Thanks,

  Ralf

MIPS: BCM1480: Re-apply patch lost due to bad resolution of merge conflict.

Patch 14275ccdb1e4b487cca745aba994699c426a31ee and
d5dedd4507d307eb3f35f21b6e16f336fdc0d82a are conflicting and the
conflict was resolved badly in merge
92241940be501f798cb21db344bbb3d1ec3c4f1c resulting in the BCM1480 changes
of 14275ccdb1e4b487cca745aba994699c426a31ee getting lost.  Sort out the
damage.

Reported and initial patch by Mark Mason <[email-masked]>.

Signed-off-by: Ralf Baechle <[email-masked]>

diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c
index ba59839..4070268 100644
--- a/arch/mips/sibyte/bcm1480/irq.c
+++ b/arch/mips/sibyte/bcm1480/irq.c
@@ -117,10 +117,6 @@ static int bcm1480_set_affinity(unsigned int irq, const struct cpumask *mask)
 	unsigned long flags;
 	unsigned int irq_dirty;
 
-	if (cpumask_weight(mask) != 1) {
-		printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq);
-		return -1;
-	}
 	i = cpumask_first(mask);
 
 	/* Convert logical CPU to physical CPU */

---

From: Ralf Baechle <[email-masked]>
Date: Wed, 23 Sep 2009 22:24:01 +0100

On Wed, Sep 23, 2009 at 02:09:34PM -0700, Mark E Mason wrote:

> Did we ever figure out why the kernel was attempting to set the affinity to more than one CPU? The hardware certainly supports doing that (but we're not at the moment).

The hardware semantics is a bit ususual.  On Sibyte the hardware will
route an interrupt to all CPUs set in the affinity mask.  On most other
systems that I'm aware of it will route the interrupt to only one of
CPUs selected by irq_chip->set_affinity().  We don't want such an
stampede so the Sibyte interrupt code clears all but the lowest set
bit from the set_affinity() argument.  Either way, attempting to set
the mask to an arbitrary non-empty set is entirely legal so the warning
itself was a bug and the volume potencially made them a real problem for
a few users.

  Ralf