From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754457Ab0A2TrS (ORCPT ); Fri, 29 Jan 2010 14:47:18 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754217Ab0A2TrR (ORCPT ); Fri, 29 Jan 2010 14:47:17 -0500 Received: from mga14.intel.com ([143.182.124.37]:19478 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753132Ab0A2TrQ (ORCPT ); Fri, 29 Jan 2010 14:47:16 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.47,316,1257148800"; d="scan'208";a="238373700" Message-Id: <20100129194330.207790269@sbs-t61.sc.intel.com> User-Agent: quilt/0.47-1 Date: Fri, 29 Jan 2010 11:42:20 -0800 From: Suresh Siddha To: "H. Peter Anvin" , Ingo Molnar , Thomas Gleixner Cc: LKML , Suresh Siddha , Yinghai Lu , "Eric W. Biederman" , lizf@cn.fujitsu.com Subject: [patch 1/2] x86, irq: update the vector domain for legacy irqs handled by io-apic Content-Disposition: inline; filename=update_legacyirq_cfg_domains_handled_by_ioapic.patch Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the recent change of not reserving IRQ0_VECTOR..IRQ15_VECTOR's on all cpu's, we start with irq 0..15 getting directed to (and handled on) cpu-0. In the logical flat mode, once the AP's are online (and before irqbalance comes into picture), kernel intends to handle these IRQ's on any cpu (as the logical flat mode allows to specify multiple cpu's for the irq destination and the chipset based routing can deliver to the interrupt to any one of the specified cpu's). This was broken with our recent change, which was ending up using only cpu 0 as the destination, even when the kernel was specifying to use all online cpu's for the logical flat mode case. Fix this by updating vector allocation domain (cfg->domain) for legacy irqs, when the IO-APIC handles them. Signed-off-by: Suresh Siddha Tested-by: Li Zefan Cc: Yinghai Lu Cc: Eric W. Biederman --- diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 0cc7022..a18bab0 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1428,6 +1428,14 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq cfg = desc->chip_data; + /* + * For legacy irqs, cfg->domain starts with cpu 0 for legacy + * controllers like 8259. Now that IO-APIC can handle this irq, update + * the cfg->domain. + */ + if (irq < nr_legacy_irqs && cpumask_test_cpu(0, cfg->domain)) + apic->vector_allocation_domain(0, cfg->domain); + if (assign_irq_vector(irq, cfg, apic->target_cpus())) return;