* x86: interrupt routing question
@ 2011-07-12 7:27 Mike Galbraith
2011-09-28 7:28 ` Mike Galbraith
0 siblings, 1 reply; 4+ messages in thread
From: Mike Galbraith @ 2011-07-12 7:27 UTC (permalink / raw)
To: LKML; +Cc: Thomas Gleixner
Greetings,
I have an x3550 M3 box which shows different behavior than my Q6600
desktop box. The below is the rt kernel, but it doesn't matter which
kernel I boot, all interrupts are on CPU0 unless I move them. On Q6600
box, IRQs magically appear on every cpu in the affinity mask. Change
the eth0 mask while flood pinging, numbers start/stop changing on the
fly.
On x3550 M3, setting eg IRQ 63's mask to '0xe' will move irq to CPU2,
but nothing that I have found will make the thing behave the same as
trusty old Q6600 box, which seems strange. Is this some kind of BIOS
thingie, or is every kernel busted on this hardware? Busted kernel
seems highly doubtful.
OT question. I have HT turned off on the x3550 because I do rt testing
on it, and occasionally boot idle=poll. Is it still the case that you
should not run idle=poll with HT enabled, or can you do that with HT
these days (E5620 CPU) without munching too many cycles?
CPU0 CPU1 CPU2 CPU3
0: 132 0 0 0 IO-APIC-edge timer
1: 0 0 0 0 IO-APIC-edge i8042
3: 1 0 0 0 IO-APIC-edge
4: 1 0 0 0 IO-APIC-edge
8: 26 0 0 0 IO-APIC-edge rtc0
9: 0 0 0 0 IO-APIC-fasteoi acpi
14: 0 0 0 0 IO-APIC-edge ata_piix
15: 0 0 0 0 IO-APIC-edge ata_piix
16: 5450 0 0 0 IO-APIC-fasteoi megasas
17: 52 0 0 0 IO-APIC-fasteoi ehci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb5
18: 0 0 0 0 IO-APIC-fasteoi uhci_hcd:usb4, uhci_hcd:usb6
19: 61939 0 0 0 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb7
21: 0 0 0 0 IO-APIC-fasteoi ata_piix
54: 3 0 0 0 PCI-MSI-edge ioat-msix
55: 3 0 0 0 PCI-MSI-edge ioat-msix
56: 3 0 0 0 PCI-MSI-edge ioat-msix
57: 3 0 0 0 PCI-MSI-edge ioat-msix
58: 3 0 0 0 PCI-MSI-edge ioat-msix
59: 3 0 0 0 PCI-MSI-edge ioat-msix
60: 3 0 0 0 PCI-MSI-edge ioat-msix
61: 3 0 0 0 PCI-MSI-edge ioat-msix
62: 178 0 0 0 PCI-MSI-edge eth1-0
63: 6327232 0 0 0 PCI-MSI-edge eth1-1
64: 73 0 0 0 PCI-MSI-edge eth1-2
65: 6327230 0 0 0 PCI-MSI-edge eth1-3
66: 2 0 0 0 PCI-MSI-edge eth1-4
NMI: 0 0 0 0 Non-maskable interrupts
LOC: 2096607 2366453 260343 2225391 Local timer interrupts
SPU: 0 0 0 0 Spurious interrupts
PMI: 0 0 0 0 Performance monitoring interrupts
PND: 0 0 0 0 Performance pending work
RES: 1981 2973 2405 2001 Rescheduling interrupts
CAL: 49 43 74 72 Function call interrupts
TLB: 638 784 1175 674 TLB shootdowns
TRM: 0 0 0 0 Thermal event interrupts
THR: 0 0 0 0 Threshold APIC interrupts
MCE: 0 0 0 0 Machine check exceptions
MCP: 603 603 603 606 Machine check polls
ERR: 0
MIS: 0
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: x86: interrupt routing question
2011-07-12 7:27 x86: interrupt routing question Mike Galbraith
@ 2011-09-28 7:28 ` Mike Galbraith
2011-09-28 15:26 ` Bjorn Helgaas
0 siblings, 1 reply; 4+ messages in thread
From: Mike Galbraith @ 2011-09-28 7:28 UTC (permalink / raw)
To: LKML; +Cc: Thomas Gleixner
For the next sod who gets curious about irq routing behavior difference,
and tries to ask google.
On Tue, 2011-07-12 at 09:27 +0200, Mike Galbraith wrote:
> Greetings,
>
> I have an x3550 M3 box which shows different behavior than my Q6600
> desktop box. The below is the rt kernel, but it doesn't matter which
> kernel I boot, all interrupts are on CPU0 unless I move them. On Q6600
> box, IRQs magically appear on every cpu in the affinity mask. Change
> the eth0 mask while flood pinging, numbers start/stop changing on the
> fly.
>
> On x3550 M3, setting eg IRQ 63's mask to '0xe' will move irq to CPU2,
> but nothing that I have found will make the thing behave the same as
> trusty old Q6600 box, which seems strange. Is this some kind of BIOS
> thingie, or is every kernel busted on this hardware? Busted kernel
> seems highly doubtful.
The difference is that Q6600 desktop box uses flat routing, and x3550 M3
uses physical flat. What the heck does that mean you (didn't) ask?
Dunno, that's a "RTFM for all the gory technical details" thing, but if
you rummage around in x86 source, you'll end up here..
arch/kernel/x86/apic/io_apic.c::setup_ioapic_irq()
if (assign_irq_vector(irq, cfg, apic->target_cpus()))
return;
dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
apic_printk(APIC_VERBOSE,KERN_DEBUG
"IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> "
"IRQ %d Mode:%i Active:%i Dest:%d)\n",
apic_id, mpc_ioapic_id(apic_id), pin, cfg->vector,
irq, trigger, polarity, dest);
..and see that in physical flat mode, assign_irq_vector() scribbles only
one bit to cfg->domain.
arch/kernel/x86/apic/io_apic.c:__assign_irq_vector()
for_each_cpu_and(cpu, mask, cpu_online_mask) {
int new_cpu;
int vector, offset;
apic->vector_allocation_domain(cpu, tmp_mask);
...
cpumask_copy(cfg->domain, tmp_mask);
err = 0;
break;
}
apic.vector_allocation_domain for physical flat is..
arch/x86/kernel/apic/apic_flat_64.c::
static void physflat_vector_allocation_domain(int cpu, struct cpumask *retmask)
{
cpumask_clear(retmask);
cpumask_set_cpu(cpu, retmask);
}
..whereas for flat it's..
static void flat_vector_allocation_domain(int cpu, struct cpumask *retmask)
{
...
cpumask_clear(retmask);
cpumask_bits(retmask)[0] = APIC_ALL_CPUS;
}
So, while __assign_irq_vector() is called with a mask of all CPUs for
both boxen, apic->vector_allocation_domain() ensures the mask finally
written to cfg->domain has only one CPU bit set in physical flat mode,
and all CPU bits set in flat mode.
-Mike
P.S. if you try that RTFM thing, strap a pillow to your forehead first
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: x86: interrupt routing question
2011-09-28 7:28 ` Mike Galbraith
@ 2011-09-28 15:26 ` Bjorn Helgaas
2011-09-28 17:33 ` Mike Galbraith
0 siblings, 1 reply; 4+ messages in thread
From: Bjorn Helgaas @ 2011-09-28 15:26 UTC (permalink / raw)
To: Mike Galbraith; +Cc: LKML, Thomas Gleixner
On Wed, Sep 28, 2011 at 1:28 AM, Mike Galbraith <efault@gmx.de> wrote:
>
> For the next sod who gets curious about irq routing behavior difference,
> and tries to ask google.
Thanks for following up on this!
So, having read the fine manual, do you think this is a Linux bug, or
something that could be improved in Linux, either by changing the
behavior or making the dmesg more informative? It certainly cost you
a lot of time, and it'd be nice if we could save the next person :)
> On Tue, 2011-07-12 at 09:27 +0200, Mike Galbraith wrote:
> > Greetings,
> >
> > I have an x3550 M3 box which shows different behavior than my Q6600
> > desktop box. The below is the rt kernel, but it doesn't matter which
> > kernel I boot, all interrupts are on CPU0 unless I move them. On Q6600
> > box, IRQs magically appear on every cpu in the affinity mask. Change
> > the eth0 mask while flood pinging, numbers start/stop changing on the
> > fly.
> >
> > On x3550 M3, setting eg IRQ 63's mask to '0xe' will move irq to CPU2,
> > but nothing that I have found will make the thing behave the same as
> > trusty old Q6600 box, which seems strange. Is this some kind of BIOS
> > thingie, or is every kernel busted on this hardware? Busted kernel
> > seems highly doubtful.
>
> The difference is that Q6600 desktop box uses flat routing, and x3550 M3
> uses physical flat. What the heck does that mean you (didn't) ask?
> Dunno, that's a "RTFM for all the gory technical details" thing, but if
> you rummage around in x86 source, you'll end up here..
>
> arch/kernel/x86/apic/io_apic.c::setup_ioapic_irq()
>
> if (assign_irq_vector(irq, cfg, apic->target_cpus()))
> return;
>
> dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
>
> apic_printk(APIC_VERBOSE,KERN_DEBUG
> "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> "
> "IRQ %d Mode:%i Active:%i Dest:%d)\n",
> apic_id, mpc_ioapic_id(apic_id), pin, cfg->vector,
> irq, trigger, polarity, dest);
>
> ..and see that in physical flat mode, assign_irq_vector() scribbles only
> one bit to cfg->domain.
>
> arch/kernel/x86/apic/io_apic.c:__assign_irq_vector()
>
> for_each_cpu_and(cpu, mask, cpu_online_mask) {
> int new_cpu;
> int vector, offset;
>
> apic->vector_allocation_domain(cpu, tmp_mask);
> ...
> cpumask_copy(cfg->domain, tmp_mask);
> err = 0;
> break;
> }
>
> apic.vector_allocation_domain for physical flat is..
>
> arch/x86/kernel/apic/apic_flat_64.c::
>
> static void physflat_vector_allocation_domain(int cpu, struct cpumask *retmask)
> {
> cpumask_clear(retmask);
> cpumask_set_cpu(cpu, retmask);
> }
>
> ..whereas for flat it's..
>
> static void flat_vector_allocation_domain(int cpu, struct cpumask *retmask)
> {
> ...
> cpumask_clear(retmask);
> cpumask_bits(retmask)[0] = APIC_ALL_CPUS;
> }
>
> So, while __assign_irq_vector() is called with a mask of all CPUs for
> both boxen, apic->vector_allocation_domain() ensures the mask finally
> written to cfg->domain has only one CPU bit set in physical flat mode,
> and all CPU bits set in flat mode.
>
> -Mike
>
> P.S. if you try that RTFM thing, strap a pillow to your forehead first
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: x86: interrupt routing question
2011-09-28 15:26 ` Bjorn Helgaas
@ 2011-09-28 17:33 ` Mike Galbraith
0 siblings, 0 replies; 4+ messages in thread
From: Mike Galbraith @ 2011-09-28 17:33 UTC (permalink / raw)
To: Bjorn Helgaas; +Cc: LKML, Thomas Gleixner
On Wed, 2011-09-28 at 09:26 -0600, Bjorn Helgaas wrote:
> On Wed, Sep 28, 2011 at 1:28 AM, Mike Galbraith <efault@gmx.de> wrote:
> >
> > For the next sod who gets curious about irq routing behavior difference,
> > and tries to ask google.
>
> Thanks for following up on this!
>
> So, having read the fine manual, do you think this is a Linux bug, or
> something that could be improved in Linux, either by changing the
> behavior or making the dmesg more informative? It certainly cost you
> a lot of time, and it'd be nice if we could save the next person :)
It didn't take long at all after I stopped trying to ask google and
acpidump, and went to the source. I don't think it's a bug, but I only
_started_ to RTFM, so whether it could be improved is a question I can't
begin to answer.. and kinda hope to never be able to answer :)
-Mike
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-09-28 17:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-12 7:27 x86: interrupt routing question Mike Galbraith
2011-09-28 7:28 ` Mike Galbraith
2011-09-28 15:26 ` Bjorn Helgaas
2011-09-28 17:33 ` Mike Galbraith
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome