From patchwork Thu Jan 5 04:55:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Balbir Singh X-Patchwork-Id: 711235 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tvFsP5R48z9sQw for ; Thu, 5 Jan 2017 16:02:01 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Gh7G6k7d"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3tvFsP3mMmzDqWP for ; Thu, 5 Jan 2017 16:02:01 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Gh7G6k7d"; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mail-pg0-x244.google.com (mail-pg0-x244.google.com [IPv6:2607:f8b0:400e:c05::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3tvFkW4TmqzDqR9 for ; Thu, 5 Jan 2017 15:56:03 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Gh7G6k7d"; dkim-atps=neutral Received: by mail-pg0-x244.google.com with SMTP id i5so39423507pgh.2 for ; Wed, 04 Jan 2017 20:56:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KJz2XitunmNvYGaNsqoEMo5SVSf6BZbdp2RCf6XH/ho=; b=Gh7G6k7dhBiwrYhuw295xL/t7aqcFk4CECwI6SpYDoXKtqB0aJl3bBs16yedXFO5He xf7ECMpMLHuNueUV1RG+u7hctbOb8R0bq4wPOVeKm15+4/JW+fzYVE+Y8rxVuPnngqr9 I2Nj8Cx/x+NLjFLldTPBqiHzQ1AJqs7PlGsThFXDP5HWZF5hATvCuK6NRdmyDsYkb4UY 2DSvM8KshBcR7yveoF+zeI3bIZifRB3ad3LXl/ood7vIyKk6ziUK4rGorV4HveHHfLrG QV7qOcf3TqQ2QowUWulVIHahiidDP5Qrua7VuvKOSJU5dizVOnnf0Y3AAuiNAFd6WY+r ZfsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KJz2XitunmNvYGaNsqoEMo5SVSf6BZbdp2RCf6XH/ho=; b=kY7UN7CgJOgLffMfYqbODw7tZ/3cFLDGRkcZdtF0Gf2Y3+vaAjQsM17n/iiNoZiIix DEs2mCEF1Z5XAW4cEhHgriCSrpHe1A39l7ak3vB/tOFaUdVuaGIM1xUDJyhDeC7DD2KY XSmXYwVVdLHW/MG1XeyDpW8oU1GmZYaok67Hchc/fmPg4XM7WgrH4QS/n3X9MbF5fDtX BPkwEsTaI6BUY+pypCOnf0agU+5mbX4TJuCgXKIzQFMcyCfajWp/brZuag8l+NSojGLQ MoWcX2INs887Yv7RLIuzrfiPvPBfNwZfpkMjqjjYptUv9JhXMB6CkArlka6TiUsKG3Vz fIJQ== X-Gm-Message-State: AIkVDXKV+f5bXb97R+HYi9AmQagP97CdhJDbJQ03TqKKEDq3AieFzEeKhClUwDs1ugojLw== X-Received: by 10.98.82.65 with SMTP id g62mr65197021pfb.119.1483592162040; Wed, 04 Jan 2017 20:56:02 -0800 (PST) Received: from MiWiFi-R3-srv.au.ibm.com (14-202-194-140.static.tpgi.com.au. [14.202.194.140]) by smtp.gmail.com with ESMTPSA id r68sm140847096pfk.85.2017.01.04.20.55.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Jan 2017 20:56:00 -0800 (PST) From: Balbir Singh To: linuxppc-dev@lists.ozlabs.org Subject: [PATCH v3 3/3] Enable soft nmi handler Date: Thu, 5 Jan 2017 15:55:38 +1100 Message-Id: <20170105045538.32658-4-bsingharora@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170105045538.32658-1-bsingharora@gmail.com> References: <20170105045538.32658-1-bsingharora@gmail.com> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paul Mackerras , Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" a. On decrementer interrupt, instead of setting dec to maximum and returning, we do the following i. Call a function handle_nmi_dec, which in turn calls handle_soft_nmi ii. handle_soft_nmi sets the decrementer value to 1 second and checks if more than 30 seconds have passed since starting it. If so it calls BUG_ON(1), we can do an NMI panic as well. This patch relies on the previous patch to keep interrupts enabled and held at the previous priority (not EOI'd) when we disable interrupts. Cc: Michael Ellerman Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Nicholas Piggin Signed-off-by: Balbir Singh --- arch/powerpc/kernel/exceptions-64s.S | 8 ++++---- arch/powerpc/kernel/time.c | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index cf64bc4..7c6bbe8a 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -1310,10 +1310,9 @@ masked_##_H##interrupt: \ stb r11,PACAIRQHAPPENED(r13); \ cmpwi r10,PACA_IRQ_DEC; \ bne 1f; \ - lis r10,0x7fff; \ - ori r10,r10,0xffff; \ - mtspr SPRN_DEC,r10; \ - b 2f; \ + GET_SCRATCH0(r10); \ + std r13,PACA_EXGEN+EX_R13(r13); \ + EXCEPTION_PROLOG_PSERIES_1(handle_nmi_dec, _H); \ 1: cmpwi r10,PACA_IRQ_DBELL; \ beq 2f; \ cmpwi r10,PACA_IRQ_HMI; \ @@ -1337,6 +1336,7 @@ USE_FIXED_SECTION(virt_trampolines) MASKED_INTERRUPT(H) EXC_COMMON(handle_irq_mask, 0x500, handle_masked_irq) +EXC_COMMON(handle_nmi_dec, 0x900, handle_soft_nmi) #ifdef CONFIG_KVM_BOOK3S_64_HANDLER TRAMP_REAL_BEGIN(kvmppc_skip_interrupt) diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index bc2e08d..cf814ea 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -118,6 +118,7 @@ struct clock_event_device decrementer_clockevent = { EXPORT_SYMBOL(decrementer_clockevent); DEFINE_PER_CPU(u64, decrementers_next_tb); +DEFINE_PER_CPU(u64, nmi_started_tb); static DEFINE_PER_CPU(struct clock_event_device, decrementers); #define XSEC_PER_SEC (1024*1024) @@ -520,6 +521,7 @@ static void __timer_interrupt(void) u64 now; trace_timer_interrupt_entry(regs); + __this_cpu_write(nmi_started_tb, 0); if (test_irq_work_pending()) { clear_irq_work_pending(); @@ -566,6 +568,7 @@ void timer_interrupt(struct pt_regs * regs) * some CPUs will continue to take decrementer exceptions. */ set_dec(decrementer_max); + __this_cpu_write(nmi_started_tb, 0); /* Some implementations of hotplug will get timer interrupts while * offline, just ignore these and we also need to set @@ -599,6 +602,28 @@ void timer_interrupt(struct pt_regs * regs) EXPORT_SYMBOL(timer_interrupt); /* + * If we have watchdog enabled, we do expect to hit this + * at-least once per sample_frequence. + * We set the decrement to 30 seconds and if we hit it + * again.. it's a BUG, it can be made a NMI panic as well. + */ +void handle_soft_nmi(struct pt_regs *regs) +{ + unsigned long long now = get_tb_or_rtc(); + unsigned long long nmi_started_time = __this_cpu_read(nmi_started_tb); + + if (!nmi_started_time) { + set_dec(ppc_tb_freq); + __this_cpu_write(nmi_started_tb, now); + } else { + if ((now - nmi_started_time) >= (30 * ppc_tb_freq)) + BUG(); + else + set_dec(ppc_tb_freq); + } +} + +/* * Hypervisor decrementer interrupts shouldn't occur but are sometimes * left pending on exit from a KVM guest. We don't need to do anything * to clear them, as they are edge-triggered.