Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp238144pxb; Fri, 15 Oct 2021 04:40:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx3EgUgMfs77wycDA3rE785ZO9ye2AiR/TWFNfzkd6K4eEvw22WhknE0XTj3pX+HVVsYUuS X-Received: by 2002:a62:7a8b:0:b0:44d:47e2:99bf with SMTP id v133-20020a627a8b000000b0044d47e299bfmr10786851pfc.64.1634298048355; Fri, 15 Oct 2021 04:40:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634298048; cv=none; d=google.com; s=arc-20160816; b=OwITHqlza83AgxN9SrHXXeMb78Swdt9Sy4mZC42FjXsG/Z4YWMS2Fq+dh0kJodinsl qSjBAoykTdTKcfpwFo2MAkkLA1zcuPvGMLV7UytmgvoOscpe36zYiGsCW7QIud0Y/93n p4mSUgF2Sdo/HmqwAoOmvef9r+zA/bZHJwOuigKE0HSrRCvt1JHx9Pu5H75ur9P8lAgP 8TmVU6tSXi57z3FfixBIiGM3oUtgNbln1AHW4FFM0O0501Ew5yoJTrRs/TBl6QT6bVTH F7O4sVE8YfbhVBhL4TainZqMqE9ZM3PGu38fSh5puor4C8sD31+kGZ0cVXOxfZMfDcSr f9fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=i4v7jbMnWdgnjyXvpWs/eNb62vpKVzfhU8PCUdgP9r0=; b=Mbnolcl/RLqZn23Cs+XmPCEtowQW7MmpYO0pdC0InHt9PbPzcEnnemtBsqNGrtJyOK SITvkjwncgpBi0Y4Inj+PO7E0I3Utqa/8JfHsjJHOk5ZUDQZIzaVOEr1u30Anl0BCLXi zGyyliMwzuuEMeWKOunapdynQTTYZl4N8wHD7kDtVFWrrvqmtms0fsmLto23jGRoGU+s MZDkrSWYhn1IHWmLCRaGe82ZQVm6eVVFW3lp2PphkmC8gzQH8o+V2l/yy7lE/jItvLgs wlSY9iptGJMXtEleOpHfqx3cKsRas1pIfFw+VfMjVUl44ALFFbHPod/uiYnunx3e2jl2 if3Q== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a13si6869344plm.85.2021.10.15.04.40.35; Fri, 15 Oct 2021 04:40:48 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233286AbhJODPW (ORCPT + 99 others); Thu, 14 Oct 2021 23:15:22 -0400 Received: from out30-44.freemail.mail.aliyun.com ([115.124.30.44]:34772 "EHLO out30-44.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229526AbhJODPV (ORCPT ); Thu, 14 Oct 2021 23:15:21 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R171e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e04407;MF=yun.wang@linux.alibaba.com;NM=1;PH=DS;RN=31;SR=0;TI=SMTPD_---0Us2T5JW_1634267588; Received: from testdeMacBook-Pro.local(mailfrom:yun.wang@linux.alibaba.com fp:SMTPD_---0Us2T5JW_1634267588) by smtp.aliyun-inc.com(127.0.0.1); Fri, 15 Oct 2021 11:13:09 +0800 Subject: Re: [PATCH v3 1/2] ftrace: disable preemption between ftrace_test_recursion_trylock/unlock() To: Petr Mladek Cc: Guo Ren , Steven Rostedt , Ingo Molnar , "James E.J. Bottomley" , Helge Deller , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Paul Walmsley , Palmer Dabbelt , Albert Ou , Thomas Gleixner , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , Josh Poimboeuf , Jiri Kosina , Miroslav Benes , Joe Lawrence , Colin Ian King , Masami Hiramatsu , "Peter Zijlstra (Intel)" , Nicholas Piggin , Jisheng Zhang , linux-csky@vger.kernel.org, linux-kernel@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, live-patching@vger.kernel.org References: <609b565a-ed6e-a1da-f025-166691b5d994@linux.alibaba.com> <7e4738b5-21d4-c4d0-3136-a096bbb5cd2c@linux.alibaba.com> From: =?UTF-8?B?546L6LSH?= Message-ID: <5e907ed3-806b-b0e5-518d-d2f3b265377f@linux.alibaba.com> Date: Fri, 15 Oct 2021 11:13:08 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2021/10/14 下午11:14, Petr Mladek wrote: [snip] >> - return trace_test_and_set_recursion(ip, parent_ip, TRACE_FTRACE_START, TRACE_FTRACE_MAX); >> + int bit; >> + >> + bit = trace_test_and_set_recursion(ip, parent_ip, TRACE_FTRACE_START, TRACE_FTRACE_MAX); >> + /* >> + * The zero bit indicate we are nested >> + * in another trylock(), which means the >> + * preemption already disabled. >> + */ >> + if (bit > 0) >> + preempt_disable_notrace(); > > Is this safe? The preemption is disabled only when > trace_test_and_set_recursion() was called by ftrace_test_recursion_trylock(). > > We must either always disable the preemtion when bit >= 0. > Or we have to disable the preemtion already in > trace_test_and_set_recursion(). Internal calling of trace_test_and_set_recursion() will disable preemption on succeed, it should be safe. We can also consider move the logical into trace_test_and_set_recursion() and trace_clear_recursion(), but I'm not very sure about that... ftrace internally already make sure preemption disabled, what uncovered is those users who call API trylock/unlock, isn't it? > > > Finally, the comment confused me a lot. The difference between nesting and > recursion is far from clear. And the code is tricky liky like hell :-) > I propose to add some comments, see below for a proposal. The comments do confusing, I'll make it something like: The zero bit indicate trace recursion happened, whatever the recursively call was made by ftrace handler or ftrace itself, the preemption already disabled. Will this one looks better to you? > >> + >> + return bit; >> } >> /** >> @@ -222,9 +233,13 @@ static __always_inline int ftrace_test_recursion_trylock(unsigned long ip, >> * @bit: The return of a successful ftrace_test_recursion_trylock() >> * >> * This is used at the end of a ftrace callback. >> + * >> + * Preemption will be enabled (if it was previously enabled). >> */ >> static __always_inline void ftrace_test_recursion_unlock(int bit) >> { >> + if (bit) > > This is not symetric with trylock(). It should be: > > if (bit > 0) > > Anyway, trace_clear_recursion() quiently ignores bit != 0 Yes, bit == 0 should not happen in here. > > >> + preempt_enable_notrace(); >> trace_clear_recursion(bit); >> } > > > Below is my proposed patch that tries to better explain the recursion > check: > > From 20d69f11e2683262fa0043b803999061cbac543f Mon Sep 17 00:00:00 2001 > From: Petr Mladek > Date: Thu, 14 Oct 2021 16:57:39 +0200 > Subject: [PATCH] trace: Better describe the recursion check return values > > The trace recursion check might be called recursively by different > layers of the tracing code. It is safe recursion and the check > is even optimized for this case. > > The problematic recursion is when the traced function is called > by the tracing code. This is properly detected. > > Try to explain this difference a better way. > > Signed-off-by: Petr Mladek > --- > include/linux/trace_recursion.h | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/include/linux/trace_recursion.h b/include/linux/trace_recursion.h > index a9f9c5714e65..b5efb804efdf 100644 > --- a/include/linux/trace_recursion.h > +++ b/include/linux/trace_recursion.h > @@ -159,13 +159,27 @@ extern void ftrace_record_recursion(unsigned long ip, unsigned long parent_ip); > # define do_ftrace_record_recursion(ip, pip) do { } while (0) > #endif > > +/* > + * trace_test_and_set_recursion() is called on several layers > + * of the ftrace code when handling the same ftrace entry. > + * These calls might be nested/recursive. > + * > + * It uses TRACE_LIST_*BITs to distinguish between this > + * internal recursion and recursion caused by calling > + * the traced function by the ftrace code. > + * > + * Returns: > 0 when no recursion > + * 0 when called recursively internally (safe) The 0 can also happened when ftrace handler recursively called trylock() under the same context, or not? Regards, Michael Wang > + * -1 when the traced function was called recursively from > + * the ftrace handler (unsafe) > + */ > static __always_inline int trace_test_and_set_recursion(unsigned long ip, unsigned long pip, > int start, int max) > { > unsigned int val = READ_ONCE(current->trace_recursion); > int bit; > > - /* A previous recursion check was made */ > + /* Called recursively internally by different ftrace code layers? */ > if ((val & TRACE_CONTEXT_MASK) > max) > return 0; > >