Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3429971imu; Sun, 11 Nov 2018 14:56:04 -0800 (PST) X-Google-Smtp-Source: AJdET5d4eLVnc6gnJ7UrhkSvbUBU7rvViyuZVgT47Z83/S7daPlW6QYI9QyeBhJgjMuk48KjqPuD X-Received: by 2002:a63:83c1:: with SMTP id h184mr15355232pge.437.1541976964733; Sun, 11 Nov 2018 14:56:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541976964; cv=none; d=google.com; s=arc-20160816; b=0F03LZbSqB6MZBwYUitRSpmDqTURcioAfXGR7ybLNVykOqfJ0vvPNyj2ZpUK+qmdUJ z2HBFANQ2xT3Kqd6Ka7Y5yODYyPnOcuHgIOOVxGeCxHUqLxdWyhzpq8U16DhmF6znCtx RNXmXHhNkP3MB52klCBXyZPdO/BrnJL2r3vV96lVzRawmKr9W3D0lVY8Rit9N0IsUdRK W+XGr0vN+T/Ptqkl+yPBXJp3iDcT2fN/dQgeCijVWu1cBfncsuj1E1YoIkKWAHNgHsK0 eLbPe4tMkeFcbnHjV8lKzR0w24YzDYSiRMzxlwshxCN20gMdHGhaYyZJu1a/JIiHFrM3 sTsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=s24Q8roynYxDGwGI4fWN+ILD5aoziPoRncWqMB8EeJo=; b=xlXN9gb+qcK8V3Zs/DWwsTetU3EeKeWdi2OKtfoYkFVKn+Z95vtruuPJA2JtcvtSsE 1QHJQDKwkIuvFVGTXu9aXJAXUtHppuKjvJZxF6MkC7CcxfnTYGKxHZKslc9rr27hAOik Xx9XOEAtLzewKKGba5J74yvNMHMEFvavCtzGtxLTe0pPnvP2+HQ3DUmXFihYx6o/S6Mm NvD3JNQ3TQOMGo11jD9xusTgovGd1UG196Or/Q8cWpm7Hp1sy0ffY8L8JxI89OHLa552 CqZDJ6ennndbcvyuKkVkSxlotKMwrsQeNBGsM7E8im7SQLUl79m4Aapqb2WnoTbYlyGu E2eA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=x6gEHy4U; 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 12-v6si4736113plb.324.2018.11.11.14.55.49; Sun, 11 Nov 2018 14:56:04 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=x6gEHy4U; 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 S2404164AbeKLIoP (ORCPT + 99 others); Mon, 12 Nov 2018 03:44:15 -0500 Received: from mail.kernel.org ([198.145.29.99]:54742 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731165AbeKLIW5 (ORCPT ); Mon, 12 Nov 2018 03:22:57 -0500 Received: from localhost (unknown [206.108.79.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D22C521582; Sun, 11 Nov 2018 22:32:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541975579; bh=tXXskE9NvQFbXuvSEH3jtoXrH/Fz0Um1ghOa1AKPibc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=x6gEHy4UNIZ4MegBYxr6rKt0iBYsjL8yj51nf+zL2Es6JzNAcwLhsYzetCVi9Ud2b 0zDqnvYt2R/Sag1yrJ1/UY51GP7Ffww818XEHc3QMXxUJI8rmSoVKZNWzMAoEPE4Zb +ry3PicYVvPzT6Vatv17k9lQ3XsY8NFozDf/OVQM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lukas Wunner , Thomas Gleixner , Mathias Duckeck , Akshay Bhat , Casey Fitzpatrick Subject: [PATCH 4.14 168/222] genirq: Fix race on spurious interrupt detection Date: Sun, 11 Nov 2018 14:24:25 -0800 Message-Id: <20181111221702.259776901@linuxfoundation.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181111221647.665769131@linuxfoundation.org> References: <20181111221647.665769131@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Lukas Wunner commit 746a923b863a1065ef77324e1e43f19b1a3eab5c upstream. Commit 1e77d0a1ed74 ("genirq: Sanitize spurious interrupt detection of threaded irqs") made detection of spurious interrupts work for threaded handlers by: a) incrementing a counter every time the thread returns IRQ_HANDLED, and b) checking whether that counter has increased every time the thread is woken. However for oneshot interrupts, the commit unmasks the interrupt before incrementing the counter. If another interrupt occurs right after unmasking but before the counter is incremented, that interrupt is incorrectly considered spurious: time | irq_thread() | irq_thread_fn() | action->thread_fn() | irq_finalize_oneshot() | unmask_threaded_irq() /* interrupt is unmasked */ | | /* interrupt fires, incorrectly deemed spurious */ | | atomic_inc(&desc->threads_handled); /* counter is incremented */ v This is observed with a hi3110 CAN controller receiving data at high volume (from a separate machine sending with "cangen -g 0 -i -x"): The controller signals a huge number of interrupts (hundreds of millions per day) and every second there are about a dozen which are deemed spurious. In theory with high CPU load and the presence of higher priority tasks, the number of incorrectly detected spurious interrupts might increase beyond the 99,900 threshold and cause disablement of the interrupt. In practice it just increments the spurious interrupt count. But that can cause people to waste time investigating it over and over. Fix it by moving the accounting before the invocation of irq_finalize_oneshot(). [ tglx: Folded change log update ] Fixes: 1e77d0a1ed74 ("genirq: Sanitize spurious interrupt detection of threaded irqs") Signed-off-by: Lukas Wunner Signed-off-by: Thomas Gleixner Cc: Mathias Duckeck Cc: Akshay Bhat Cc: Casey Fitzpatrick Cc: stable@vger.kernel.org # v3.16+ Link: https://lkml.kernel.org/r/1dfd8bbd16163940648045495e3e9698e63b50ad.1539867047.git.lukas@wunner.de Signed-off-by: Greg Kroah-Hartman --- kernel/irq/manage.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -882,6 +882,9 @@ irq_forced_thread_fn(struct irq_desc *de local_bh_disable(); ret = action->thread_fn(action->irq, action->dev_id); + if (ret == IRQ_HANDLED) + atomic_inc(&desc->threads_handled); + irq_finalize_oneshot(desc, action); local_bh_enable(); return ret; @@ -898,6 +901,9 @@ static irqreturn_t irq_thread_fn(struct irqreturn_t ret; ret = action->thread_fn(action->irq, action->dev_id); + if (ret == IRQ_HANDLED) + atomic_inc(&desc->threads_handled); + irq_finalize_oneshot(desc, action); return ret; } @@ -975,8 +981,6 @@ static int irq_thread(void *data) irq_thread_check_affinity(desc, action); action_ret = handler_fn(desc, action); - if (action_ret == IRQ_HANDLED) - atomic_inc(&desc->threads_handled); if (action_ret == IRQ_WAKE_THREAD) irq_wake_secondary(desc, action);