Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3802946imm; Mon, 4 Jun 2018 09:28:26 -0700 (PDT) X-Google-Smtp-Source: ADUXVKK1JwnDDDkZTztvWrAR40+yDp13G22eku7TpNj99vgBQ9hn79UsaVI7hs77WD1t+aoB7DrW X-Received: by 2002:a17:902:b20d:: with SMTP id t13-v6mr2333208plr.121.1528129706320; Mon, 04 Jun 2018 09:28:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528129706; cv=none; d=google.com; s=arc-20160816; b=rmC9EeeS/apDt47w+jnAqAm8gC95CVOv3S6l4iP+5X5cTZifpNT6JH8t3jQt9g8Ucb 3+naNx90ZEEOunH781EHPDt5Dw8WdllRYjZlWaZAlja+B7nPQrV9N0PKwnBaKW9zylla njfve1B0xU7UW7HnJ/uKoSvX2mknh7v4xQau6BwTcJWJqHZwYB03blWxGzx7Rejm+wmv q8i4riV8k/v5fPgrCNl3ACU0Ke4Ix35m8mupqW60rFqjZ6pkHIu6qAlvNQCOXjZ+1UbY eOgkTYYn7k836jTb346AyoeWcGpsjM1pK3IapSRwb1P8XVpa7NctmsLczsNoH54hqZgE RoRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition:mime-version:subject :cc:to:from:date:user-agent:message-id:arc-authentication-results; bh=7mzIuCAPdmACfSxbT1ZE16OYMFIE/tdPCs06/QZoUjQ=; b=hv73+u9fpOF3AewfgSSJRpAQBoI8ATF+8LzV/qi8V6pdq6uQtuSy9wfHfK8M2HYXjZ zeGPzd1CrObT6E0/LMu1C7obbrfqafrFPqL8vZm2fx5ZN8gfpT28KQ10BY0kczL4AaTL U5P3v43KhsQw3/eyx7M4vhKGZE57wDJS885t5f+UriFfgOupABJ1CK0m7FOSZZT8XETo leBY8jEAJwmrMs9zrRy0lRpm80Q9z5pZX8OrEfNWll/38Mf1xzI8WkEQwPENgxsmXlUa HdPImI2Baf2+bHOxVk1ZLex8Jux9KTw4dX5Bv4Q4pymwPksPOFNsr9hIxs8jerP6aris uurQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d2-v6si46513053plh.387.2018.06.04.09.28.11; Mon, 04 Jun 2018 09:28:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751474AbeFDQ1q (ORCPT + 99 others); Mon, 4 Jun 2018 12:27:46 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:40683 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751209AbeFDQ1l (ORCPT ); Mon, 4 Jun 2018 12:27:41 -0400 Received: from localhost ([127.0.0.1] helo=nanos.tec.linutronix.de) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1fPsKZ-00029o-Oo; Mon, 04 Jun 2018 18:27:39 +0200 Message-Id: <20180604162224.386544292@linutronix.de> User-Agent: quilt/0.65 Date: Mon, 04 Jun 2018 17:33:54 +0200 From: Thomas Gleixner To: LKML Cc: Ingo Molnar , Peter Zijlstra , Borislav Petkov , Dmitry Safonov <0x7f454c46@gmail.com>, Tariq Toukan , Song Liu , Joerg Roedel , Mike Travis , stable@vger.kernel.org Subject: [patch 2/8] genirq/generic_pending: Do not lose pending affinity update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline; filename=genirq-generic_pending--Do-not-lose-pending-affinity-update.patch Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The generic pending interrupt mechanism moves interrupts from the interrupt handler on the original target CPU to the new destination CPU. This is required for x86 and ia64 due to the way the interrupt delivery and acknowledge works if the interrupts are not remapped. However that update can fail for various reasons. Some of them are valid reasons to discard the pending update, but the case, when the previous move has not been fully cleaned up is not a legit reason to fail. Check the return value of irq_do_set_affinity() for -EBUSY, which indicates a pending cleanup, and rearm the pending move in the irq dexcriptor so it's tried again when the next interrupt arrives. Fixes: 996c591227d9 ("x86/irq: Plug vector cleanup race") Signed-off-by: Thomas Gleixner Cc: stable@vger.kernel.org --- kernel/irq/migration.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c @@ -38,17 +38,18 @@ bool irq_fixup_move_pending(struct irq_d void irq_move_masked_irq(struct irq_data *idata) { struct irq_desc *desc = irq_data_to_desc(idata); - struct irq_chip *chip = desc->irq_data.chip; + struct irq_data *data = &desc->irq_data; + struct irq_chip *chip = data->chip; - if (likely(!irqd_is_setaffinity_pending(&desc->irq_data))) + if (likely(!irqd_is_setaffinity_pending(data))) return; - irqd_clr_move_pending(&desc->irq_data); + irqd_clr_move_pending(data); /* * Paranoia: cpu-local interrupts shouldn't be calling in here anyway. */ - if (irqd_is_per_cpu(&desc->irq_data)) { + if (irqd_is_per_cpu(data)) { WARN_ON(1); return; } @@ -73,9 +74,20 @@ void irq_move_masked_irq(struct irq_data * For correct operation this depends on the caller * masking the irqs. */ - if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) - irq_do_set_affinity(&desc->irq_data, desc->pending_mask, false); + if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) { + int ret; + ret = irq_do_set_affinity(data, desc->pending_mask, false); + /* + * If the there is a cleanup pending in the underlying + * vector management, reschedule the move for the next + * interrupt. Leave desc->pending_mask intact. + */ + if (ret == -EBUSY) { + irqd_set_move_pending(data); + return; + } + } cpumask_clear(desc->pending_mask); }