Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp5429983ybp; Mon, 14 Oct 2019 22:35:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqw84MRDg97OsNTg5HAaRAvK+pufxEbP+oj5YfjCUQ/oPgmYMK3GtN53q/M493OYgHzLyUL6 X-Received: by 2002:a17:906:76c9:: with SMTP id q9mr19746010ejn.53.1571117756450; Mon, 14 Oct 2019 22:35:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571117756; cv=none; d=google.com; s=arc-20160816; b=eigmRTvK63AqDQ3dPYvP+1lGEvp1ihJ7MigK2X5iqqBzI3+0mfaxELItHly7dVPT5U LVPq8sy3mQ/fU+I3FoGYsC9IF/4jKWoZO5gJuwb9GE+I8Y1nQH+LRH87aLIRl4gDCUAC i0yshlSpOaPjoxJld2Or6VPtbJP+uBJ1Sb9ZbiOLwYgl+h4e07dxIfY+6GEZJZP0Us6E ED2fUvAOONt9Q0Kr5xzknxyONmZt7ck9ich3yYrRgQKagaed/QyMD5rCqpGER7IBwqXl PO0ZswFyae2ZKVloLmLH+CtZMbBaSsKRzjVSOIq50P7q+GKwHdUcpDsps8tSDUzsNpAW pkJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject; bh=4A0XD1FENXCaG6bJG/h5MyqJCUrNE/QypuOBTv++4/8=; b=tXBpXe/B7VE2OcirIc+zvnYXrFeIWzAHjH2dxrT0QXvQjrtpT6ytxa/+YgjQ0Fl3/8 skqNsEbigdLggL+7IytKQlfvVLYtFSQQpaTv82fPmgyMstVCT0z2FYjY0cAvguj21T2i CguACOzi/f24Kop+SIa3P2gWlv/FCvSFEprHxYSL0wF1o6kIRZsJZki1JcFPrz6kiRKe CSLwic2gN0jMMzZCm7sG0ifHXLQxexfwaGNpU9ypp1G0lHF5DfReRphWoRXHe0k2Rb0S RsNYMd6Wn97rVxMyejlDY/dpUC1yNlAMOXlt7WSQMMP4C4dyrsiNXXzkarnA/95TcjbF zg7g== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ck18si12283863ejb.300.2019.10.14.22.35.33; Mon, 14 Oct 2019 22:35:56 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727626AbfJODBH (ORCPT + 99 others); Mon, 14 Oct 2019 23:01:07 -0400 Received: from out30-130.freemail.mail.aliyun.com ([115.124.30.130]:51626 "EHLO out30-130.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726833AbfJODBH (ORCPT ); Mon, 14 Oct 2019 23:01:07 -0400 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R111e4;CH=green;DM=||false|;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e01451;MF=laijs@linux.alibaba.com;NM=1;PH=DS;RN=17;SR=0;TI=SMTPD_---0Tf5nhS._1571108460; Received: from C02XQCBJJG5H.local(mailfrom:laijs@linux.alibaba.com fp:SMTPD_---0Tf5nhS._1571108460) by smtp.aliyun-inc.com(127.0.0.1); Tue, 15 Oct 2019 11:01:01 +0800 Subject: Re: [PATCH] rcu: make PREEMPT_RCU to be a decoration of TREE_RCU From: Lai Jiangshan To: paulmck@kernel.org, Lai Jiangshan Cc: Joel Fernandes , Josh Triplett , Steven Rostedt , Mathieu Desnoyers , Ingo Molnar , Luis Chamberlain , Kees Cook , David Sterba , Yafang Shao , Mike Rapoport , Petr Mladek , Sakari Ailus , rcu@vger.kernel.org, LKML , Linux FS Devel References: <20191013125959.3280-1-laijs@linux.alibaba.com> <20191014184832.GA125935@google.com> <20191015014650.GL2689@paulmck-ThinkPad-P72> <20191015020023.GO2689@paulmck-ThinkPad-P72> <6bc1c7ef-5389-3a88-9ffe-c8c56e22a11a@linux.alibaba.com> Message-ID: Date: Tue, 15 Oct 2019 11:01:00 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <6bc1c7ef-5389-3a88-9ffe-c8c56e22a11a@linux.alibaba.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2019/10/15 10:45 上午, Lai Jiangshan wrote: > > > On 2019/10/15 10:00 上午, Paul E. McKenney wrote: >> On Tue, Oct 15, 2019 at 09:50:21AM +0800, Lai Jiangshan wrote: >>> On Tue, Oct 15, 2019 at 9:46 AM Paul E. McKenney >>> wrote: >>>> >>>> On Mon, Oct 14, 2019 at 02:48:32PM -0400, Joel Fernandes wrote: >>>>> On Sun, Oct 13, 2019 at 12:59:57PM +0000, Lai Jiangshan wrote: >>>>>> Currently PREEMPT_RCU and TREE_RCU are "contrary" configs >>>>>> when they can't be both on. But PREEMPT_RCU is actually a kind >>>>>> of TREE_RCU in the implementation. It seams to be appropriate >>>>>> to make PREEMPT_RCU to be a decorative option of TREE_RCU. >>>>>> >>>>> >>>>> Looks like a nice simplification and so far I could not poke any >>>>> holes in the >>>>> code... >>>>> >>>>> I am in support of this patch for further review and testing. Thanks! >>>>> >>>>> Reviewed-by: Joel Fernandes (Google) >>>> >>>> Thank you both! >>>> >>>> Lai, what is this patch against?  It does not want to apply to the >>>> current >>>> -rcu "dev" branch. >>> >>> Oh, sorry >>> >>> I wrongly made the change base on upstream. >>> I will rebase later. >> >> Very good, looking forward to this updated version. >> >>                             Thanx, Paul > > > In my box, the patch can be applied to the -rcu "dev" well. Oh, I first applied it by "git cherry-pick" not "git am". It did have conflicts when using "git am". Updated patch was sent, sorry for the nosing. thanks Lai > And there is nothing strange after boot. > > Have I just made a mistake a again? In my box, the HEAD > of -rcu "dev" is 9725023b ("torture: Handle jitter for CPUs that cannot > be offlined") > > Thanks > Lai > >> >>> thanks >>> Lai >>> >>>> >>>>                                                          Thanx, Paul >>>> >>>>> thanks, >>>>> >>>>>   - Joel >>>>> >>>>> >>>>>> Signed-off-by: Lai Jiangshan >>>>>> Signed-off-by: Lai Jiangshan >>>>>> --- >>>>>>   include/linux/rcupdate.h   |  4 ++-- >>>>>>   include/trace/events/rcu.h |  4 ++-- >>>>>>   kernel/rcu/Kconfig         | 13 +++++++------ >>>>>>   kernel/rcu/Makefile        |  1 - >>>>>>   kernel/rcu/rcu.h           |  2 +- >>>>>>   kernel/rcu/update.c        |  2 +- >>>>>>   kernel/sysctl.c            |  2 +- >>>>>>   7 files changed, 14 insertions(+), 14 deletions(-) >>>>>> >>>>>> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h >>>>>> index 75a2eded7aa2..1eee9f6c27f9 100644 >>>>>> --- a/include/linux/rcupdate.h >>>>>> +++ b/include/linux/rcupdate.h >>>>>> @@ -167,7 +167,7 @@ do { \ >>>>>>    * TREE_RCU and rcu_barrier_() primitives in TINY_RCU. >>>>>>    */ >>>>>> >>>>>> -#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU) >>>>>> +#if defined(CONFIG_TREE_RCU) >>>>>>   #include >>>>>>   #elif defined(CONFIG_TINY_RCU) >>>>>>   #include >>>>>> @@ -583,7 +583,7 @@ do >>>>>> { >>>>>> \ >>>>>>    * read-side critical section that would block in a !PREEMPT >>>>>> kernel. >>>>>>    * But if you want the full story, read on! >>>>>>    * >>>>>> - * In non-preemptible RCU implementations (TREE_RCU and TINY_RCU), >>>>>> + * In non-preemptible RCU implementations (pure TREE_RCU and >>>>>> TINY_RCU), >>>>>>    * it is illegal to block while in an RCU read-side critical >>>>>> section. >>>>>>    * In preemptible RCU implementations (PREEMPT_RCU) in >>>>>> CONFIG_PREEMPTION >>>>>>    * kernel builds, RCU read-side critical sections may be preempted, >>>>>> diff --git a/include/trace/events/rcu.h b/include/trace/events/rcu.h >>>>>> index 694bd040cf51..1ce15c5be4c8 100644 >>>>>> --- a/include/trace/events/rcu.h >>>>>> +++ b/include/trace/events/rcu.h >>>>>> @@ -41,7 +41,7 @@ TRACE_EVENT(rcu_utilization, >>>>>>      TP_printk("%s", __entry->s) >>>>>>   ); >>>>>> >>>>>> -#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU) >>>>>> +#if defined(CONFIG_TREE_RCU) >>>>>> >>>>>>   /* >>>>>>    * Tracepoint for grace-period events.  Takes a string >>>>>> identifying the >>>>>> @@ -425,7 +425,7 @@ TRACE_EVENT_RCU(rcu_fqs, >>>>>>                __entry->cpu, __entry->qsevent) >>>>>>   ); >>>>>> >>>>>> -#endif /* #if defined(CONFIG_TREE_RCU) || >>>>>> defined(CONFIG_PREEMPT_RCU) */ >>>>>> +#endif /* #if defined(CONFIG_TREE_RCU) */ >>>>>> >>>>>>   /* >>>>>>    * Tracepoint for dyntick-idle entry/exit events.  These take a >>>>>> string >>>>>> diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig >>>>>> index 7644eda17d62..0303934e6ef0 100644 >>>>>> --- a/kernel/rcu/Kconfig >>>>>> +++ b/kernel/rcu/Kconfig >>>>>> @@ -7,7 +7,7 @@ menu "RCU Subsystem" >>>>>> >>>>>>   config TREE_RCU >>>>>>      bool >>>>>> -   default y if !PREEMPTION && SMP >>>>>> +   default y if SMP >>>>>>      help >>>>>>        This option selects the RCU implementation that is >>>>>>        designed for very large SMP system with hundreds or >>>>>> @@ -17,6 +17,7 @@ config TREE_RCU >>>>>>   config PREEMPT_RCU >>>>>>      bool >>>>>>      default y if PREEMPTION >>>>>> +   select TREE_RCU >>>>>>      help >>>>>>        This option selects the RCU implementation that is >>>>>>        designed for very large SMP systems with hundreds or >>>>>> @@ -78,7 +79,7 @@ config TASKS_RCU >>>>>>        user-mode execution as quiescent states. >>>>>> >>>>>>   config RCU_STALL_COMMON >>>>>> -   def_bool ( TREE_RCU || PREEMPT_RCU ) >>>>>> +   def_bool TREE_RCU >>>>>>      help >>>>>>        This option enables RCU CPU stall code that is common between >>>>>>        the TINY and TREE variants of RCU.  The purpose is to allow >>>>>> @@ -86,13 +87,13 @@ config RCU_STALL_COMMON >>>>>>        making these warnings mandatory for the tree variants. >>>>>> >>>>>>   config RCU_NEED_SEGCBLIST >>>>>> -   def_bool ( TREE_RCU || PREEMPT_RCU || TREE_SRCU ) >>>>>> +   def_bool ( TREE_RCU || TREE_SRCU ) >>>>>> >>>>>>   config RCU_FANOUT >>>>>>      int "Tree-based hierarchical RCU fanout value" >>>>>>      range 2 64 if 64BIT >>>>>>      range 2 32 if !64BIT >>>>>> -   depends on (TREE_RCU || PREEMPT_RCU) && RCU_EXPERT >>>>>> +   depends on TREE_RCU && RCU_EXPERT >>>>>>      default 64 if 64BIT >>>>>>      default 32 if !64BIT >>>>>>      help >>>>>> @@ -112,7 +113,7 @@ config RCU_FANOUT_LEAF >>>>>>      int "Tree-based hierarchical RCU leaf-level fanout value" >>>>>>      range 2 64 if 64BIT >>>>>>      range 2 32 if !64BIT >>>>>> -   depends on (TREE_RCU || PREEMPT_RCU) && RCU_EXPERT >>>>>> +   depends on TREE_RCU && RCU_EXPERT >>>>>>      default 16 >>>>>>      help >>>>>>        This option controls the leaf-level fanout of hierarchical >>>>>> @@ -187,7 +188,7 @@ config RCU_BOOST_DELAY >>>>>> >>>>>>   config RCU_NOCB_CPU >>>>>>      bool "Offload RCU callback processing from boot-selected CPUs" >>>>>> -   depends on TREE_RCU || PREEMPT_RCU >>>>>> +   depends on TREE_RCU >>>>>>      depends on RCU_EXPERT || NO_HZ_FULL >>>>>>      default n >>>>>>      help >>>>>> diff --git a/kernel/rcu/Makefile b/kernel/rcu/Makefile >>>>>> index 020e8b6a644b..82d5fba48b2f 100644 >>>>>> --- a/kernel/rcu/Makefile >>>>>> +++ b/kernel/rcu/Makefile >>>>>> @@ -9,6 +9,5 @@ obj-$(CONFIG_TINY_SRCU) += srcutiny.o >>>>>>   obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o >>>>>>   obj-$(CONFIG_RCU_PERF_TEST) += rcuperf.o >>>>>>   obj-$(CONFIG_TREE_RCU) += tree.o >>>>>> -obj-$(CONFIG_PREEMPT_RCU) += tree.o >>>>>>   obj-$(CONFIG_TINY_RCU) += tiny.o >>>>>>   obj-$(CONFIG_RCU_NEED_SEGCBLIST) += rcu_segcblist.o >>>>>> diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h >>>>>> index 8fd4f82c9b3d..4149ba76824f 100644 >>>>>> --- a/kernel/rcu/rcu.h >>>>>> +++ b/kernel/rcu/rcu.h >>>>>> @@ -452,7 +452,7 @@ enum rcutorture_type { >>>>>>      INVALID_RCU_FLAVOR >>>>>>   }; >>>>>> >>>>>> -#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU) >>>>>> +#if defined(CONFIG_TREE_RCU) >>>>>>   void rcutorture_get_gp_data(enum rcutorture_type test_type, int >>>>>> *flags, >>>>>>                          unsigned long *gp_seq); >>>>>>   void rcutorture_record_progress(unsigned long vernum); >>>>>> diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c >>>>>> index 1861103662db..34a7452b25fd 100644 >>>>>> --- a/kernel/rcu/update.c >>>>>> +++ b/kernel/rcu/update.c >>>>>> @@ -435,7 +435,7 @@ struct debug_obj_descr rcuhead_debug_descr = { >>>>>>   EXPORT_SYMBOL_GPL(rcuhead_debug_descr); >>>>>>   #endif /* #ifdef CONFIG_DEBUG_OBJECTS_RCU_HEAD */ >>>>>> >>>>>> -#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU) || >>>>>> defined(CONFIG_RCU_TRACE) >>>>>> +#if defined(CONFIG_TREE_RCU) || defined(CONFIG_RCU_TRACE) >>>>>>   void do_trace_rcu_torture_read(const char *rcutorturename, >>>>>> struct rcu_head *rhp, >>>>>>                             unsigned long secs, >>>>>>                             unsigned long c_old, unsigned long c) >>>>>> diff --git a/kernel/sysctl.c b/kernel/sysctl.c >>>>>> index 00fcea236eba..2ace158a4d72 100644 >>>>>> --- a/kernel/sysctl.c >>>>>> +++ b/kernel/sysctl.c >>>>>> @@ -1268,7 +1268,7 @@ static struct ctl_table kern_table[] = { >>>>>>              .proc_handler   = proc_do_static_key, >>>>>>      }, >>>>>>   #endif >>>>>> -#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU) >>>>>> +#if defined(CONFIG_TREE_RCU) >>>>>>      { >>>>>>              .procname       = "panic_on_rcu_stall", >>>>>>              .data           = &sysctl_panic_on_rcu_stall, >>>>>> -- >>>>>> 2.20.1 >>>>>>