From patchwork Wed Jan 13 09:10:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 12016193 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=-16.6 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,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 C0FD7C433E0 for ; Wed, 13 Jan 2021 09:10:28 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1A70E2339D for ; Wed, 13 Jan 2021 09:10:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1A70E2339D Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 708F68D0023; Wed, 13 Jan 2021 04:10:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 6B8718D0019; Wed, 13 Jan 2021 04:10:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 57F498D0023; Wed, 13 Jan 2021 04:10:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0071.hostedemail.com [216.40.44.71]) by kanga.kvack.org (Postfix) with ESMTP id 400758D0019 for ; Wed, 13 Jan 2021 04:10:27 -0500 (EST) Received: from smtpin11.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 03D2E181AEF23 for ; Wed, 13 Jan 2021 09:10:27 +0000 (UTC) X-FDA: 77700180894.11.face26_600dd7b2751c Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin11.hostedemail.com (Postfix) with ESMTP id DA735180F8B81 for ; Wed, 13 Jan 2021 09:10:26 +0000 (UTC) X-HE-Tag: face26_600dd7b2751c X-Filterd-Recvd-Size: 7366 Received: from mail-wr1-f74.google.com (mail-wr1-f74.google.com [209.85.221.74]) by imf41.hostedemail.com (Postfix) with ESMTP for ; Wed, 13 Jan 2021 09:10:26 +0000 (UTC) Received: by mail-wr1-f74.google.com with SMTP id b8so636318wrv.14 for ; Wed, 13 Jan 2021 01:10:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=fSzBeKXP0Nh8klQwaoWnqoqW21r9BnvxbYgVEskeqWs=; b=E7Ff/PeTeEp/tffuQzhGcvBDdqch+30pi5ZCpjQxkBQG2mJEOe2Kq9AXfkAM9RNEQN SF3B52rov9LnbsVmplJS5p0PPT6hpEhSv26O9ra+nIfGvDX64OKrB7O2aHd3QX0zA01D Mc4nbWGmDi1/3lRA8vDUo5lOhIuXhgxZbsBSbwwo9shkH9+5yag+QKSfdNcgEIQ++bSS ZEamoIo6H6nITJjboVGMRRZ0eHNTicyEUsw57sb19J8ITZJktnf+WkVhHHMMg/lqKiOx BB0tnDiei6iI7ff/GWAybcW8ixJN27t/1GWEmAZXKccrzErl5BpHicbF6XL/4gHK2iCr lhGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=fSzBeKXP0Nh8klQwaoWnqoqW21r9BnvxbYgVEskeqWs=; b=VyrF1xgt/bfXvgHVz6Fi0DmyvaAxeOFL6mAshwuVy3nRSkZECbjtj2j9Uf4eFVaoyQ jUjCDonvJVGUpKhc04IrsxdrgK5naTvKoYRvK/xlb+//U7WYmueENGUS91PoXhnCrLC9 mvux32+RELhSlorp48Tl68NXFmFKyf4B5dShG18SXV+Ah7WKtftEIJs64R/qqquUIXgI oh/ynQVeSlCXhWhZy+QmVcvp6MnMYV5Ry3dkBXOQDPIKUZFPcQ/tSK4MNPOg3HILxotG a2abw2tr33OvO/r/41eLk/XSyqUOkMc56MdVvFM/OOvpR7FsOkxvxHj9esf51kycvxL0 LbSQ== X-Gm-Message-State: AOAM532J0L6iTXAAZYpTIidIjH4gpD5DeNok/dioFVaeI+OTZk7DwmXF niHO7dS2Ypuco9i6GsimDi109wRvaOs= X-Google-Smtp-Source: ABdhPJx0I0tRcyIkYioQ7MH7fvVXWyYnBMOYOJ+U8wVSWf5ru1Ukqq8kRjmD7xT65fn3qydqEDid4ZDnZbk= X-Received: from glider.muc.corp.google.com ([2a00:79e0:15:13:f693:9fff:fef4:9ff]) (user=glider job=sendgmr) by 2002:a1c:8195:: with SMTP id c143mr1169117wmd.59.1610529024753; Wed, 13 Jan 2021 01:10:24 -0800 (PST) Date: Wed, 13 Jan 2021 10:10:14 +0100 In-Reply-To: <20210113091017.1444780-1-glider@google.com> Message-Id: <20210113091017.1444780-2-glider@google.com> Mime-Version: 1.0 References: <20210113091017.1444780-1-glider@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH 1/4] tracing: add error_report trace points From: Alexander Potapenko To: akpm@linux-foundation.org Cc: Alexander Potapenko , Marco Elver , Andrey Konovalov , Dmitry Vyukov , Ingo Molnar , Petr Mladek , Steven Rostedt , Sergey Senozhatsky , linux-mm@kvack.org X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Introduce error_report_start and error_report_end tracepoints. Those can be used in debugging tools like KASAN, KFENCE, etc. to provide extensions to the error reporting mechanisms (e.g. allow tests hook into error reporting, ease error report collection from production kernels). Another benefit would be making use of ftrace for debugging or benchmarking the tools themselves. Suggested-by: Marco Elver Cc: Andrew Morton Cc: Andrey Konovalov Cc: Dmitry Vyukov Cc: Ingo Molnar Cc: Marco Elver Cc: Petr Mladek Cc: Steven Rostedt Cc: Sergey Senozhatsky Cc: linux-mm@kvack.org Signed-off-by: Alexander Potapenko --- include/trace/events/error_report.h | 51 +++++++++++++++++++++++++++++ kernel/trace/Makefile | 1 + kernel/trace/error_report-traces.c | 11 +++++++ 3 files changed, 63 insertions(+) create mode 100644 include/trace/events/error_report.h create mode 100644 kernel/trace/error_report-traces.c diff --git a/include/trace/events/error_report.h b/include/trace/events/error_report.h new file mode 100644 index 000000000000..bae0129031f0 --- /dev/null +++ b/include/trace/events/error_report.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM error_report + +#if !defined(_TRACE_ERROR_REPORT_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_ERROR_REPORT_H + +#include + +DECLARE_EVENT_CLASS(error_report_template, + TP_PROTO(const char *error_detector, unsigned long id), + TP_ARGS(error_detector, id), + TP_STRUCT__entry(__field(const char *, error_detector) + __field(unsigned long, id)), + TP_fast_assign(__entry->error_detector = error_detector; + __entry->id = id;), + TP_printk("[%s] %lx", __entry->error_detector, + __entry->id)); + +/** + * error_report_start - called before printing the error report + * @error_detector: short string describing the error detection tool + * @id: pseudo-unique descriptor that can help distinguish reports + * from one another. Depending on the tool, good examples + * could be: memory access address, call site, allocation + * site, etc. + * + * This event occurs right before a debugging tool starts printing the error + * report. + */ +DEFINE_EVENT(error_report_template, error_report_start, + TP_PROTO(const char *error_detector, unsigned long id), + TP_ARGS(error_detector, id)); + +/** + * error_report_end - called after printing the error report + * @error_detector: short string describing the error detection tool + * @id: pseudo-unique descriptor, matches that passed to + * error_report_start + * + * This event occurs right after a debugging tool finishes printing the error + * report. + */ +DEFINE_EVENT(error_report_template, error_report_end, + TP_PROTO(const char *error_detector, unsigned long id), + TP_ARGS(error_detector, id)); + +#endif /* _TRACE_ERROR_REPORT_H */ + +/* This part must be outside protection */ +#include diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile index 7e44cea89fdc..b28d3e5013cd 100644 --- a/kernel/trace/Makefile +++ b/kernel/trace/Makefile @@ -81,6 +81,7 @@ obj-$(CONFIG_SYNTH_EVENTS) += trace_events_synth.o obj-$(CONFIG_HIST_TRIGGERS) += trace_events_hist.o obj-$(CONFIG_BPF_EVENTS) += bpf_trace.o obj-$(CONFIG_KPROBE_EVENTS) += trace_kprobe.o +obj-$(CONFIG_TRACEPOINTS) += error_report-traces.o obj-$(CONFIG_TRACEPOINTS) += power-traces.o ifeq ($(CONFIG_PM),y) obj-$(CONFIG_TRACEPOINTS) += rpm-traces.o diff --git a/kernel/trace/error_report-traces.c b/kernel/trace/error_report-traces.c new file mode 100644 index 000000000000..80960c52c705 --- /dev/null +++ b/kernel/trace/error_report-traces.c @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Error reporting trace points + */ + +#define CREATE_TRACE_POINTS +#include + +EXPORT_TRACEPOINT_SYMBOL_GPL(error_report_start); +EXPORT_TRACEPOINT_SYMBOL_GPL(error_report_end); + From patchwork Wed Jan 13 09:10:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 12016195 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=-16.6 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,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 2F1DBC433E0 for ; Wed, 13 Jan 2021 09:10:31 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 7122A2339D for ; Wed, 13 Jan 2021 09:10:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7122A2339D Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id D4A688D0025; Wed, 13 Jan 2021 04:10:29 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id CFB328D0024; Wed, 13 Jan 2021 04:10:29 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BE9078D0025; Wed, 13 Jan 2021 04:10:29 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0054.hostedemail.com [216.40.44.54]) by kanga.kvack.org (Postfix) with ESMTP id A4E278D0024 for ; Wed, 13 Jan 2021 04:10:29 -0500 (EST) Received: from smtpin03.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 62FE5181AEF23 for ; Wed, 13 Jan 2021 09:10:29 +0000 (UTC) X-FDA: 77700180978.03.bears24_01108fe2751c Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin03.hostedemail.com (Postfix) with ESMTP id 2165028A4E8 for ; Wed, 13 Jan 2021 09:10:29 +0000 (UTC) X-HE-Tag: bears24_01108fe2751c X-Filterd-Recvd-Size: 15337 Received: from mail-wr1-f74.google.com (mail-wr1-f74.google.com [209.85.221.74]) by imf41.hostedemail.com (Postfix) with ESMTP for ; Wed, 13 Jan 2021 09:10:28 +0000 (UTC) Received: by mail-wr1-f74.google.com with SMTP id u14so637066wrr.15 for ; Wed, 13 Jan 2021 01:10:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=Mr/4JAPGFDkrDog5eCdPJZ3B6Plu19ZsSHa5ZA4i3EU=; b=uafbWYA2NzYcvKLakdv8DkQQwTf4PpXj1N3PXR0nrHI22G3u5/+7suOyN06jUXNAXL W9N4ETlwZ69vpUbcEfJaSu7pScVPvfWYve3ZAnCukLOGIjartX2pTYCbaYxOKGu4I4+D Hi6Spa3g8UA5IO8e6W/Hcj4bWbXW8p8uPEG8AhL+9eLAFmRg5Mk8FfPQdI5hYSJymLCN 0SWa2XldOXK5x3c+B0tuybTHXnqX9/ZTSdhhennFnUNB9Y12nDHWVNIQ+Rbj8P0Lqjqe u8TX7Usllksu0pLufe/HyXy/23Zgjk2bMAEivd05wz5gN8mGCxcE93MGQlXynl1VZqHn 6czg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=Mr/4JAPGFDkrDog5eCdPJZ3B6Plu19ZsSHa5ZA4i3EU=; b=DAQkjjsff4Y2hkTAawjoV6dJgnkYcIETF7XeihKij9Y9xiIO+yAnVnoP1zd3oHdzu+ j6mEeHELTVBuLffID4INv9OVwyuvGlLj0b7+ReCYHk3TC//ehgdc9g5taPYcJj3h9yG0 6gsgrrS9FL/5gtSJqA3sSSiRsyRrLT/rdEQzD8d0ZtqiPjtzbHRfmZZ8KhjDGdEksMPc XGeHxbLW3DI7pEEgOUpTDX3vONQaJQBvYhmhLp5rACXb70bKbCs8JK+y/JnImZh8I1RU CeeKzeYoahV+4IhbXcNGbGlOXqRO9pv7gvmtDXygb3kgOmWsewJYls6YoafMtsibAvSj h+7w== X-Gm-Message-State: AOAM532vAN8sf+mP/aWWBsNb0LqJX/EnPL905XErGZnwlXjl+n8kV/e7 3BEhNmbZsnCT+x4BxCGVE3szduSw52A= X-Google-Smtp-Source: ABdhPJyQ1JpeeLX0YX15fsLBvrzMR7kTSuoZI+dAC3wLb9EwIDTR68tWOSYDiGOZYc1p7TqSBNAkOf77bDs= X-Received: from glider.muc.corp.google.com ([2a00:79e0:15:13:f693:9fff:fef4:9ff]) (user=glider job=sendgmr) by 2002:adf:9d48:: with SMTP id o8mr1481294wre.408.1610529027327; Wed, 13 Jan 2021 01:10:27 -0800 (PST) Date: Wed, 13 Jan 2021 10:10:15 +0100 In-Reply-To: <20210113091017.1444780-1-glider@google.com> Message-Id: <20210113091017.1444780-3-glider@google.com> Mime-Version: 1.0 References: <20210113091017.1444780-1-glider@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH 2/4] lib: add error_report_notify to collect debugging tools' reports From: Alexander Potapenko To: akpm@linux-foundation.org Cc: Alexander Potapenko , Marco Elver , Andrey Konovalov , Dmitry Vyukov , Ingo Molnar , Petr Mladek , Steven Rostedt , Sergey Senozhatsky , linux-mm@kvack.org X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: With the introduction of various production error-detection tools, such as MTE-based KASAN and KFENCE, the need arises to efficiently notify the userspace OS components about kernel errors. Currently, no facility exists to notify userspace about a kernel error from such bug-detection tools. The problem is obviously not restricted to the above bug detection tools, and applies to any error reporting mechanism that does not panic the kernel; this series, however, will only add support for KASAN and KFENCE reporting. All such error reports appear in the kernel log. But, when such errors occur, userspace would normally need to read the entire kernel log and parse the relevant errors. This is error prone and inefficient, as userspace needs to continuously monitor the kernel log for error messages. On certain devices, this is unfortunately not acceptable. Therefore, we need to revisit how reports are propagated to userspace. The library added, error_report_notify (CONFIG_ERROR_REPORT_NOTIFY), solves the above by using the error_report_start/error_report_end tracing events and exposing the last report and the total report count to the userspace via /sys/kernel/error_report/last_report and /sys/kernel/error_report/report_count. Userspace apps can call poll(POLLPRI) on those files to get notified about the new reports without having to watch dmesg in a loop. Suggested-by: Marco Elver Cc: Andrew Morton Cc: Andrey Konovalov Cc: Dmitry Vyukov Cc: Ingo Molnar Cc: Marco Elver Cc: Petr Mladek Cc: Steven Rostedt Cc: Sergey Senozhatsky Cc: linux-mm@kvack.org Signed-off-by: Alexander Potapenko --- lib/Kconfig.debug | 14 ++ lib/Makefile | 2 + lib/error_report_notify.c | 278 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 294 insertions(+) create mode 100644 lib/error_report_notify.c diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 4b8f9e018f0f..c3f4aae9f19e 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -209,6 +209,20 @@ config DEBUG_BUGVERBOSE of the BUG call as well as the EIP and oops trace. This aids debugging but costs about 70-100K of memory. +config ERROR_REPORT_NOTIFY + bool "Expose memory error reports to the userspace" + depends on TRACING + help + When enabled, captures error reports from debugging tools (such as + KFENCE or KASAN) using console tracing, and exposes reports in + /sys/kernel/error_report/: the file last_report contains the last + report (with maximum report length of PAGE_SIZE), and report_count, + the total report count. + + Userspace programs can call poll(POLLPRI) on those files to get + notified about the new reports without having to watch dmesg in a + loop. + endmenu # "printk and dmesg options" menu "Compile-time checks and compiler options" diff --git a/lib/Makefile b/lib/Makefile index afeff05fa8c5..96ed8bc0cc5b 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -240,6 +240,8 @@ obj-$(CONFIG_CPU_RMAP) += cpu_rmap.o obj-$(CONFIG_DQL) += dynamic_queue_limits.o +obj-$(CONFIG_ERROR_REPORT_NOTIFY) += error_report_notify.o + obj-$(CONFIG_GLOB) += glob.o obj-$(CONFIG_GLOB_SELFTEST) += globtest.o diff --git a/lib/error_report_notify.c b/lib/error_report_notify.c new file mode 100644 index 000000000000..b0633f36ce6d --- /dev/null +++ b/lib/error_report_notify.c @@ -0,0 +1,278 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Userspace notification interface for debugging tools. + * + * Provide two sysfs files: + * - /sys/kernel/error_report/last_report + * - /sys/kernel/error_report/report_count + * that contain the last debugging tool report (taken from dmesg, delimited by + * the error_report_start/error_report_end tracing events) and the total report + * count. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct kobject *error_report_kobj; + +/* sysfs files are capped at PAGE_SIZE. */ +#define BUF_SIZE PAGE_SIZE +/* Two buffers to store the finished report and the report being recorded. */ +static char report_buffer[2][BUF_SIZE]; +/* + * Total report count. Also serves as a latch for report_buffer: + * report_buffer[num_reports % 2] is the currently available report, + * report_buffer[(num_reports + 1) % 2] is the report being recorded. + */ +static atomic_t num_reports; + +/* + * PID of the task currently recording the report, as returned by + * get_encoded_pid(), or -1. Used as a writer lock for report_buffer. + * A regular spinlock couldn't be used here, as probe_console() can be called + * from any thread, and it needs to know whether that thread is holding the + * lock. + */ +static atomic_t current_pid = ATOMIC_INIT(-1); + +static size_t current_pos; +static bool truncated; +static const char TRUNC_MSG[] = "\n"; + +static struct delayed_work reporting_done; + +static void error_report_notify(struct work_struct *work) +{ + sysfs_notify(error_report_kobj, NULL, "last_report"); + sysfs_notify(error_report_kobj, NULL, "report_count"); +} +static DECLARE_DELAYED_WORK(reporting_done, error_report_notify); + +/* + * Return the current PID combined together with in_task(). This lets us + * distinguish between normal task context and IRQ context. + */ +static int get_encoded_pid(void) +{ + return (current->pid << 1) | (!!in_task()); +} + +/* + * Trace hook for the error_report_start event. In an unlikely case of another + * task already printing a report bail out, otherwise save the current pid + * together with in_task() return value. + * + * Because reporting code can be called from low-level routines (e.g. locking + * primitives or allocator guts), report recording is implemented using a + * seqlock lock-free algorithm. + */ +static void probe_report_start(void *ignore, const char *tool_name, + unsigned long id) +{ + /* + * Acquire the writer lock. Any racing probe_report_start will not + * record anything. Pairs with the release in probe_report_end(). + */ + if (atomic_cmpxchg_acquire(¤t_pid, -1, get_encoded_pid()) != -1) + return; + current_pos = 0; + truncated = false; +} + +/* + * Trace hook for the error_report_end event. If an event from the mismatching + * error_report_start is received, it is ignored. Otherwise, null-terminate the + * buffer, increase the report count (effectively releasing the report to + * last_report_show() and schedule a notification about a new report. + */ +static void probe_report_end(void *ignore, const char *tool_name, + unsigned long id) +{ + pid_t pid = atomic_read(¤t_pid); + int idx; + + if (pid != get_encoded_pid()) + return; + + idx = (atomic_read(&num_reports) + 1) % 2; + if (current_pos == BUF_SIZE) + report_buffer[idx][current_pos - 1] = 0; + else + report_buffer[idx][current_pos] = 0; + + /* Pairs with acquire in last_report_show(). */ + atomic_inc_return_release(&num_reports); + schedule_delayed_work(&reporting_done, 0); + /* + * Release the writer lock. Pairs with the acquire in + * probe_report_start(). + */ + atomic_set_release(¤t_pid, -1); +} + +/* + * Skip one or two leading pair of brackets containing the log timestamp and + * the task/CPU ID, plus the leading space, from the report line, e.g.: + * [ 0.698431][ T7] BUG: KFENCE: use-after-free ... + * becomes: + * BUG: KFENCE: use-after-free ... + * + * Report size is only 4K, and this boilerplate can easily account for half of + * that amount. + */ +static void skip_extra_info(const char **buf, size_t *len) +{ + int num_brackets = IS_ENABLED(CONFIG_PRINTK_TIME) + + IS_ENABLED(CONFIG_PRINTK_CALLER); + const char *found; + + if (!buf || !len) + return; + + while (num_brackets--) { + if (!*len || *buf[0] != '[') + return; + found = strnchr(*buf, *len, ']'); + if (!found) + return; + *len -= found - *buf + 1; + *buf = found + 1; + } + if (*len && *buf[0] == ' ') { + ++*buf; + --*len; + } +} + +/* + * Trace hook for the console event. If a line comes from a task/CPU that did + * not send the error_report_start event, that line is ignored. Otherwise, it + * is stored in the report_buffer[(num_reports + 1) % 2]. + * + * To save space, the leading timestamps and (when enabled) CPU/task info is + * stripped away. The buffer may contain newlines, so this procedure is + * repeated for every line. + */ +static void probe_console(void *ignore, const char *buf, size_t len) +{ + int pid = atomic_read(¤t_pid); + size_t to_copy, cur_len; + char *newline; + int idx; + + if (pid != get_encoded_pid() || truncated) + return; + + idx = (atomic_read(&num_reports) + 1) % 2; + while (len) { + newline = strnchr(buf, len, '\n'); + if (newline) + cur_len = newline - buf + 1; + else + cur_len = len; + /* Adjust len now, because skip_extra_info() may change cur_len. */ + len -= cur_len; + skip_extra_info(&buf, &cur_len); + to_copy = min(cur_len, BUF_SIZE - current_pos); + memcpy(report_buffer[idx] + current_pos, buf, to_copy); + current_pos += to_copy; + if (cur_len > to_copy) { + truncated = true; + memcpy(report_buffer[idx] + current_pos - sizeof(TRUNC_MSG), + TRUNC_MSG, sizeof(TRUNC_MSG)); + break; + } + buf += cur_len; + } +} + +static void register_tracepoints(void) +{ + register_trace_console(probe_console, NULL); + register_trace_error_report_start(probe_report_start, NULL); + register_trace_error_report_end(probe_report_end, NULL); +} + +/* + * read() handler for /sys/kernel/error_report/last_report. + * Because the number of reports can change under our feet, check it again + * after copying the report, and retry if the numbers mismatch. + */ +static ssize_t last_report_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + ssize_t ret; + int index; + + do { + /* Pairs with release in probe_report_end(). */ + index = atomic_read_acquire(&num_reports); + /* + * If index and old_index mismatch, we might be accessing + * report_buffer concurrently with a writer thread. In that + * case the read data will be discarded. + */ + ret = data_race(strscpy(buf, report_buffer[index % 2], BUF_SIZE)); + /* + * Prevent reordering between the memcpy above and the atomic + * read below. + * See the comments in include/linux/seqlock.h for more + * details. + */ + smp_rmb(); + } while (index != atomic_read(&num_reports)); + return ret; +} + +/* + * read() handler for /sys/kernel/error_report/report_count. + */ +static ssize_t report_count_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&num_reports)); +} + +static struct kobj_attribute last_report_attr = __ATTR_RO(last_report); +static struct kobj_attribute report_count_attr = __ATTR_RO(report_count); +static struct attribute *error_report_sysfs_attrs[] = { + &last_report_attr.attr, + &report_count_attr.attr, + NULL, +}; + +static const struct attribute_group error_report_sysfs_attr_group = { + .attrs = error_report_sysfs_attrs, +}; + +/* + * Set up report notification: register tracepoints and create + * /sys/kernel/error_report/. + */ +static void error_report_notify_setup(void) +{ + int err; + + register_tracepoints(); + error_report_kobj = kobject_create_and_add("error_report", kernel_kobj); + if (!error_report_kobj) + goto error; + err = sysfs_create_group(error_report_kobj, + &error_report_sysfs_attr_group); + if (err) + goto error; + return; + +error: + if (error_report_kobj) + kobject_del(error_report_kobj); +} +late_initcall(error_report_notify_setup); From patchwork Wed Jan 13 09:10:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 12016197 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=-16.6 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,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 DACFAC433DB for ; Wed, 13 Jan 2021 09:10:32 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 46DAF2339D for ; Wed, 13 Jan 2021 09:10:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 46DAF2339D Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 699A28D0027; Wed, 13 Jan 2021 04:10:31 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5F9998D0026; Wed, 13 Jan 2021 04:10:31 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4BC9C8D0027; Wed, 13 Jan 2021 04:10:31 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0206.hostedemail.com [216.40.44.206]) by kanga.kvack.org (Postfix) with ESMTP id 2D94A8D0026 for ; Wed, 13 Jan 2021 04:10:31 -0500 (EST) Received: from smtpin01.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id EC668909F for ; Wed, 13 Jan 2021 09:10:30 +0000 (UTC) X-FDA: 77700181020.01.town67_5a03d732751c Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin01.hostedemail.com (Postfix) with ESMTP id D02BE10052964 for ; Wed, 13 Jan 2021 09:10:30 +0000 (UTC) X-HE-Tag: town67_5a03d732751c X-Filterd-Recvd-Size: 4672 Received: from mail-qk1-f202.google.com (mail-qk1-f202.google.com [209.85.222.202]) by imf35.hostedemail.com (Postfix) with ESMTP for ; Wed, 13 Jan 2021 09:10:30 +0000 (UTC) Received: by mail-qk1-f202.google.com with SMTP id a17so814674qko.11 for ; Wed, 13 Jan 2021 01:10:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=XzfaCNHUB3u0Xi2wro/cbX3HxJgdcymLpFgEMQn1EeM=; b=dwxuuV8tsMJPP/ayurDHyMpV3smUFp5mqWSVEd7w+W8+sA+jQgrXXMwfZ7xfEFh2eo A6tZj/xtGGXIJRXZ+iBvBPbpKuTo2LjZKeGexr/e2n9whVJw68/i+Nu+Zes4A42KpRKn 3MQdAcsPDzxDCZqIuoLNsl7JBkkfCWSzXVS2cDusN9tHaBvM17P1UGwAfj+0gb5Ek/zD vT63f/K9IMtN4DAd90z2K7e5TcOFCz7ROkqmi6QDEM8Dg31x1qP+pgt13dFU1zdY0qJs EwHLMjwVetG7e3rGiTod1PDUlzkmvzY82cv0knoFcvbm30XBqxJMxggBTae0TU4hqwQq HdsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=XzfaCNHUB3u0Xi2wro/cbX3HxJgdcymLpFgEMQn1EeM=; b=EnIiWD45zfRvgF8zBtszN3ujMaukNkR1RK7ckhZpDK7wRL4WfK7jgZ4jnPI8IK7DCQ zx3vAbZYUjJhyyfCMVJpNkZojLLEVurJ5k+A/KIZOZMSo5M303nYC9l66peDI4LcsJI5 WSjgIaT0ADovuvny8cURCCItU7KSz+1mxgCu9V6Ejp1iKE+RJ0k9fRnHuVO0PgRobVcs hEtDxPBcZoBndEwa2b+cdzNhHfZ1fA03hxu/HLaqQUrrt7YhaZx2ruxZmsTCWGMCtmLX 8nIuyC97CJjdFQPN/0Ffbw3ru9XDVaLlXuYo0auiiNLcfiC2wsqLOqkBD7gdHl/60bEd E9ng== X-Gm-Message-State: AOAM532AsTo2UGTToWxVXJo8HUBdHNS2RU7TnpnXamSh4qTkULgmizny dlcDosDwMMuwoYZLg/6Pcaot0Ls/QUY= X-Google-Smtp-Source: ABdhPJwBxOMS+hTjKbZ/FB90VkEquM6cwcF/6oZm8lgnWlBZO8Z7CdRww53Z7HTX51b+VJuSqvjNn/w6Oxo= X-Received: from glider.muc.corp.google.com ([2a00:79e0:15:13:f693:9fff:fef4:9ff]) (user=glider job=sendgmr) by 2002:a0c:e383:: with SMTP id a3mr1390126qvl.45.1610529029679; Wed, 13 Jan 2021 01:10:29 -0800 (PST) Date: Wed, 13 Jan 2021 10:10:16 +0100 In-Reply-To: <20210113091017.1444780-1-glider@google.com> Message-Id: <20210113091017.1444780-4-glider@google.com> Mime-Version: 1.0 References: <20210113091017.1444780-1-glider@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH 3/4] kfence: use error_report_start and error_report_end tracepoints From: Alexander Potapenko To: akpm@linux-foundation.org Cc: Alexander Potapenko , Marco Elver , Andrey Konovalov , Dmitry Vyukov , Ingo Molnar , Petr Mladek , Steven Rostedt , Sergey Senozhatsky , linux-mm@kvack.org X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Make it possible to trace KFENCE error reporting (in particular, for compatibility with CONFIG_ERROR_REPORT_NOTIFY). Suggested-by: Marco Elver Cc: Andrew Morton Cc: Andrey Konovalov Cc: Dmitry Vyukov Cc: Ingo Molnar Cc: Marco Elver Cc: Petr Mladek Cc: Steven Rostedt Cc: Sergey Senozhatsky Cc: linux-mm@kvack.org Signed-off-by: Alexander Potapenko --- mm/kfence/report.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm/kfence/report.c b/mm/kfence/report.c index 4dedc2ff8f28..5c063b5b2227 100644 --- a/mm/kfence/report.c +++ b/mm/kfence/report.c @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -184,6 +185,7 @@ void kfence_report_error(unsigned long address, struct pt_regs *regs, lockdep_off(); pr_err("==================================================================\n"); + trace_error_report_start("kfence", address); /* Print report header. */ switch (type) { case KFENCE_ERROR_OOB: { @@ -232,6 +234,7 @@ void kfence_report_error(unsigned long address, struct pt_regs *regs, show_regs(regs); else dump_stack_print_info(KERN_ERR); + trace_error_report_end("kfence", address); pr_err("==================================================================\n"); lockdep_on(); From patchwork Wed Jan 13 09:10:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Potapenko X-Patchwork-Id: 12016199 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=-16.6 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,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 BDDF8C433DB for ; Wed, 13 Jan 2021 09:10:35 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 42E922339D for ; Wed, 13 Jan 2021 09:10:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 42E922339D Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AB78A8D0029; Wed, 13 Jan 2021 04:10:34 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A42E58D0028; Wed, 13 Jan 2021 04:10:34 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9528D8D0029; Wed, 13 Jan 2021 04:10:34 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0053.hostedemail.com [216.40.44.53]) by kanga.kvack.org (Postfix) with ESMTP id 7AFA48D0028 for ; Wed, 13 Jan 2021 04:10:34 -0500 (EST) Received: from smtpin04.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 2ADBC9093 for ; Wed, 13 Jan 2021 09:10:34 +0000 (UTC) X-FDA: 77700181188.04.box71_5a0394d2751c Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin04.hostedemail.com (Postfix) with ESMTP id 10BDE8013B9B for ; Wed, 13 Jan 2021 09:10:34 +0000 (UTC) X-HE-Tag: box71_5a0394d2751c X-Filterd-Recvd-Size: 6144 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf49.hostedemail.com (Postfix) with ESMTP for ; Wed, 13 Jan 2021 09:10:33 +0000 (UTC) Received: by mail-wm1-f73.google.com with SMTP id k67so540231wmk.5 for ; Wed, 13 Jan 2021 01:10:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=pMSZunVusBFa2srMdPuW53fXoOwDSFeZUvebF05YN08=; b=KqcVQuSt5veMLDKRUt6O84+8i5TOyBjE63s6WSmXl/J4YumLAlIwZ23eKhOyqxW/3q 8bqGrmMvW5Q/4pMCfO1e7fNu70s8WqaN8QxeiigW9anD4S2JDmgeMQJz07q6wmEyDkuH 65zGNvke67SIqiNP4r7PU++ykEnr2L4izxhrvCtCZ6yiUhfawZL27Z5JSQFViP9CxNVe vcmn//jjMjzrJ090ONStuEcBcjrL/xItq8Nz9Po/V90Qk+HBNn1351e79qFAH0MbNJuq egktWW1LhHZC0VhDQFi4VBOqBWrSvMY4gE74L2oodKtXXpLmYFq/NFn1RGssEOuZcL3g NUhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=pMSZunVusBFa2srMdPuW53fXoOwDSFeZUvebF05YN08=; b=Nf5VJ1UV1dW0Be+yg5gJcTaJw9ML3/9bqukv8jPqJ03vJwWYNJOpL4pOc8WRWN5Ona N3uprnXucM/OZGejNDyZl6DvAm027Sl6kmqnZ5vFRxEh6owSNF8ucXlYYFzjZH9qbhSv wevjaOaxfQMLlm+evFfHOZyEu571DULpzh65TDFeBTeCDZzBafu068N652VtjbyxDQgD L5A1pqCvNlLE2lCk06G8dbpR6vYLo2Te8c2OTrzviJCMv8ml0jGRItlZoNAYAbKUX6xe XPSXVecz5/UHMDL0J5gRctu6oFyWIABQbzm6Bhr7IFkHjdSl5oes0x8vgYIHsHXHg2tF 2dCQ== X-Gm-Message-State: AOAM531QwujUpDj6w9/gLH2YvOPX/Zj6AFQw1jrrxl2YRI52pL9Ip0KI 1mblC+tMkuUvnhW2P28CNzN1Zu3+Hqo= X-Google-Smtp-Source: ABdhPJyl97x324qrSmyL86FRY5AHU0rrfJxNTfZ/9wrifaxtWmqHQMY3hla8lUKjO9kJONB7SSj9OHLlJj4= X-Received: from glider.muc.corp.google.com ([2a00:79e0:15:13:f693:9fff:fef4:9ff]) (user=glider job=sendgmr) by 2002:a7b:c157:: with SMTP id z23mr1186245wmi.35.1610529032166; Wed, 13 Jan 2021 01:10:32 -0800 (PST) Date: Wed, 13 Jan 2021 10:10:17 +0100 In-Reply-To: <20210113091017.1444780-1-glider@google.com> Message-Id: <20210113091017.1444780-5-glider@google.com> Mime-Version: 1.0 References: <20210113091017.1444780-1-glider@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH 4/4] kasan: use error_report_start and error_report_end tracepoints From: Alexander Potapenko To: akpm@linux-foundation.org Cc: Alexander Potapenko , Marco Elver , Andrey Konovalov , Dmitry Vyukov , Ingo Molnar , Petr Mladek , Steven Rostedt , Sergey Senozhatsky , linux-mm@kvack.org X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Make it possible to trace KASAN error reporting (in particular, for compatibility with CONFIG_ERROR_REPORT_NOTIFY). Suggested-by: Marco Elver Cc: Andrew Morton Cc: Andrey Konovalov Cc: Dmitry Vyukov Cc: Ingo Molnar Cc: Marco Elver Cc: Petr Mladek Cc: Steven Rostedt Cc: Sergey Senozhatsky Cc: linux-mm@kvack.org Signed-off-by: Alexander Potapenko --- mm/kasan/report.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mm/kasan/report.c b/mm/kasan/report.c index c0fb21797550..fd015dd5dd39 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -74,7 +75,7 @@ static void print_error_description(struct kasan_access_info *info) static DEFINE_SPINLOCK(report_lock); -static void start_report(unsigned long *flags) +static void start_report(unsigned long *flags, unsigned long addr) { /* * Make sure we don't end up in loop. @@ -82,10 +83,12 @@ static void start_report(unsigned long *flags) kasan_disable_current(); spin_lock_irqsave(&report_lock, *flags); pr_err("==================================================================\n"); + trace_error_report_start("kasan", addr); } -static void end_report(unsigned long *flags) +static void end_report(unsigned long *flags, unsigned long addr) { + trace_error_report_end("kasan", addr); pr_err("==================================================================\n"); add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE); spin_unlock_irqrestore(&report_lock, *flags); @@ -348,14 +351,14 @@ void kasan_report_invalid_free(void *object, unsigned long ip) kasan_update_kunit_status(current->kunit_test); #endif /* IS_ENABLED(CONFIG_KUNIT) */ - start_report(&flags); + start_report(&flags, (unsigned long)object); pr_err("BUG: KASAN: double-free or invalid-free in %pS\n", (void *)ip); print_tags(tag, object); pr_err("\n"); print_address_description(object, tag); pr_err("\n"); print_memory_metadata(object); - end_report(&flags); + end_report(&flags, (unsigned long)object); } static void __kasan_report(unsigned long addr, size_t size, bool is_write, @@ -385,7 +388,7 @@ static void __kasan_report(unsigned long addr, size_t size, bool is_write, info.is_write = is_write; info.ip = ip; - start_report(&flags); + start_report(&flags, addr); print_error_description(&info); if (addr_has_metadata(untagged_addr)) @@ -400,7 +403,7 @@ static void __kasan_report(unsigned long addr, size_t size, bool is_write, dump_stack(); } - end_report(&flags); + end_report(&flags, addr); } bool kasan_report(unsigned long addr, size_t size, bool is_write,