From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935062AbdKPQPX (ORCPT ); Thu, 16 Nov 2017 11:15:23 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:49520 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751060AbdKPQPR (ORCPT ); Thu, 16 Nov 2017 11:15:17 -0500 X-Google-Smtp-Source: AGs4zMYmwH5Xv7Xq+628L8DuGx/az+BubEnZbHVOpLZgk0z0XNeMEeW/Io88re77WsakGR250NTj+Q== From: Nicholas Piggin Cc: Nicholas Piggin , Steven Rostedt , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH] tracing/irqtrace: only call trace_hardirqs_on/off when state changes Date: Fri, 17 Nov 2017 02:15:06 +1000 Message-Id: <20171116161506.19691-1-npiggin@gmail.com> X-Mailer: git-send-email 2.15.0 To: unlisted-recipients:; (no To-header on input) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In local_irq_save and local_irq_restore, only call irq tracing when the flag state acutally changes. It is not unexpected for the state to go disable->disable. This allows the irq tracing code to better track superfluous enables and disables, and in future could issue warnings. For the most part they are harmless, but they can indicate that the caller has lost track of its irq state. Cc: Steven Rostedt Cc: Ingo Molnar Cc: linux-kernel@vger.kernel.org Signed-off-by: Nicholas Piggin --- I wonder what you think of this patch? After a small fix to init/main.c and some powerpc fixes, I was able to use this patch and a change to warn in the lockdep code in case of redundant ops, to verify there were no local_irq_enable() when enabled, or local_irq_disable() when disabled (which was implicated in a bug). Lots of code to verify so we can't do this immediately, but I think it's cleaner to enforce the rule? Thanks, Nick include/linux/irqflags.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h index 46cb57d5eb13..82287e1c6c52 100644 --- a/include/linux/irqflags.h +++ b/include/linux/irqflags.h @@ -110,7 +110,8 @@ do { \ #define local_irq_save(flags) \ do { \ raw_local_irq_save(flags); \ - trace_hardirqs_off(); \ + if (!raw_irqs_disabled_flags(flags)) \ + trace_hardirqs_off(); \ } while (0) @@ -118,9 +119,11 @@ do { \ do { \ if (raw_irqs_disabled_flags(flags)) { \ raw_local_irq_restore(flags); \ - trace_hardirqs_off(); \ + if (!irqs_disabled()) \ + trace_hardirqs_off(); \ } else { \ - trace_hardirqs_on(); \ + if (irqs_disabled()) \ + trace_hardirqs_on(); \ raw_local_irq_restore(flags); \ } \ } while (0) -- 2.15.0