Received: by 2002:a25:ca44:0:0:0:0:0 with SMTP id a65csp1033862ybg; Wed, 29 Jul 2020 04:12:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJynO7dFTb3b//ak2boLdNGsN6MPOt8ZISnIbs8YdTS/F00faAkZ5eKkMKxX2ZC88QTqWlC/ X-Received: by 2002:a17:906:998f:: with SMTP id af15mr1786304ejc.461.1596021158971; Wed, 29 Jul 2020 04:12:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596021158; cv=none; d=google.com; s=arc-20160816; b=MMuUH3qw2gJTKYVmdYCpWqLpwZA4JEodp89HLEFac1GwDhFlCeUcoA2hKdpL4VsByO 2nmCRSzyGpbMxG+ONMkaoQEEVeaCVx0sbIJLiqLA8vSIGSS7yDl248vCjYUgLmXNIwOl F4+RPXurBC0WmZEldIz03MKXmFhHmSQIChpTi5uTNbnJN4i3fyffQUFlUpbb3RsI/CoF cP0qJjRrbVNByjAI0bl8NBNrc4sD6nWm06i9VlzXncRrTA0Yfo7leaZsCJm8pvVCwoI9 Ye7iqkGD11FTykZdL7JjD2/nc7KSdzQVf+AI6AAH7OnGb3aSdT8ap0mtYmtBzXxu4J8q n+Rg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:mime-version :message-id:date:dkim-signature; bh=bGSTmhcT1A+YDeTIlpgIQTYHsX+reXp1jHDYNBfMLqs=; b=v8ysjtzL089orYE/Z9PP84qRORa0tNbt3U36Cptdad9WeFxJK8vBkKRH3HE/P9MqYQ ANahdXAMPrpIarv2y9kB3NvQgHjmvdZ2lKlqghyQixdxhlZHjrQUeXsUV5LyUsxbnFjI yWCQ+2N0/CejlZD4Z3bL0b7iL9LR3MCimSeowRWkfUWqCe3gpyk3xSui0PHqUlfMrisz wLLh7duBClStd7DsfFMMXZT+BQuQKdCAqSYbh7mb1xSHv5RMFdVG3i0i9QR8CosLMjSU zX1UfIXXEXHnj3ox6v0jARIuF2EDHi1EN8D3VtegcX3jA0ju59JJI1SbB71b4z1Srp4E KmeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=wEfYgmft; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bz27si900248ejc.415.2020.07.29.04.12.16; Wed, 29 Jul 2020 04:12:38 -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=@google.com header.s=20161025 header.b=wEfYgmft; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726746AbgG2LJt (ORCPT + 99 others); Wed, 29 Jul 2020 07:09:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57186 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726353AbgG2LJt (ORCPT ); Wed, 29 Jul 2020 07:09:49 -0400 Received: from mail-wm1-x349.google.com (mail-wm1-x349.google.com [IPv6:2a00:1450:4864:20::349]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C18AC061794 for ; Wed, 29 Jul 2020 04:09:49 -0700 (PDT) Received: by mail-wm1-x349.google.com with SMTP id u14so507112wml.0 for ; Wed, 29 Jul 2020 04:09:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=bGSTmhcT1A+YDeTIlpgIQTYHsX+reXp1jHDYNBfMLqs=; b=wEfYgmftUlVQDPJ5vKfutqdKnomE646n58JG26GTIAOWnnXv3fbHBOaRPbB/vAdY3r 9ux8oQwv0jVPNkRh6Ehv3+cWk+yfzlVqp91jzz06XYPJf0zAs0s+2r02nszPliWfpZeM mvHPheD4BooGbOomJP9LW94h42iWUmWJdyEIThP1xXCuYW1BN1XsGyW/tnXgsM7P6roL BxMZZcw86VnsjimriVxczfjmVLIeAoHHHa4YZ2LAuMPp/eB4la/krd5tJXN4WY3aqmCT F3pPewSlBqWvKjE/hmlyuHhXM7NrKFx1Gv7pQ8TRQsoqz9dmTZ5YuJ5icJd99niVaq4Q RWEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=bGSTmhcT1A+YDeTIlpgIQTYHsX+reXp1jHDYNBfMLqs=; b=fhHXGozpeZ8mlDv7FxrOy5n/dWW4Hyrxz8j6h1fWHMan/S4rKZQRE1uVeLLa08TnxF I16iN+bvtomGk2gj+NGdPoTFxcM9YtYB6z0CPyxzFTJ9KBvKWzDWcgIMO3Jto1d5iwKC LEw1RhPBOjcRvY7kAyvODtTniXJNSIQR6Vchm9eEPNbICSodNcPyQbXZuNL6+cL40+O0 hCqlS9YZUACM5zfMn8LM1HsVlbmDQRJwXYyOhOayWmafUjaS5/931p0OcW2dYwB+pwIW BcCtPqu6sLpN2OnXBet8shO6Nfk8JkRNBh6154yUXxY7E8uqKP34Vy39gAqbY2TwzlTL gNnA== X-Gm-Message-State: AOAM532rjufCm3e/gKdW1GNzoav9aNfwHZnPD6kK/ys0T3uzxNkP2Ttn 0d9zz0KfZAUFFIwp7v+5+oPWZVWQQA== X-Received: by 2002:a7b:c38e:: with SMTP id s14mr8164909wmj.124.1596020987677; Wed, 29 Jul 2020 04:09:47 -0700 (PDT) Date: Wed, 29 Jul 2020 13:09:15 +0200 Message-Id: <20200729110916.3920464-1-elver@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.28.0.rc0.142.g3c755180ce-goog Subject: [PATCH tip/locking/core v2 1/2] lockdep: Refactor IRQ trace events fields into struct From: Marco Elver To: elver@google.com, peterz@infradead.org, mingo@kernel.org Cc: tglx@linutronix.de, bp@alien8.de, paulmck@kernel.org, will@kernel.org, kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Refactor the IRQ trace events fields, used for printing information about the IRQ trace events, into a separate struct 'irqtrace_events'. This improves readability by separating the information only used in reporting, as well as enables (simplified) storing/restoring of irqtrace_events snapshots. No functional change intended. Signed-off-by: Marco Elver --- v2: * Introduce patch, as pre-requisite to "kcsan: Improve IRQ state trace reporting". --- include/linux/irqflags.h | 13 +++++++++ include/linux/sched.h | 11 ++------ kernel/fork.c | 16 ++++------- kernel/locking/lockdep.c | 58 +++++++++++++++++++++------------------- 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h index 5811ee8a5cd8..bd5c55755447 100644 --- a/include/linux/irqflags.h +++ b/include/linux/irqflags.h @@ -33,6 +33,19 @@ #ifdef CONFIG_TRACE_IRQFLAGS +/* Per-task IRQ trace events information. */ +struct irqtrace_events { + unsigned int irq_events; + unsigned long hardirq_enable_ip; + unsigned long hardirq_disable_ip; + unsigned int hardirq_enable_event; + unsigned int hardirq_disable_event; + unsigned long softirq_disable_ip; + unsigned long softirq_enable_ip; + unsigned int softirq_disable_event; + unsigned int softirq_enable_event; +}; + DECLARE_PER_CPU(int, hardirqs_enabled); DECLARE_PER_CPU(int, hardirq_context); diff --git a/include/linux/sched.h b/include/linux/sched.h index 8d1de021b315..52e0fdd6a555 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -980,17 +981,9 @@ struct task_struct { #endif #ifdef CONFIG_TRACE_IRQFLAGS - unsigned int irq_events; + struct irqtrace_events irqtrace; unsigned int hardirq_threaded; - unsigned long hardirq_enable_ip; - unsigned long hardirq_disable_ip; - unsigned int hardirq_enable_event; - unsigned int hardirq_disable_event; u64 hardirq_chain_key; - unsigned long softirq_disable_ip; - unsigned long softirq_enable_ip; - unsigned int softirq_disable_event; - unsigned int softirq_enable_event; int softirqs_enabled; int softirq_context; int irq_config; diff --git a/kernel/fork.c b/kernel/fork.c index 70d9d0a4de2a..56a640799680 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2035,17 +2035,11 @@ static __latent_entropy struct task_struct *copy_process( seqcount_init(&p->mems_allowed_seq); #endif #ifdef CONFIG_TRACE_IRQFLAGS - p->irq_events = 0; - p->hardirq_enable_ip = 0; - p->hardirq_enable_event = 0; - p->hardirq_disable_ip = _THIS_IP_; - p->hardirq_disable_event = 0; - p->softirqs_enabled = 1; - p->softirq_enable_ip = _THIS_IP_; - p->softirq_enable_event = 0; - p->softirq_disable_ip = 0; - p->softirq_disable_event = 0; - p->softirq_context = 0; + memset(&p->irqtrace, 0, sizeof(p->irqtrace)); + p->irqtrace.hardirq_disable_ip = _THIS_IP_; + p->irqtrace.softirq_enable_ip = _THIS_IP_; + p->softirqs_enabled = 1; + p->softirq_context = 0; #endif p->pagefault_disabled = 0; diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index c9ea05edce25..7b5800374c40 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -3484,19 +3484,21 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this, void print_irqtrace_events(struct task_struct *curr) { - printk("irq event stamp: %u\n", curr->irq_events); + const struct irqtrace_events *trace = &curr->irqtrace; + + printk("irq event stamp: %u\n", trace->irq_events); printk("hardirqs last enabled at (%u): [<%px>] %pS\n", - curr->hardirq_enable_event, (void *)curr->hardirq_enable_ip, - (void *)curr->hardirq_enable_ip); + trace->hardirq_enable_event, (void *)trace->hardirq_enable_ip, + (void *)trace->hardirq_enable_ip); printk("hardirqs last disabled at (%u): [<%px>] %pS\n", - curr->hardirq_disable_event, (void *)curr->hardirq_disable_ip, - (void *)curr->hardirq_disable_ip); + trace->hardirq_disable_event, (void *)trace->hardirq_disable_ip, + (void *)trace->hardirq_disable_ip); printk("softirqs last enabled at (%u): [<%px>] %pS\n", - curr->softirq_enable_event, (void *)curr->softirq_enable_ip, - (void *)curr->softirq_enable_ip); + trace->softirq_enable_event, (void *)trace->softirq_enable_ip, + (void *)trace->softirq_enable_ip); printk("softirqs last disabled at (%u): [<%px>] %pS\n", - curr->softirq_disable_event, (void *)curr->softirq_disable_ip, - (void *)curr->softirq_disable_ip); + trace->softirq_disable_event, (void *)trace->softirq_disable_ip, + (void *)trace->softirq_disable_ip); } static int HARDIRQ_verbose(struct lock_class *class) @@ -3699,7 +3701,7 @@ EXPORT_SYMBOL_GPL(lockdep_hardirqs_on_prepare); void noinstr lockdep_hardirqs_on(unsigned long ip) { - struct task_struct *curr = current; + struct irqtrace_events *trace = ¤t->irqtrace; if (unlikely(!debug_locks)) return; @@ -3752,8 +3754,8 @@ void noinstr lockdep_hardirqs_on(unsigned long ip) skip_checks: /* we'll do an OFF -> ON transition: */ this_cpu_write(hardirqs_enabled, 1); - curr->hardirq_enable_ip = ip; - curr->hardirq_enable_event = ++curr->irq_events; + trace->hardirq_enable_ip = ip; + trace->hardirq_enable_event = ++trace->irq_events; debug_atomic_inc(hardirqs_on_events); } EXPORT_SYMBOL_GPL(lockdep_hardirqs_on); @@ -3763,8 +3765,6 @@ EXPORT_SYMBOL_GPL(lockdep_hardirqs_on); */ void noinstr lockdep_hardirqs_off(unsigned long ip) { - struct task_struct *curr = current; - if (unlikely(!debug_locks)) return; @@ -3784,12 +3784,14 @@ void noinstr lockdep_hardirqs_off(unsigned long ip) return; if (lockdep_hardirqs_enabled()) { + struct irqtrace_events *trace = ¤t->irqtrace; + /* * We have done an ON -> OFF transition: */ this_cpu_write(hardirqs_enabled, 0); - curr->hardirq_disable_ip = ip; - curr->hardirq_disable_event = ++curr->irq_events; + trace->hardirq_disable_ip = ip; + trace->hardirq_disable_event = ++trace->irq_events; debug_atomic_inc(hardirqs_off_events); } else { debug_atomic_inc(redundant_hardirqs_off); @@ -3802,7 +3804,7 @@ EXPORT_SYMBOL_GPL(lockdep_hardirqs_off); */ void lockdep_softirqs_on(unsigned long ip) { - struct task_struct *curr = current; + struct irqtrace_events *trace = ¤t->irqtrace; if (unlikely(!debug_locks || current->lockdep_recursion)) return; @@ -3814,7 +3816,7 @@ void lockdep_softirqs_on(unsigned long ip) if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return; - if (curr->softirqs_enabled) { + if (current->softirqs_enabled) { debug_atomic_inc(redundant_softirqs_on); return; } @@ -3823,9 +3825,9 @@ void lockdep_softirqs_on(unsigned long ip) /* * We'll do an OFF -> ON transition: */ - curr->softirqs_enabled = 1; - curr->softirq_enable_ip = ip; - curr->softirq_enable_event = ++curr->irq_events; + current->softirqs_enabled = 1; + trace->softirq_enable_ip = ip; + trace->softirq_enable_event = ++trace->irq_events; debug_atomic_inc(softirqs_on_events); /* * We are going to turn softirqs on, so set the @@ -3833,7 +3835,7 @@ void lockdep_softirqs_on(unsigned long ip) * enabled too: */ if (lockdep_hardirqs_enabled()) - mark_held_locks(curr, LOCK_ENABLED_SOFTIRQ); + mark_held_locks(current, LOCK_ENABLED_SOFTIRQ); lockdep_recursion_finish(); } @@ -3842,8 +3844,6 @@ void lockdep_softirqs_on(unsigned long ip) */ void lockdep_softirqs_off(unsigned long ip) { - struct task_struct *curr = current; - if (unlikely(!debug_locks || current->lockdep_recursion)) return; @@ -3853,13 +3853,15 @@ void lockdep_softirqs_off(unsigned long ip) if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) return; - if (curr->softirqs_enabled) { + if (current->softirqs_enabled) { + struct irqtrace_events *trace = ¤t->irqtrace; + /* * We have done an ON -> OFF transition: */ - curr->softirqs_enabled = 0; - curr->softirq_disable_ip = ip; - curr->softirq_disable_event = ++curr->irq_events; + current->softirqs_enabled = 0; + trace->softirq_disable_ip = ip; + trace->softirq_disable_event = ++trace->irq_events; debug_atomic_inc(softirqs_off_events); /* * Whoops, we wanted softirqs off, so why aren't they? -- 2.28.0.rc0.142.g3c755180ce-goog