Skip to contentSkip to conversation

fix kirq code for clustered mode

PATCH In review Dave Hansen 2 participants 3 messages Feb 18, 2003 – Feb 20, 2003

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix kirq code for clustered mode

The new kirq code breaks clustered apic mode. This 2-liner fixes it. It should compile down to the same thing, unless you're using a clustered apic sub-arch.

Signature · 2 lines
Dave Hansen
[email protected]
arch/i386/kernel/io_apic.c +2 -2
diff -ru linux-2.5.62-clean/arch/i386/kernel/io_apic.c linux-2.5.62-kirqfix/arch/i386/kernel/io_apic.c
@@ -441,7 +441,7 @@
 		Dprintk("irq = %d moved to cpu = %d\n", selected_irq, min_loaded);
 		/* mark for change destination */
 		spin_lock(&desc->lock);
-		irq_balance_mask[selected_irq] = target_cpu_mask;
+		irq_balance_mask[selected_irq] = cpu_to_logical_apicid(min_loaded);
 		spin_unlock(&desc->lock);
 		/* Since we made a change, come back sooner to 
 		 * check for more variation.
@@ -515,7 +515,7 @@
 	
 	/* push everything to CPU 0 to give us a starting point.  */
 	for (i = 0 ; i < NR_IRQS ; i++)
-		irq_balance_mask[i] = 1 << 0;
+		irq_balance_mask[i] = cpu_to_logical_apicid(0);
 	for (;;) {
 		set_current_state(TASK_INTERRUPTIBLE);
 		time_remaining = schedule_timeout(time_remaining);

Only in linux-2.5.62-kirqfix/arch/i386/kernel: io_apic.c~

#1 lore raw
Quoted 3 lines · Dave Hansen

The new kirq code breaks clustered apic mode. This 2-liner fixes it. It should compile down to the same thing, unless you're using a clustered apic sub-arch.

This isn't quite enough:

static int irq_affinity_write_proc (struct file *file, const char *buffer,
unsigned long count, void *data)

{
	int irq = (long) data, full_count = count, err;
	unsigned long new_value;

	if (!irq_desc[irq].handler->set_affinity)
		return -EIO;

	err = parse_hex_value(buffer, count, &new_value);

	/*
	 * Do not allow disabling IRQs completely - it's a too easy
	 * way to make the system unusable accidentally :-) At least
	 * one online CPU still has to be targeted.
	 */
	if (!(new_value & cpu_online_map))
		return -EINVAL;

	irq_affinity[irq] = new_value;
	irq_desc[irq].handler->set_affinity(irq, new_value);

	return full_count;
}

This is a bitmask and it's being handed directly to set_ioapic_affinity(). Or, at least, it's inconsistent, being &'d with cpu_online_map.

-- wli

#2 lore raw
Quoted 3 lines · Dave Hansen
Quoted 3 lines

The new kirq code breaks clustered apic mode. This 2-liner fixes it. It should compile down to the same thing, unless you're using a clustered apic sub-arch.

Quoted 1 line · William Lee Irwin III

This isn't quite enough:

Also, even with your patch, I get:

Uhhuh. NMI received for unknown reason 25 on CPU 3. Uhhuh. NMI received for unknown reason 35 on CPU 2. Dazed and confused, but trying to continue
...

Hmm... something is going seriously wrong here. I suspect someone is clobbering my RTE's even though no_irq_balance is #defined to 1. Or, worse yet, NMI interrupt gate boogie is going seriously wrong.

-- wli