Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp1757657ybz; Sat, 18 Apr 2020 07:53:07 -0700 (PDT) X-Google-Smtp-Source: APiQypKEpTpqd7N0IPO2pweQg8tfa6dks2KX2ie5vBeknqayPdE0IZGMQGnxQCDI9PR2sw5DPljC X-Received: by 2002:a05:6402:543:: with SMTP id i3mr6971123edx.255.1587221587756; Sat, 18 Apr 2020 07:53:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587221587; cv=none; d=google.com; s=arc-20160816; b=ZdSMX86uT2oSc+D6EWIJqCX3c3XntRsGJJdZKwIPvfYO0OfFe6dFI/O6GRQvJuWzqw w2NFzTnR93jQaeKkm7/nu+ZPjIDUsiIVFErASJVhnUXsIv/6jjmICko9Xdnmjc6gusOw sKoWVfT6he0QJAiNVQq4xKJBBB/oYVw7K/HDvnHY4sEAEabea/TCdALo7NGz1n+GBUq6 /bHBmvpgKIRGdxgk6SB+ApyncIasbKDfR9R88gjBvwhGBEx/zd3WXPIQ58xzONarAsP1 b6vG+9z+nh0QGtAaOj8EVgWsUl73ftgWA5zuMWrvFWKARtTtRLlEZBwHGC8dDdr12dZX Jukw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=CZRoCj63jPNGV/EZp7Q/a6r+cmJSljl++tbUM5fqtj0=; b=DN+n3IrLFvSzpGS0/KrfeTjPXMhanqI+GDHgX9oSRstKCSBqUl7pB8DyOYdr5aTr12 fyiTDHyfH+KQJ7PyRcEgdZSo1ieQxbeQsc38Pz2OD6C5+F5k3wO/QCpUY4f8lF7gmvwY mpbeK5sa64XYz71k6U62Bq/8MdERP0WKnIBrT17e6TD70Mn5gJ5tz3W0o/aPAF8u7B9P lE3vEGJEV1NQ0B5DE/fgLMcutNB5XO/4ikOfff021P9+L0KiNaromYpm+UcCsxLJUqwH 1kQlz20GxSgtFQHFtk4NLL5kDoMueSHQSuyz7yvU1OWZ2ikwZ37opyydGsTqUaha+o5o guTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qWtxeHiX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m1si16252827eja.214.2020.04.18.07.52.45; Sat, 18 Apr 2020 07:53:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=qWtxeHiX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728481AbgDROnB (ORCPT + 99 others); Sat, 18 Apr 2020 10:43:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:53516 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728466AbgDROm4 (ORCPT ); Sat, 18 Apr 2020 10:42:56 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 84A7921D82; Sat, 18 Apr 2020 14:42:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587220976; bh=r7W2BMvSVN2n2aUOBFfbrcyTxzO/sjlxfzlONt//hmY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qWtxeHiX/YPNCOHPDbu8CUq9F4GdwkAtnN6InbNkHPbJdinrL1ck3NNS2x0TTi0Sx Nvcd000nyJ+Vs/7c+M4wxSQ1N1UggmF+FKfmglUQQdQ+pW5D01xPUuaZG2rFQnKayY PysPmvm9JpcDeWpFqZ8YIolJMmVHt7+FlZwdleJo= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Nicholas Piggin , Michael Ellerman , Sasha Levin , linuxppc-dev@lists.ozlabs.org Subject: [PATCH AUTOSEL 4.19 22/47] Revert "powerpc/64: irq_work avoid interrupt when called with hardware irqs enabled" Date: Sat, 18 Apr 2020 10:42:02 -0400 Message-Id: <20200418144227.9802-22-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200418144227.9802-1-sashal@kernel.org> References: <20200418144227.9802-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nicholas Piggin [ Upstream commit abc3fce76adbdfa8f87272c784b388cd20b46049 ] This reverts commit ebb37cf3ffd39fdb6ec5b07111f8bb2f11d92c5f. That commit does not play well with soft-masked irq state manipulations in idle, interrupt replay, and possibly others due to tracing code sometimes using irq_work_queue (e.g., in trace_hardirqs_on()). That can cause PACA_IRQ_DEC to become set when it is not expected, and be ignored or cleared or cause warnings. The net result seems to be missing an irq_work until the next timer interrupt in the worst case which is usually not going to be noticed, however it could be a long time if the tick is disabled, which is against the spirit of irq_work and might cause real problems. The idea is still solid, but it would need more work. It's not really clear if it would be worth added complexity, so revert this for now (not a straight revert, but replace with a comment explaining why we might see interrupts happening, and gives git blame something to find). Fixes: ebb37cf3ffd3 ("powerpc/64: irq_work avoid interrupt when called with hardware irqs enabled") Signed-off-by: Nicholas Piggin Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20200402120401.1115883-1-npiggin@gmail.com Signed-off-by: Sasha Levin --- arch/powerpc/kernel/time.c | 44 +++++++++++--------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 5449e76cf2dfd..f6c21f6af274e 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -492,35 +492,6 @@ static inline void clear_irq_work_pending(void) "i" (offsetof(struct paca_struct, irq_work_pending))); } -void arch_irq_work_raise(void) -{ - preempt_disable(); - set_irq_work_pending_flag(); - /* - * Non-nmi code running with interrupts disabled will replay - * irq_happened before it re-enables interrupts, so setthe - * decrementer there instead of causing a hardware exception - * which would immediately hit the masked interrupt handler - * and have the net effect of setting the decrementer in - * irq_happened. - * - * NMI interrupts can not check this when they return, so the - * decrementer hardware exception is raised, which will fire - * when interrupts are next enabled. - * - * BookE does not support this yet, it must audit all NMI - * interrupt handlers to ensure they call nmi_enter() so this - * check would be correct. - */ - if (IS_ENABLED(CONFIG_BOOKE) || !irqs_disabled() || in_nmi()) { - set_dec(1); - } else { - hard_irq_disable(); - local_paca->irq_happened |= PACA_IRQ_DEC; - } - preempt_enable(); -} - #else /* 32-bit */ DEFINE_PER_CPU(u8, irq_work_pending); @@ -529,16 +500,27 @@ DEFINE_PER_CPU(u8, irq_work_pending); #define test_irq_work_pending() __this_cpu_read(irq_work_pending) #define clear_irq_work_pending() __this_cpu_write(irq_work_pending, 0) +#endif /* 32 vs 64 bit */ + void arch_irq_work_raise(void) { + /* + * 64-bit code that uses irq soft-mask can just cause an immediate + * interrupt here that gets soft masked, if this is called under + * local_irq_disable(). It might be possible to prevent that happening + * by noticing interrupts are disabled and setting decrementer pending + * to be replayed when irqs are enabled. The problem there is that + * tracing can call irq_work_raise, including in code that does low + * level manipulations of irq soft-mask state (e.g., trace_hardirqs_on) + * which could get tangled up if we're messing with the same state + * here. + */ preempt_disable(); set_irq_work_pending_flag(); set_dec(1); preempt_enable(); } -#endif /* 32 vs 64 bit */ - #else /* CONFIG_IRQ_WORK */ #define test_irq_work_pending() 0 -- 2.20.1