Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp2949172ybi; Sun, 28 Jul 2019 21:44:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqx130zr7RDDInrOIQoWiM0y6hxFRE7IqsRYh+QFG/dsoUlOlPVFuyEsFAHG6pEXRvmJLAG3 X-Received: by 2002:a17:90a:374a:: with SMTP id u68mr109530039pjb.4.1564375448970; Sun, 28 Jul 2019 21:44:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564375448; cv=none; d=google.com; s=arc-20160816; b=GM2M3IofOJ8W35phiDs1IQlSAofUS7rKUzzleMswby0yNjgqfp2D8rrFIp1zPbQwUy bU+b6/ScScRuSECWtY25+fNjXvHm+YSCUcLYYLIhFGRFcNTAQ669HWK029g4Pzi3Xf+K rIPhW+Kjf6B8cW3Vj1Zn02Nti8Q6jy0CQWd8BrWX0HSphisHfu0tPWl1XAVbRMk9kjOf zAnr/JuVl1xiCqEtFswb/0gMOZ2VjgKrUPCJHtn5FkZmkrTA35ybx8NlpmuJ6eIkXMUJ lwXsbIMIM8cRvEtH/MtymQHohd+jLZrU2K98ZwUlK1hy2Fos3ffeEJz4RncAK7Oiz+rm EyKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=NKfegpcxiZDr5OM4IgaGS2xj6dJkSO+Ma/4RQczYvTA=; b=XZtT+kDzPLyAQbbnQeYRGRrae0Bhb0XR32jM8qcdXdpxQPyjhSACKXc6hu2G/GD3+V WfdCCy3F/8xMupIDY9tIWzHGeQm5ti7F+NPtMEJnx3NqUWrVhhw/Oy5/lb/WUAeMPn9i ayoMLF2V7u6UwsBanSO0kBBYcVVOLQ2kKlUwbQBEMHBfQT19cjpUc569+LmzfuZSEneQ 1AwPmutNtzAMEQ0TuZZcb3M28UM6ifpoju3MT5uag8wIPvqzZ5+6EAQg7rqMyRAozlMm RA0Xyk7gPnO5WnEE96JvjXWj3u8i91klU05/CWK4BXqcXROW3SCxT7Rm1CrYnRJyeCKk 9aaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=wuvz1Bds; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g4si5471017pjt.70.2019.07.28.21.43.53; Sun, 28 Jul 2019 21:44:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=wuvz1Bds; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726581AbfG2E0M (ORCPT + 99 others); Mon, 29 Jul 2019 00:26:12 -0400 Received: from mail.kernel.org ([198.145.29.99]:33216 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726164AbfG2E0L (ORCPT ); Mon, 29 Jul 2019 00:26:11 -0400 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9F1C42075B for ; Mon, 29 Jul 2019 04:26:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564374370; bh=CzttnjlFh6UNzw5qv7d7Z1f2832TtQ+OkE9O6nLJJZ8=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=wuvz1Bdsr270oQaXKbsBoVoUwpOdZTeaJ5DN0Sl+cVeTA6afYvndWsZuu38GDBDYW jx6797SZ/GtrzOwzfcQbxLYJzm8Nlvic/Vu2ic4OyHzwxGmNrGeorIeU+n89IiCcX1 ogqPy4PB1E+EUEG0ie6213kbJehjVi6Q7zF1hI18= Received: by mail-wm1-f43.google.com with SMTP id v15so52520680wml.0 for ; Sun, 28 Jul 2019 21:26:10 -0700 (PDT) X-Gm-Message-State: APjAAAW8VKWVB7zexCDEcjizfFQlUVukToA90wzb6W6lI3d9OsNsk8Wo CQFMSsX13MVUvmmXQem5FowX3MH92Ll7NkpQQ5KNcg== X-Received: by 2002:a1c:9a53:: with SMTP id c80mr36652865wme.173.1564374369164; Sun, 28 Jul 2019 21:26:09 -0700 (PDT) MIME-Version: 1.0 References: <20190729010734.3352-1-devel@etsukata.com> In-Reply-To: <20190729010734.3352-1-devel@etsukata.com> From: Andy Lutomirski Date: Sun, 28 Jul 2019 21:25:58 -0700 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] tracing: Prevent RCU EQS breakage in preemptirq events To: Eiichi Tsukata Cc: Joel Fernandes , "Paul E. McKenney" , Thomas Gleixner , Peter Zijlstra , Steven Rostedt , Ingo Molnar , Frederic Weisbecker , LKML 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 On Sun, Jul 28, 2019 at 6:08 PM Eiichi Tsukata wrote: > > If context tracking is enabled, causing page fault in preemptirq > irq_enable or irq_disable events triggers the following RCU EQS warning. > Yuck. > diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c > index be01a4d627c9..860eaf9780e5 100644 > --- a/kernel/context_tracking.c > +++ b/kernel/context_tracking.c > @@ -148,6 +148,11 @@ void __context_tracking_exit(enum ctx_state state) > return; > > if (__this_cpu_read(context_tracking.state) == state) { > + /* > + * Change state before executing codes which can trigger > + * page fault leading unnecessary re-entrance. > + */ > + __this_cpu_write(context_tracking.state, CONTEXT_KERNEL); Seems reasonable. > if (__this_cpu_read(context_tracking.active)) { > /* > * We are going to run code that may use RCU. Inform > @@ -159,7 +164,6 @@ void __context_tracking_exit(enum ctx_state state) > trace_user_exit(0); > } > } > - __this_cpu_write(context_tracking.state, CONTEXT_KERNEL); > } > context_tracking_recursion_exit(); > } > diff --git a/kernel/trace/trace_preemptirq.c b/kernel/trace/trace_preemptirq.c > index 4d8e99fdbbbe..031b51cb94d0 100644 > --- a/kernel/trace/trace_preemptirq.c > +++ b/kernel/trace/trace_preemptirq.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > #include "trace.h" > > #define CREATE_TRACE_POINTS > @@ -49,9 +50,14 @@ NOKPROBE_SYMBOL(trace_hardirqs_off); > > __visible void trace_hardirqs_on_caller(unsigned long caller_addr) > { > + enum ctx_state prev_state; > + > if (this_cpu_read(tracing_irq_cpu)) { > - if (!in_nmi()) > + if (!in_nmi()) { > + prev_state = exception_enter(); > trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr); > + exception_exit(prev_state); > + } > tracer_hardirqs_on(CALLER_ADDR0, caller_addr); > this_cpu_write(tracing_irq_cpu, 0); > } This seems a bit distressing. Now we're going to do a whole bunch of context tracking transitions for each kernel entry. Would a better fix me to change trace_hardirqs_on_caller to skip the trace event if the previous state was already IRQs on and, more importantly, to skip tracing IRQs off if IRQs were already off? The x86 code is very careful to avoid ever having IRQs on and CONTEXT_USER at the same time. --Andy