From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755194AbbIHODK (ORCPT ); Tue, 8 Sep 2015 10:03:10 -0400 Received: from www.linutronix.de ([62.245.132.108]:42182 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754977AbbIHODG (ORCPT ); Tue, 8 Sep 2015 10:03:06 -0400 Date: Tue, 8 Sep 2015 16:02:29 +0200 (CEST) From: Thomas Gleixner To: Mika Westerberg cc: Jiang Liu , jarkko.nikula@linux.intel.com, linux-kernel@vger.kernel.org Subject: Re: Question related to patch: x86/irq: Remove x86_io_apic_ops.set_affinity and related interfaces In-Reply-To: <20150908104048.GB12118@lahna.fi.intel.com> Message-ID: References: <20150908104048.GB12118@lahna.fi.intel.com> User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 8 Sep 2015, Mika Westerberg wrote: > It says that there are no users for x86_io_apic_ops.set_affinity but then > it does this: > > - x86_io_apic_ops.set_affinity(idata, mask, false); > + irq_set_affinity(irq, mask); > > The difference is that x86_io_apic_ops.set_affinity() programs affinity > directly to the hardware (if I understand it right) but irq_set_affinity() > calls irqd_set_move_pending() which defers programming the hardware later. > > Now when an interrupt triggers we end up calling irq_move_masked_irq() with > unlocked descriptor. > > Without the above change we never do that and the crash does not happen. Right. Patch below should fix that issue. Thanks, tglx diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 38a76f826530..d2ea50c5e936 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -2522,6 +2522,7 @@ void __init setup_ioapic_dest(void) int pin, ioapic, irq, irq_entry; const struct cpumask *mask; struct irq_data *idata; + struct irq_chip *chip; if (skip_ioapic_setup == 1) return; @@ -2545,9 +2546,9 @@ void __init setup_ioapic_dest(void) else mask = apic->target_cpus(); - irq_set_affinity(irq, mask); + chip = irq_data_get_chip(idata); + chip->irq_set_affinity(idata, mask, false); } - } #endif