The revert of the offending commit does not apply cleanly to the Ubuntu-4.4.0-47.68 kernel. The closest we can get to a revert is this patch:
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 64f233a..aec995c 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -2523,7 +2523,6 @@ void __init setup_ioapic_dest(void) const struct cpumask *mask; struct irq_desc *desc; struct irq_data *idata; - struct irq_chip *chip; if (skip_ioapic_setup == 1) return; @@ -2538,7 +2537,6 @@ void __init setup_ioapic_dest(void) continue; desc = irq_to_desc(irq); - raw_spin_lock_irq(&desc->lock); idata = irq_desc_get_irq_data(desc); /* @@ -2549,11 +2547,7 @@ void __init setup_ioapic_dest(void) else mask = apic->target_cpus(); - chip = irq_data_get_irq_chip(idata); - /* Might be lapic_chip for irq 0 */ - if (chip->irq_set_affinity) - chip->irq_set_affinity(idata, mask, false); - raw_spin_unlock_irq(&desc->lock); + irq_set_affinity(irq, mask); } } #endif I tried this and it works. Another option is this smaller patch: diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 64f233a..f185a1e 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -2523,7 +2523,6 @@ void __init setup_ioapic_dest(void) const struct cpumask *mask; struct irq_desc *desc; struct irq_data *idata; - struct irq_chip *chip; if (skip_ioapic_setup == 1) return; @@ -2549,10 +2548,7 @@ void __init setup_ioapic_dest(void) else mask = apic->target_cpus(); - chip = irq_data_get_irq_chip(idata); - /* Might be lapic_chip for irq 0 */ - if (chip->irq_set_affinity) - chip->irq_set_affinity(idata, mask, false); + irq_set_affinity_locked(idata, mask, false); raw_spin_unlock_irq(&desc->lock); } } which essentially keeps the raw_spin_lock_irq()/raw_spin_unlock_irq() rather than raw_spin_lock_irqsave()/raw_spin_unlock_irqrestore() used by __irq_set_affinity() in kernel/irq/manage.c . I tested both patches on top of Ubuntu-4.4.0-47.68 and they work. They also apply cleanly to Ubuntu-4.2.0-42.49 but I didn't actually check that it builds/works. I tried manually inlining the irq_set_affinity_locked() (which required further inlining of some helper functions and providing a declaration of irq_do_set_affinity()) and it still worked. However, forcing the "if (irq_can_move_pcntxt())" path that immediately performs "chip->irq_set_affinity(idata, mask, false)" exposes the bug. This confirms what I expected after reading https://lkml.org/lkml/2012/3/26/392 . Basically, when the hardware says that you cannot do something right away, you really cannot. And the offending commit just ignores this. -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1598312 Title: Cannot scale AMD Turion CPU frequency. It runs on lowest 800MHz To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/linux-lts-wily/+bug/1598312/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs