Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp1330347ybk; Sun, 10 May 2020 13:28:43 -0700 (PDT) X-Google-Smtp-Source: APiQypKzbZp1sEEb2pIyfpTD2ea7zvYE0hddIl7vBb+kGe8LQ6vQonm+VM1TwiUW5cX+dD+lM0C5 X-Received: by 2002:aa7:d2d0:: with SMTP id k16mr11191371edr.354.1589142523427; Sun, 10 May 2020 13:28:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589142523; cv=none; d=google.com; s=arc-20160816; b=R41IBy5twFDswv2jEnxkSvIIhzpVOvNbXgQH+O4vVTQamlIjGIdxgz3kNQfrudr4w0 u+VjXlaf1puKdU6YaVNA0q8XKmtgeSk6egvQfcrc8nQlLdx7M4C/dDkGsqemu2JSHQMb i1B5FaXGtYaIE8QRt9VFSN8AyK2/pGsjvBymwzTV8aNAegTn8Uzgtk/2FdjfxXU6FnEv VXVFFbzzJsoYyWRjS0IyKpJ2LYsEJKxse2d70MYESN1TT6rgFCgiGoURkl+gBG4XuWd/ jy59IyKF5ge6RJMRq5n7tm5JcuEHSXfLsNj5AdVx1msS9PDxOi3ZGjzlH4p8DWHTr53Y 9YRg== 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=ktEJvuLjRdGObd9XB4X6c1FTgen2GQ5GeA/f/mZmo1s=; b=E2OqUrNxzGfOqgdDMmXTzX+VhVFp9cCSSMy4u3yrSViBWfW6F/5Ul72X3yx2jLwPoz vgRHJRZDJqy/Du5h6xyZj+Gj5nvaECZ5pRGOsldvUzHdVcxFLTuuo3OxEKBxA92mHRzb igMWdgtSD+D8EHQ7hUA1eYByXT+tEsehJNQTNuzBaDOrJ4Q5Fw0yI9pS5tPoSyzaCIQQ H4MLW0rKtrSFjo/HSPjXUovHvYX+N4RWRP2fPH0hkNfUk3H2P8DqYmGyMcZGpjBAWaZb L1Eh9E23VJgsrs4T1/C1n1yYJCCEyqApLo2t4DE0FarlG2/7wtzLGb+bUvogzSScfZ8y BUPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b="Y/sBPsqX"; 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=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dk9si4751198edb.403.2020.05.10.13.28.20; Sun, 10 May 2020 13:28:43 -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=@chromium.org header.s=google header.b="Y/sBPsqX"; 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=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729495AbgEJUZd (ORCPT + 99 others); Sun, 10 May 2020 16:25:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40898 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729358AbgEJUYs (ORCPT ); Sun, 10 May 2020 16:24:48 -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 2F909C05BD09 for ; Sun, 10 May 2020 13:24:48 -0700 (PDT) Received: by mail-pf1-x441.google.com with SMTP id d184so3764039pfd.4 for ; Sun, 10 May 2020 13:24:48 -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=ktEJvuLjRdGObd9XB4X6c1FTgen2GQ5GeA/f/mZmo1s=; b=Y/sBPsqX3MXZ9SIaNFNXmIdsJ3hVH9j0QIs/ZWile2giWgHsi0SikYyILcF9vk3GX2 ubDac1MgzJ2xuFzRSepzs0eQUPCFYIxpGN1trlcxmhG3QmQUnUEyRJVdGeFnc/kcCcS5 giZ9wkrUJX1JeOKrlBYauH00e0HPsaTkbRGDo= 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=ktEJvuLjRdGObd9XB4X6c1FTgen2GQ5GeA/f/mZmo1s=; b=djHVa9PA0c98XfAhWNkYYtbH1CvwfeDPGENAJFtR/xAuj6W9Bf5b3Ho+ZoM7KFAXxy f2GGIcClTEcSYzC7cT3uJEEXNxZ0WHyKSQdygvNUgcHHpx9pHSTZJSCCtGgdAfwq/fXw Wl9NtNiZOLFristvkN5hxPpBMt0uAn+vhtGUzPM0rY44Rh4Fed7FCcNztEjryj9WD4HS BoW9xebAyPns09hEnQndEtHMpJk7+jpWr3d+2l2oh2sfZ/BZD3ydGKGLgVVyN8o568++ 10dw3VBRLLiAEN8g3AdpjlgPie00cUsku501VGflaZROmBXgCejuUs7zP1OsEjKZI9p1 TEPg== X-Gm-Message-State: AGi0PuZxW4oU0h/2c90N1qJIUOBavrKPe/Jb3ZkFM5/e2zDg5Vf0WXHt R7ygf+CU4PKE9Tf0WMfPVp9t8A== X-Received: by 2002:aa7:9546:: with SMTP id w6mr12944921pfq.114.1589142287716; Sun, 10 May 2020 13:24:47 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id q14sm6250746pgq.60.2020.05.10.13.24.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 10 May 2020 13:24:45 -0700 (PDT) From: Kees Cook To: WeiXiong Liao Cc: Kees Cook , Anton Vorontsov , Colin Cross , Tony Luck , Jonathan Corbet , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Petr Mladek , Sergey Senozhatsky , Steven Rostedt , Rob Herring , Pavel Tatashin , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org Subject: [PATCH v7 06/18] pstore/ftrace: Provide ftrace log merging routine Date: Sun, 10 May 2020 13:24:24 -0700 Message-Id: <20200510202436.63222-7-keescook@chromium.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200510202436.63222-1-keescook@chromium.org> References: <20200510202436.63222-1-keescook@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move the ftrace log merging logic out of pstore/ram into pstore/ftrace so other backends can use it, like pstore/zone. Signed-off-by: Kees Cook --- fs/pstore/ftrace.c | 54 +++++++++++++++++++++++++++++++++++++++++ fs/pstore/internal.h | 9 +++++++ fs/pstore/ram.c | 57 +++----------------------------------------- 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/fs/pstore/ftrace.c b/fs/pstore/ftrace.c index bfbfc2698070..5c0450701293 100644 --- a/fs/pstore/ftrace.c +++ b/fs/pstore/ftrace.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include "internal.h" @@ -132,3 +133,56 @@ void pstore_unregister_ftrace(void) debugfs_remove_recursive(pstore_ftrace_dir); } + +ssize_t pstore_ftrace_combine_log(char **dest_log, size_t *dest_log_size, + const char *src_log, size_t src_log_size) +{ + size_t dest_size, src_size, total, dest_off, src_off; + size_t dest_idx = 0, src_idx = 0, merged_idx = 0; + void *merged_buf; + struct pstore_ftrace_record *drec, *srec, *mrec; + size_t record_size = sizeof(struct pstore_ftrace_record); + + dest_off = *dest_log_size % record_size; + dest_size = *dest_log_size - dest_off; + + src_off = src_log_size % record_size; + src_size = src_log_size - src_off; + + total = dest_size + src_size; + merged_buf = kmalloc(total, GFP_KERNEL); + if (!merged_buf) + return -ENOMEM; + + drec = (struct pstore_ftrace_record *)(*dest_log + dest_off); + srec = (struct pstore_ftrace_record *)(src_log + src_off); + mrec = (struct pstore_ftrace_record *)(merged_buf); + + while (dest_size > 0 && src_size > 0) { + if (pstore_ftrace_read_timestamp(&drec[dest_idx]) < + pstore_ftrace_read_timestamp(&srec[src_idx])) { + mrec[merged_idx++] = drec[dest_idx++]; + dest_size -= record_size; + } else { + mrec[merged_idx++] = srec[src_idx++]; + src_size -= record_size; + } + } + + while (dest_size > 0) { + mrec[merged_idx++] = drec[dest_idx++]; + dest_size -= record_size; + } + + while (src_size > 0) { + mrec[merged_idx++] = srec[src_idx++]; + src_size -= record_size; + } + + kfree(*dest_log); + *dest_log = merged_buf; + *dest_log_size = total; + + return 0; +} +EXPORT_SYMBOL_GPL(pstore_ftrace_combine_log); diff --git a/fs/pstore/internal.h b/fs/pstore/internal.h index 8efd72d93b10..7fb219042f13 100644 --- a/fs/pstore/internal.h +++ b/fs/pstore/internal.h @@ -12,9 +12,18 @@ extern unsigned long kmsg_bytes; #ifdef CONFIG_PSTORE_FTRACE extern void pstore_register_ftrace(void); extern void pstore_unregister_ftrace(void); +ssize_t pstore_ftrace_combine_log(char **dest_log, size_t *dest_log_size, + const char *src_log, size_t src_log_size); #else static inline void pstore_register_ftrace(void) {} static inline void pstore_unregister_ftrace(void) {} +static inline ssize_t +pstore_ftrace_combine_log(char **dest_log, size_t *dest_log_size, + const char *src_log, size_t src_log_size) +{ + *dest_log_size = 0; + return 0; +} #endif #ifdef CONFIG_PSTORE_PMSG diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 672ad80646c5..b7929fdc0c72 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -21,6 +21,7 @@ #include #include #include +#include "internal.h" #define RAMOOPS_KERNMSG_HDR "====" #define MIN_MEM_SIZE 4096UL @@ -172,59 +173,6 @@ static bool prz_ok(struct persistent_ram_zone *prz) persistent_ram_ecc_string(prz, NULL, 0)); } -static -ssize_t ftrace_log_combine(char **dest_log, size_t *dest_log_size, - const char *src_log, size_t src_log_size) -{ - size_t dest_size, src_size, total, dest_off, src_off; - size_t dest_idx = 0, src_idx = 0, merged_idx = 0; - void *merged_buf; - struct pstore_ftrace_record *drec, *srec, *mrec; - size_t record_size = sizeof(struct pstore_ftrace_record); - - dest_off = *dest_log_size % record_size; - dest_size = *dest_log_size - dest_off; - - src_off = src_log_size % record_size; - src_size = src_log_size - src_off; - - total = dest_size + src_size; - merged_buf = kmalloc(total, GFP_KERNEL); - if (!merged_buf) - return -ENOMEM; - - drec = (struct pstore_ftrace_record *)(*dest_log + dest_off); - srec = (struct pstore_ftrace_record *)(src_log + src_off); - mrec = (struct pstore_ftrace_record *)(merged_buf); - - while (dest_size > 0 && src_size > 0) { - if (pstore_ftrace_read_timestamp(&drec[dest_idx]) < - pstore_ftrace_read_timestamp(&srec[src_idx])) { - mrec[merged_idx++] = drec[dest_idx++]; - dest_size -= record_size; - } else { - mrec[merged_idx++] = srec[src_idx++]; - src_size -= record_size; - } - } - - while (dest_size > 0) { - mrec[merged_idx++] = drec[dest_idx++]; - dest_size -= record_size; - } - - while (src_size > 0) { - mrec[merged_idx++] = srec[src_idx++]; - src_size -= record_size; - } - - kfree(*dest_log); - *dest_log = merged_buf; - *dest_log_size = total; - - return 0; -} - static ssize_t ramoops_pstore_read(struct pstore_record *record) { ssize_t size = 0; @@ -297,7 +245,8 @@ static ssize_t ramoops_pstore_read(struct pstore_record *record) prz_next->corrected_bytes; tmp_prz->bad_blocks += prz_next->bad_blocks; - size = ftrace_log_combine(&tmp_prz->old_log, + size = pstore_ftrace_combine_log( + &tmp_prz->old_log, &tmp_prz->old_log_size, prz_next->old_log, prz_next->old_log_size); -- 2.20.1