From patchwork Wed May 6 21:15:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 200991 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D80F7C47257 for ; Wed, 6 May 2020 21:15:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BA4AA2075A for ; Wed, 6 May 2020 21:15:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="cq9duf0K" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729819AbgEFVP4 (ORCPT ); Wed, 6 May 2020 17:15:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729817AbgEFVPd (ORCPT ); Wed, 6 May 2020 17:15:33 -0400 Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 96792C0610D6 for ; Wed, 6 May 2020 14:15:32 -0700 (PDT) Received: by mail-pf1-x441.google.com with SMTP id 145so1738193pfw.13 for ; Wed, 06 May 2020 14:15:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UTadiU/eZ1q2VGZ0zHQqmJyy/ggoeusOcwyRzYvVDUc=; b=cq9duf0KIITAA+Ma8qYIxaZ1ZPr3t1w/UF75OOETMqQdQmgs22XTCQOGl6oiQEjz7p BgKpBL77SS7JZ5xo55zIXSOsqMrKyT1b27dFGHrBuSz/quzXybhAwKS4r8OJ1QwyxhGQ B7rHm2bNXagzf+t9CQEiLLeU6Hp5erNLSitjg= 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:mime-version:content-transfer-encoding; bh=UTadiU/eZ1q2VGZ0zHQqmJyy/ggoeusOcwyRzYvVDUc=; b=codGSKVYp5Mu8yrJVIVSracXIW8v2higjOiUehY7JD+KgCPebicuCfHHkivGl3U0Dc 3Am2UgIR8Slr5IQHOqVTjenP2Y00Cbue8kJ1eqD4jdxvoqf2UplblOEDE3UVd1L9gnNd hM/Z/Atz8sHSeyleiIgRHZtCxf2fXpB7ZVVDM5NEJnVzHDDtvFFuS+hIAtOoafu3Xr4K Z1teKtd1loRnvQpVTOPUnIwFlsprGjixrwQ6RbYjffheJT8MVn6ifecmuW3Uiqm1MP/F 7QZ0rjeGVH1dUvEVt6w3FFtvwD9WNUOHjZXBX7dlfBrHH8q8BeQzSDsOB7FriEKEz2P5 dprw== X-Gm-Message-State: AGi0Pua7/5zOcse/q/h0NvwyzrlrEAl85ifCihearoOmUVZ2i5KNtOO4 uzSCJ9NCH6XcAXTz4jdwFP88dQ== X-Google-Smtp-Source: APiQypJMGq3U5ddizQcOsBKxOLGbBmDpeYTINpkjDXZZ8zOo3aE8YDsIBWjDo4JQqzR3y3Z1flDR4Q== X-Received: by 2002:aa7:9546:: with SMTP id w6mr10197340pfq.114.1588799732130; Wed, 06 May 2020 14:15:32 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id m19sm5619332pjv.30.2020.05.06.14.15.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2020 14:15:29 -0700 (PDT) From: Kees Cook To: Pavel Tatashin Cc: Kees Cook , Anton Vorontsov , Colin Cross , Tony Luck , Jonathan Corbet , Rob Herring , Benson Leung , Enric Balletbo i Serra , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , jmorris@namei.org, sashal@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v3 1/6] printk: honor the max_reason field in kmsg_dumper Date: Wed, 6 May 2020 14:15:18 -0700 Message-Id: <20200506211523.15077-2-keescook@chromium.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200506211523.15077-1-keescook@chromium.org> References: <20200506211523.15077-1-keescook@chromium.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org From: Pavel Tatashin kmsg_dump() allows to dump kmesg buffer for various system events: oops, panic, reboot, etc. It provides an interface to register a callback call for clients, and in that callback interface there is a field "max_reason" which gets ignored unless always_kmsg_dump is passed as kernel parameter. Allow clients to decide max_reason, and keep the current behavior when max_reason is not set. Signed-off-by: Pavel Tatashin Link: https://lore.kernel.org/r/20200505154510.93506-2-pasha.tatashin@soleen.com Signed-off-by: Kees Cook --- include/linux/kmsg_dump.h | 1 + kernel/printk/printk.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h index 2e7a1e032c71..cfc042066be7 100644 --- a/include/linux/kmsg_dump.h +++ b/include/linux/kmsg_dump.h @@ -28,6 +28,7 @@ enum kmsg_dump_reason { KMSG_DUMP_RESTART, KMSG_DUMP_HALT, KMSG_DUMP_POWEROFF, + KMSG_DUMP_MAX }; /** diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 9a9b6156270b..1aab69a8a2bf 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -3157,12 +3157,19 @@ void kmsg_dump(enum kmsg_dump_reason reason) struct kmsg_dumper *dumper; unsigned long flags; - if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump) - return; - rcu_read_lock(); list_for_each_entry_rcu(dumper, &dump_list, list) { - if (dumper->max_reason && reason > dumper->max_reason) + enum kmsg_dump_reason cur_reason = dumper->max_reason; + + /* + * If client has not provided a specific max_reason, default + * to KMSG_DUMP_OOPS, unless always_kmsg_dump was set. + */ + if (cur_reason == KMSG_DUMP_UNDEF) { + cur_reason = always_kmsg_dump ? KMSG_DUMP_MAX : + KMSG_DUMP_OOPS; + } + if (reason > cur_reason) continue; /* initialize iterator with data about the stored records */ From patchwork Wed May 6 21:15:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 200994 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5CEF7C28CBC for ; Wed, 6 May 2020 21:15:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 36D382076D for ; Wed, 6 May 2020 21:15:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="i3QVmD+M" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729353AbgEFVPb (ORCPT ); Wed, 6 May 2020 17:15:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57338 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728821AbgEFVPb (ORCPT ); Wed, 6 May 2020 17:15:31 -0400 Received: from mail-pl1-x642.google.com (mail-pl1-x642.google.com [IPv6:2607:f8b0:4864:20::642]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 37FD5C061A0F for ; Wed, 6 May 2020 14:15:31 -0700 (PDT) Received: by mail-pl1-x642.google.com with SMTP id f15so1123042plr.3 for ; Wed, 06 May 2020 14:15:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DGtsWyyI3BG3brxddaQI3/YJe05pwv0JTAbKs1mm5vc=; b=i3QVmD+M2KxEd2oig7EU863j/gw4WgNr+A5ERu8swusXsfmMSvoCVZ6y+3PmiBSic3 OI5/3sT1ZliIcrUaTG+3/Drqlxy7R7GEBOoRaeYOXE/QvrpuL80B5YxvPtTVZGntVqCe 1LNXkTkCQplLNdvEReEpPd9Ns3RsqPNM6lX/w= 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:mime-version:content-transfer-encoding; bh=DGtsWyyI3BG3brxddaQI3/YJe05pwv0JTAbKs1mm5vc=; b=N10lxAzKtXM0m3rpy3DOcNe6z8B7YLr7YeZ0w0A6LSlkQV5OvQfT4m1E0aAOCcpfSE HsbN6kfa0lgf2DK198ZEbyyavAcGIH7MRwm2NrjBsEzChXnJd/1ePiJcIMFVS7KL/kE0 1JQfvIWwHO7Gn8cy3k84NUgZ402FTgDZ44ReT2ENEK9tQbYZ3UQ8FSk63kyisPXJNvR2 MSIA/zmn+FC9dRnycEgbK8fBUt6PKA6pSa9sZUCqfnqWD8oYv6SUjW2VOxWAw1XBr0Ht yNOQMctSSbyoVq0SbVs4sta2/YqEbx4wcq12jnPSTska/HeGTeez5CY0ti6gOP2kQ/ko Fm2A== X-Gm-Message-State: AGi0Pua/Ko1Uoo47bhMaIhH1M90bmKadtDUouAzgLgCHBHLFKwUmx/e3 UIFj+DwM27c6/HAVol8jKFbu1w== X-Google-Smtp-Source: APiQypLS8ol9AGtmbzC3gVURa+GQr+E7rZo3lMFLZDHm89H4EJ8dabmqGYPh2Aqcp0SuM1iqnJoT7A== X-Received: by 2002:a17:902:8b82:: with SMTP id ay2mr9692747plb.94.1588799730685; Wed, 06 May 2020 14:15:30 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id y3sm2684831pfb.132.2020.05.06.14.15.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2020 14:15:29 -0700 (PDT) From: Kees Cook To: Pavel Tatashin Cc: Kees Cook , Anton Vorontsov , Colin Cross , Tony Luck , Jonathan Corbet , Rob Herring , Benson Leung , Enric Balletbo i Serra , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , jmorris@namei.org, sashal@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v3 3/6] pstore/ram: Refactor DT size parsing Date: Wed, 6 May 2020 14:15:20 -0700 Message-Id: <20200506211523.15077-4-keescook@chromium.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200506211523.15077-1-keescook@chromium.org> References: <20200506211523.15077-1-keescook@chromium.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Refactor device tree size parsing routines to be able to pass a non-zero default value for providing a configurable default for the coming "max_reason" field. Signed-off-by: Kees Cook --- fs/pstore/ram.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 795622190c01..c2f76b650f91 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -645,18 +645,23 @@ static int ramoops_init_prz(const char *name, } static int ramoops_parse_dt_size(struct platform_device *pdev, - const char *propname, u32 *value) + const char *propname, + u32 default_value, u32 *value) { u32 val32 = 0; int ret; ret = of_property_read_u32(pdev->dev.of_node, propname, &val32); - if (ret < 0 && ret != -EINVAL) { + if (ret == -EINVAL) { + /* field is missing, use default value. */ + val32 = default_value; + } else if (ret < 0) { dev_err(&pdev->dev, "failed to parse property %s: %d\n", propname, ret); return ret; } + /* Sanity check our results. */ if (val32 > INT_MAX) { dev_err(&pdev->dev, "%s %u > INT_MAX\n", propname, val32); return -EOVERFLOW; @@ -689,19 +694,20 @@ static int ramoops_parse_dt(struct platform_device *pdev, pdata->mem_type = of_property_read_bool(of_node, "unbuffered"); pdata->dump_oops = !of_property_read_bool(of_node, "no-dump-oops"); -#define parse_size(name, field) { \ - ret = ramoops_parse_dt_size(pdev, name, &value); \ +#define parse_size(name, field, default_value) { \ + ret = ramoops_parse_dt_size(pdev, name, default_value, \ + &value); \ if (ret < 0) \ return ret; \ field = value; \ } - parse_size("record-size", pdata->record_size); - parse_size("console-size", pdata->console_size); - parse_size("ftrace-size", pdata->ftrace_size); - parse_size("pmsg-size", pdata->pmsg_size); - parse_size("ecc-size", pdata->ecc_info.ecc_size); - parse_size("flags", pdata->flags); + parse_size("record-size", pdata->record_size, 0); + parse_size("console-size", pdata->console_size, 0); + parse_size("ftrace-size", pdata->ftrace_size, 0); + parse_size("pmsg-size", pdata->pmsg_size, 0); + parse_size("ecc-size", pdata->ecc_info.ecc_size, 0); + parse_size("flags", pdata->flags, 0); #undef parse_size From patchwork Wed May 6 21:15:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 200993 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53392C47257 for ; Wed, 6 May 2020 21:15:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2A46B2075A for ; Wed, 6 May 2020 21:15:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="CuRYZpVN" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729936AbgEFVPi (ORCPT ); Wed, 6 May 2020 17:15:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57348 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729868AbgEFVPf (ORCPT ); Wed, 6 May 2020 17:15:35 -0400 Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58DC9C03C1AA for ; Wed, 6 May 2020 14:15:34 -0700 (PDT) Received: by mail-pf1-x444.google.com with SMTP id f7so1748928pfa.9 for ; Wed, 06 May 2020 14:15:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=P2YF5MDv76RUcgKI6RO0ENH/TKSTfV+gB8VlGAToT0o=; b=CuRYZpVN8URjaP1/HNW0KGaEFXUJjCHz3p6hvzyNo0PF3Md1s/BEdh+pPGMixBOBSB UoKFBSauzrFpp3kGEX06P0pPn3hPbKbOE+FltycSiroLOti0si+w/RAPbacyDtcF2zht +SmKFdpHNco/LJl+CgZ7Terxz+JSWBEFGUjR8= 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:mime-version:content-transfer-encoding; bh=P2YF5MDv76RUcgKI6RO0ENH/TKSTfV+gB8VlGAToT0o=; b=oM/APDNllyXLQu8Qi5spRV0TX/DgZB01EBDUoWiXDdWTYuNdlA5YaqUMdyti81P2FQ szoUThiiI6BLL7ZRxHQy3I9daoZn4Q6d2E1gWeZzfemzhHmU6RR8LS498fgHnMBglKpt ydRdnxwaI6FWk2fk7za49wKx7C64xKkFH75EabFzmhk3egcmwYWr/Qxv1hVeG5UZbsSJ B+Z1d7RJJ91wOWxlnlgTwkzPWyODLOxu9a6+cPGprM5ApROhprGu7STNGoa9sWuWSG1J oZbdXRbs3wqkIHd3tAHu3L6AzPwH387u3c+GMA6VSo3RWeKslaGAow5t5t8cAt2a9S6f xWPQ== X-Gm-Message-State: AGi0Pual39JLTqUJ+60PMrFJZoeA2+s/YoeLL1/FmzEDGpB3yCnuxZ5f VtnlRhZ3REByn11r11VhjIAGxhhBEdQ= X-Google-Smtp-Source: APiQypIThrEIlJ3VThfY2pa4C/BXi0BOOMi2Q/jQD/Z/5Hk/pcITQgPF80fKtVBw5qKZrhCw3gGr4w== X-Received: by 2002:a63:6285:: with SMTP id w127mr8281129pgb.449.1588799733553; Wed, 06 May 2020 14:15:33 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id q14sm2261672pgq.60.2020.05.06.14.15.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2020 14:15:29 -0700 (PDT) From: Kees Cook To: Pavel Tatashin Cc: Kees Cook , Anton Vorontsov , Colin Cross , Tony Luck , Jonathan Corbet , Rob Herring , Benson Leung , Enric Balletbo i Serra , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , jmorris@namei.org, sashal@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v3 4/6] pstore/ram: Introduce max_reason and convert dump_oops Date: Wed, 6 May 2020 14:15:21 -0700 Message-Id: <20200506211523.15077-5-keescook@chromium.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200506211523.15077-1-keescook@chromium.org> References: <20200506211523.15077-1-keescook@chromium.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org From: Pavel Tatashin Now that pstore_register() can correctly pass max_reason to the kmesg dump facility, introduce a new "max_reason" module parameter and "max-reason" Device Tree field. The "dump_oops" module parameter and "dump-oops" Device Tree field are now considered deprecated, but are now automatically converted to their corresponding max_reason values when present, though the new max_reason setting has precedence. For struct ramoops_platform_data, the "dump_oops" member is entirely replaced by a new "max_reason" member, with the only existing user updated in place. Additionally remove the "reason" filter logic from ramoops_pstore_write(), as that is not specifically needed anymore, though technically this is a change in behavior for any ramoops users also setting the printk.always_kmsg_dump boot param, which will cause ramoops to behave as if max_reason was set to KMSG_DUMP_MAX. Signed-off-by: Pavel Tatashin Link: https://lore.kernel.org/r/20200505154510.93506-4-pasha.tatashin@soleen.com Link: https://lore.kernel.org/r/20200505154510.93506-5-pasha.tatashin@soleen.com Co-developed-by: Kees Cook Signed-off-by: Kees Cook --- Documentation/admin-guide/ramoops.rst | 14 +++++-- drivers/platform/chrome/chromeos_pstore.c | 2 +- fs/pstore/ram.c | 51 +++++++++++++++-------- include/linux/pstore_ram.h | 2 +- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/Documentation/admin-guide/ramoops.rst b/Documentation/admin-guide/ramoops.rst index 6dbcc5481000..a60a96218ba9 100644 --- a/Documentation/admin-guide/ramoops.rst +++ b/Documentation/admin-guide/ramoops.rst @@ -32,11 +32,17 @@ memory to be mapped strongly ordered, and atomic operations on strongly ordered memory are implementation defined, and won't work on many ARMs such as omaps. The memory area is divided into ``record_size`` chunks (also rounded down to -power of two) and each oops/panic writes a ``record_size`` chunk of +power of two) and each kmesg dump writes a ``record_size`` chunk of information. -Dumping both oopses and panics can be done by setting 1 in the ``dump_oops`` -variable while setting 0 in that variable dumps only the panics. +Limiting which kinds of kmsg dumps are stored can be controlled via +the ``max_reason`` value, as defined in include/linux/kmsg_dump.h's +``enum kmsg_dump_reason``. For example, to store both Oopses and Panics, +``max_reason`` should be set to 2 (KMSG_DUMP_OOPS), to store only Panics +``max_reason`` should be set to 1 (KMSG_DUMP_PANIC). Setting this to 0 +(KMSG_DUMP_UNDEF), means the reason filtering will be controlled by the +``printk.always_kmsg_dump`` boot param: if unset, it'll be KMSG_DUMP_OOPS, +otherwise KMSG_DUMP_MAX. The module uses a counter to record multiple dumps but the counter gets reset on restart (i.e. new dumps after the restart will overwrite old ones). @@ -90,7 +96,7 @@ Setting the ramoops parameters can be done in several different manners: .mem_address = <...>, .mem_type = <...>, .record_size = <...>, - .dump_oops = <...>, + .max_reason = <...>, .ecc = <...>, }; diff --git a/drivers/platform/chrome/chromeos_pstore.c b/drivers/platform/chrome/chromeos_pstore.c index d13770785fb5..fa51153688b4 100644 --- a/drivers/platform/chrome/chromeos_pstore.c +++ b/drivers/platform/chrome/chromeos_pstore.c @@ -57,7 +57,7 @@ static struct ramoops_platform_data chromeos_ramoops_data = { .record_size = 0x40000, .console_size = 0x20000, .ftrace_size = 0x20000, - .dump_oops = 1, + .max_reason = KMSG_DUMP_OOPS, }; static struct platform_device chromeos_ramoops = { diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index c2f76b650f91..b8dac1d04e96 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -57,10 +57,15 @@ module_param(mem_type, uint, 0600); MODULE_PARM_DESC(mem_type, "set to 1 to try to use unbuffered memory (default 0)"); -static int dump_oops = 1; -module_param(dump_oops, int, 0600); +static int ramoops_dump_oops = -1; +module_param_named(dump_oops, ramoops_dump_oops, int, 0400); MODULE_PARM_DESC(dump_oops, - "set to 1 to dump oopses, 0 to only dump panics (default 1)"); + "set to 1 to dump oopses & panics, 0 to only dump panics (deprecated: use max_reason instead)"); + +static int ramoops_max_reason = KMESG_DUMP_OOPS; +module_param_named(max_reason, ramoops_max_reason, int, 0400); +MODULE_PARM_DESC(max_reason, + "maximum reason for kmsg dump (default 2: Oops and Panic) "); static int ramoops_ecc; module_param_named(ecc, ramoops_ecc, int, 0600); @@ -81,7 +86,6 @@ struct ramoops_context { size_t console_size; size_t ftrace_size; size_t pmsg_size; - int dump_oops; u32 flags; struct persistent_ram_ecc_info ecc_info; unsigned int max_dump_cnt; @@ -382,16 +386,14 @@ static int notrace ramoops_pstore_write(struct pstore_record *record) return -EINVAL; /* - * Out of the various dmesg dump types, ramoops is currently designed - * to only store crash logs, rather than storing general kernel logs. + * We could filter on record->reason here if we wanted to (which + * would duplicate what happened before the "max_reason" setting + * was added), but that would defeat the purpose of a system + * changing printk.always_kmsg_dump, so instead log everything that + * the kmsg dumper sends us, since it should be doing the filtering + * based on the combination of printk.always_kmsg_dump and our + * requested "max_reason". */ - if (record->reason != KMSG_DUMP_OOPS && - record->reason != KMSG_DUMP_PANIC) - return -EINVAL; - - /* Skip Oopes when configured to do so. */ - if (record->reason == KMSG_DUMP_OOPS && !cxt->dump_oops) - return -EINVAL; /* * Explicitly only take the first part of any new crash. @@ -692,7 +694,14 @@ static int ramoops_parse_dt(struct platform_device *pdev, pdata->mem_size = resource_size(res); pdata->mem_address = res->start; pdata->mem_type = of_property_read_bool(of_node, "unbuffered"); - pdata->dump_oops = !of_property_read_bool(of_node, "no-dump-oops"); + /* + * Setting "no-dump-oops" is deprecated and will be ignored if + * "max_reason" is also specified. + */ + if (of_property_read_bool(of_node, "no-dump-oops")) + pdata->max_reason = KMSG_DUMP_PANIC; + else + pdata->max_reason = KMSG_DUMP_OOPS; #define parse_size(name, field, default_value) { \ ret = ramoops_parse_dt_size(pdev, name, default_value, \ @@ -708,6 +717,7 @@ static int ramoops_parse_dt(struct platform_device *pdev, parse_size("pmsg-size", pdata->pmsg_size, 0); parse_size("ecc-size", pdata->ecc_info.ecc_size, 0); parse_size("flags", pdata->flags, 0); + parse_size("max-reason", pdata->max_reason, pdata->max_reason); #undef parse_size @@ -791,7 +801,6 @@ static int ramoops_probe(struct platform_device *pdev) cxt->console_size = pdata->console_size; cxt->ftrace_size = pdata->ftrace_size; cxt->pmsg_size = pdata->pmsg_size; - cxt->dump_oops = pdata->dump_oops; cxt->flags = pdata->flags; cxt->ecc_info = pdata->ecc_info; @@ -834,8 +843,10 @@ static int ramoops_probe(struct platform_device *pdev) * the single region size is how to check. */ cxt->pstore.flags = 0; - if (cxt->max_dump_cnt) + if (cxt->max_dump_cnt) { cxt->pstore.flags |= PSTORE_FLAGS_DMESG; + cxt->pstore.max_reason = pdata->max_reason; + } if (cxt->console_size) cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE; if (cxt->max_ftrace_cnt) @@ -871,7 +882,7 @@ static int ramoops_probe(struct platform_device *pdev) mem_size = pdata->mem_size; mem_address = pdata->mem_address; record_size = pdata->record_size; - dump_oops = pdata->dump_oops; + ramoops_max_reason = pdata->max_reason; ramoops_console_size = pdata->console_size; ramoops_pmsg_size = pdata->pmsg_size; ramoops_ftrace_size = pdata->ftrace_size; @@ -954,7 +965,11 @@ static void __init ramoops_register_dummy(void) pdata.console_size = ramoops_console_size; pdata.ftrace_size = ramoops_ftrace_size; pdata.pmsg_size = ramoops_pmsg_size; - pdata.dump_oops = dump_oops; + /* Parse deprecated module param "dump_oops" into "max_reason". */ + if (ramoops_dump_oops != -1) + pdata.max_reason = ramoops_dump_oops ? KMSG_DUMP_OOPS + : KMSG_DUMP_PANIC; + pdata.max_reason = ramoops_max_reason; pdata.flags = RAMOOPS_FLAG_FTRACE_PER_CPU; /* diff --git a/include/linux/pstore_ram.h b/include/linux/pstore_ram.h index 9cb9b9067298..9f16afec7290 100644 --- a/include/linux/pstore_ram.h +++ b/include/linux/pstore_ram.h @@ -133,7 +133,7 @@ struct ramoops_platform_data { unsigned long console_size; unsigned long ftrace_size; unsigned long pmsg_size; - int dump_oops; + int max_reason; u32 flags; struct persistent_ram_ecc_info ecc_info; }; From patchwork Wed May 6 21:15:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kees Cook X-Patchwork-Id: 200992 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC342C54E4A for ; Wed, 6 May 2020 21:15:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8C0F62075A for ; Wed, 6 May 2020 21:15:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Txy06LIk" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729918AbgEFVPt (ORCPT ); Wed, 6 May 2020 17:15:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729895AbgEFVPg (ORCPT ); Wed, 6 May 2020 17:15:36 -0400 Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3729FC061A0F for ; Wed, 6 May 2020 14:15:36 -0700 (PDT) Received: by mail-pf1-x441.google.com with SMTP id p25so1747415pfn.11 for ; Wed, 06 May 2020 14:15:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TpLLG3pWKEaOPKHac5Nkwz9KtMblvoPDFiZ/SitIX00=; b=Txy06LIk/ydKHtmNLAtvcMT48XfUpahkLBKCHntkIXGcYuuitksn6Ujhgb0yRJXnrE 028IK5cQeQd3o5b9yievHYq1s04heCzgGC56pigiaNf9pjyFzwe+T497rhY5w823fpkV M99c7WWZZZten6T8yf8iEf0eyLGS/aZGltqBQ= 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:mime-version:content-transfer-encoding; bh=TpLLG3pWKEaOPKHac5Nkwz9KtMblvoPDFiZ/SitIX00=; b=ZXSOejmbRx3nLN5WJ8ttucsGYW/Sx9KLoXdRVL5PmG0jmjxbHiYERVnOp1yAVYZ48x FV67Z9nB8IEDjnYnHxC8N/Q2cIoHFp8Ygrjg3yTsMqkKk/YF8Q5bzEVnmhJwfzrkpv1v RnKA3Ya7NXUHhx1vINPCOOvmMFhOzEHyzn1ms6hlyrdhfUZY9Spcc7G6Ks/4AnI1wATY tikPfRYzP/x1Q/xM+nr2LP6fL3gPSBys3oifKwq5dItLe1UenJB2e5pIDfqsYzIwgjnj tbF873CxPs0li2iNFg+ZRu+dLg7v/vSCup7qDcowActL4y4EHrZuDgdKp/vmEaOaDX6S ODig== X-Gm-Message-State: AGi0Puat3Rf1Bbcqquh2EqPXq2CN0gm6+bVkUbE139kw6ozoIbQtLzAr iiQzgnR2O8IvNalaF0ahUJKrkw== X-Google-Smtp-Source: APiQypK8UdDkIoIIO+IC1Ly/YfpTzLO1dFuZ9+vKGj8L8fRa2h/L7QWdnMlATD9BYmUl6aJoPv9b3w== X-Received: by 2002:a63:150:: with SMTP id 77mr8334289pgb.136.1588799735729; Wed, 06 May 2020 14:15:35 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id s22sm2721551pfd.51.2020.05.06.14.15.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2020 14:15:33 -0700 (PDT) From: Kees Cook To: Pavel Tatashin Cc: Kees Cook , Anton Vorontsov , Colin Cross , Tony Luck , Jonathan Corbet , Rob Herring , Benson Leung , Enric Balletbo i Serra , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , jmorris@namei.org, sashal@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v3 5/6] ramoops: Add max_reason optional field to ramoops DT node Date: Wed, 6 May 2020 14:15:22 -0700 Message-Id: <20200506211523.15077-6-keescook@chromium.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200506211523.15077-1-keescook@chromium.org> References: <20200506211523.15077-1-keescook@chromium.org> MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org From: Pavel Tatashin Currently, it is possible to dump kmsges for panic, or oops. With max_reason it is possible to dump messages for other kmesg_dump events, for example reboot, halt, shutdown, kexec. Signed-off-by: Pavel Tatashin Link: https://lore.kernel.org/r/20200505154510.93506-6-pasha.tatashin@soleen.com Signed-off-by: Kees Cook --- .../devicetree/bindings/reserved-memory/ramoops.txt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/reserved-memory/ramoops.txt b/Documentation/devicetree/bindings/reserved-memory/ramoops.txt index 0eba562fe5c6..b7886fea368c 100644 --- a/Documentation/devicetree/bindings/reserved-memory/ramoops.txt +++ b/Documentation/devicetree/bindings/reserved-memory/ramoops.txt @@ -30,7 +30,7 @@ Optional properties: - ecc-size: enables ECC support and specifies ECC buffer size in bytes (defaults to 0: no ECC) -- record-size: maximum size in bytes of each dump done on oops/panic +- record-size: maximum size in bytes of each kmsg dump. (defaults to 0: disabled) - console-size: size in bytes of log buffer reserved for kernel messages @@ -45,7 +45,16 @@ Optional properties: - unbuffered: if present, use unbuffered mappings to map the reserved region (defaults to buffered mappings) -- no-dump-oops: if present, only dump panics (defaults to panics and oops) +- max-reason: if present, sets maximum type of kmsg dump reasons to store + (defaults to 2: log Oopses and Panics). This can be set to INT_MAX to + store all kmsg dumps. See include/linux/kmsg_dump.h KMSG_DUMP_* for other + kmsg dump reason values. Setting this to 0 (KMSG_DUMP_UNDEF), means the + reason filtering will be controlled by the printk.always_kmsg_dump boot + param: if unset, it will be KMSG_DUMP_OOPS, otherwise KMSG_DUMP_MAX. + +- no-dump-oops: deprecated, use max_reason instead. If present, and + max_reason is not specified, it is equivalent to max_reason = 1 + (KMSG_DUMP_PANIC). - flags: if present, pass ramoops behavioral flags (defaults to 0, see include/linux/pstore_ram.h RAMOOPS_FLAG_* for flag values).