Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753338Ab1EEJDR (ORCPT ); Thu, 5 May 2011 05:03:17 -0400 Received: from mga02.intel.com ([134.134.136.20]:30576 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751338Ab1EEJDQ (ORCPT ); Thu, 5 May 2011 05:03:16 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.64,318,1301900400"; d="scan'208";a="742685790" From: "Tian, Kevin" To: Ian Campbell CC: "linux-kernel@vger.kernel.org" , "tglx@linutronix.de" , "mingo@redhat.com" , "hpa@zytor.com" , "JBeulich@novell.com" Date: Thu, 5 May 2011 17:03:04 +0800 Subject: RE: [PATCH] x86: skip migrating percpu irq in fixup_irqs Thread-Topic: [PATCH] x86: skip migrating percpu irq in fixup_irqs Thread-Index: AcwLAUzXREy4TyQ3TgGAoJriEIEXoAAACVGw Message-ID: <625BA99ED14B2D499DC4E29D8138F1505C8ED7F3A9@shsmsx502.ccr.corp.intel.com> References: <625BA99ED14B2D499DC4E29D8138F1505C8ED7F327@shsmsx502.ccr.corp.intel.com> <1304585343.26692.71.camel@zakaz.uk.xensource.com> In-Reply-To: <1304585343.26692.71.camel@zakaz.uk.xensource.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id p4593REZ004762 Content-Length: 3099 Lines: 63 > From: Ian Campbell [mailto:Ian.Campbell@eu.citrix.com] > Sent: Thursday, May 05, 2011 4:49 PM > > On Thu, 2011-05-05 at 09:15 +0100, Tian, Kevin wrote: > > x86: skip migrating percpu irq in fixup_irqs > > > > IRQF_PER_CPU is used by Xen for a set of virtual interrupts binding to > > a specific vcpu, but it's not recognized in fixup_irqs which simply > > atempts to migrate it to other vcpus. In most cases this just works, > > because Xen event channel chip silently fails the set_affinity ops for > > irqs marked as IRQF_PER_CPU. But there's a special category (like used > > for pv spinlock) also adds a IRQ_DISABLED flag, used as polled only > > event channels which don't expect any instance injected. However > > fixup_irqs absolutely masks/unmasks irqs which makes such special type > > irq injected unexpectely while there's no handler for it. > > > > This error is triggered on some box when doing reboot. The fix is to > > recognize IRQF_PER_CPU flag early before the affinity change, which > > actually matches the rationale of IRQF_PER_CPU. > > Skipping affinity fixup for PER_CPU IRQs seems logical enough (so I suspect this > patch is good in its own right) but if the real issue you are fixing is that > IRQ_DISABLED IQRs are getting unmasked should that issue be addressed > directly rather than relying on it being a side-effect of PER_CPU-ness? actually this is one thing I'm not sure and would like to hear more suggestions. imo affinity and percpu are same type of attributes, which describe the constraints to host a given irq, while disabled/masked are another type of attributes which describe whether to accept an irq instance (mask is for short period). even without the IRQ_DISABLED issue, this patch is also required though it doesn't expose observable failure. I didn't bake the 2nd patch to avoid unmask for IRQ_DISABLED, because I want to know whether this is desired, e.g. IRQ_DISABLED is set in the fly when there can be still one instance pending? Thanks Kevin > > > Signed-off-by: Fengzhe Zhang > > Signed-off-by: Kevin Tian > > CC: Thomas Gleixner > > CC: Ingo Molnar > > CC: H. Peter Anvin > > CC: Ian Campbell > > CC: Jan Beulich > > > > diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index > > 1cb0b9f..544efe2 100644 > > --- a/arch/x86/kernel/irq.c > > +++ b/arch/x86/kernel/irq.c > > @@ -249,7 +249,7 @@ void fixup_irqs(void) > > > > data = irq_desc_get_irq_data(desc); > > affinity = data->affinity; > > - if (!irq_has_action(irq) || > > + if (!irq_has_action(irq) || irqd_is_per_cpu(data) || > > cpumask_subset(affinity, cpu_online_mask)) { > > raw_spin_unlock(&desc->lock); > > continue; > ????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?