Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp312310ybm; Tue, 26 May 2020 17:55:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwoW20ajwrU52nvXS4y28PFPPOOM47/gigP8A2SUAW5FKm0uhCYCvrMEnFSL/1LEqJ3ILFZ X-Received: by 2002:a17:907:1005:: with SMTP id ox5mr3371516ejb.480.1590540902383; Tue, 26 May 2020 17:55:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590540902; cv=none; d=google.com; s=arc-20160816; b=xK5LOSO3UDjm9TRHEQ5lzxzKzqsIrzSCEEOMfH0H6HWJ9o958TmfTO4wZNpsAbYFoz BVOIi0lrRwq+M9Ab+XIk3MytREmkQCHL1phl5uIfRORbrwZe03SUyyNd4kX8xaNMuza0 drQNkScx4WPI4yRii049GAV2EuNGP1pIv6eOcWm0zZpQm8VAfC6yB8cASDg2oy/shgIf /nxwJU035d44pz/stwGE4jeL5l9dPGvG0B9SYcve/DavTzXzXw0kBNFv8CDDhZG09//1 m5TXEl2TizJD9CSWkRx01g6ntCso6T7JgC4DVU7gV/sjFazDRPk4FmhLnxopyqC9QB/f FGiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=oNiXx/Rst2bunWP0qymph4x84pXDap/krcw7ycWwhWk=; b=zcV2iTy8WlgrGWMbr8L7mhDTAxEf7SOoX1KxWnrFGvMAvtGqdR52YMplvQ0ZFgZ6xe fW+3miteNgFCWtxjoEpOka/846ZL9WgTV3BpT/vChLCn+tlLd0QPgeg6z6+i52mg2FJ5 LWXugQ1wc7qX+dE06sfeogRkZuamev8g+A6h6w5BGjEnRiwvX/gc/K7yJLW9V6xK6m4+ WsZlbdR0G1KY0+mC6ExiHwiJ0RT3JOhB94/hBDurQ5TvwzuK7+65pYIlV+Gp+URdMq5a v5zrZG7Ys5Hy9yw++9Ew5AamjwjHhkIcx2A/fRsbeR2xh3xg7+4YoCOm9Q/gIwSB0g2C Jgrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b="EBk/RQJG"; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h15si819371ejd.718.2020.05.26.17.54.39; Tue, 26 May 2020 17:55:02 -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=@joelfernandes.org header.s=google header.b="EBk/RQJG"; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2403918AbgEZVUT (ORCPT + 99 others); Tue, 26 May 2020 17:20:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2403878AbgEZVUT (ORCPT ); Tue, 26 May 2020 17:20:19 -0400 Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4CA0FC061A0F for ; Tue, 26 May 2020 14:20:19 -0700 (PDT) Received: by mail-qv1-xf44.google.com with SMTP id ee19so10190129qvb.11 for ; Tue, 26 May 2020 14:20:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=oNiXx/Rst2bunWP0qymph4x84pXDap/krcw7ycWwhWk=; b=EBk/RQJGWYC8b63gyMqJY+MkwQZiCc4OjA+jttHYX+gh4UxXZxCiaztlTt9i3g56bE EQPu6KcePO3fTR8qLPWENocXTFuNwGkuSCgMqNxlslGifFhUafi5DGek6gH7iYPro2AR 3vRUqVZ0fHFLsZaxmS7Xh6WpRPagu+Dmv1JOU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=oNiXx/Rst2bunWP0qymph4x84pXDap/krcw7ycWwhWk=; b=hZJ4A7QdDtXELWjV1wXN7WmU1bH0CrbeoWuEGjkcgMxtDvBXpfw5Ka+/mbU8nYiFM5 jZbhSiwWzi3D9p6EC4OtjgZFgUV/efWdZkl5Ga2mO6DyJ0UfhiZXNl6ba3tzgOwBG27N QGqhLEzrkg3RqruTU5C4C/cb/G2bnrB5YuMpAeYuoRNNOTcWWFgRiPfjx7WPbQeKrWeA 9CKCbZ1rtp2BrZe1fbsxLncEvjS6HuVwPPh8cBP40sMlZwtx99E2jwR5sGNT4Ee1q2Da H95hV6oM+JJiAkVhv4/fXod8iN11XDcF0Jkra5NWyjf9e7jS5t4xwgsgMQOq5PvIOPOr Omtg== X-Gm-Message-State: AOAM5307F/C/8gzrCEyYcZZXGYznml1GASWiA17XlD1RXTdM0vNXWdIi qRBK/zQ+3K4VY+AWZXFIlq231g== X-Received: by 2002:a05:6214:14a2:: with SMTP id bo2mr22149222qvb.106.1590528018306; Tue, 26 May 2020 14:20:18 -0700 (PDT) Received: from localhost ([2620:15c:6:12:9c46:e0da:efbf:69cc]) by smtp.gmail.com with ESMTPSA id v4sm671977qkv.43.2020.05.26.14.20.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2020 14:20:17 -0700 (PDT) Date: Tue, 26 May 2020 17:20:17 -0400 From: Joel Fernandes To: Frederic Weisbecker Cc: "Paul E . McKenney" , LKML , Steven Rostedt , Mathieu Desnoyers , Lai Jiangshan , Josh Triplett Subject: Re: [PATCH 08/10] rcu: Allow to deactivate nocb on a CPU Message-ID: <20200526212017.GE76276@google.com> References: <20200513164714.22557-1-frederic@kernel.org> <20200513164714.22557-9-frederic@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200513164714.22557-9-frederic@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 13, 2020 at 06:47:12PM +0200, Frederic Weisbecker wrote: > Allow a CPU's rdp to quit the callback offlined mode. nit: s/offlined/offloaded/ ? > The switch happens on the target with IRQs disabled and rdp->nocb_lock > held to avoid races between local callbacks handling and kthread > offloaded callbacks handling. > nocb_cb kthread is first parked to avoid any future race with > concurrent rcu_do_batch() executions. Then the cblist is set to offloaded > so that the nocb_gp kthread ignores this rdp. nit: you mean cblist is set to non-offloaded mode right? Also, could you clarify better the rcu_barrier bits in the changelog. I know there's some issue if the cblist has both offloaded and non-offloaded callbacks, but it would be good to clarify this here better IMHO. [...] > diff --git a/kernel/rcu/rcu_segcblist.c b/kernel/rcu/rcu_segcblist.c > index d8ea2bef5574..4bed48da7702 100644 > --- a/kernel/rcu/rcu_segcblist.c > +++ b/kernel/rcu/rcu_segcblist.c > @@ -171,9 +171,9 @@ void rcu_segcblist_disable(struct rcu_segcblist *rsclp) > * Mark the specified rcu_segcblist structure as offloaded. This > * structure must be empty. > */ > -void rcu_segcblist_offload(struct rcu_segcblist *rsclp) > +void rcu_segcblist_offload(struct rcu_segcblist *rsclp, bool offload) > { > - rsclp->offloaded = 1; > + rsclp->offloaded = offload; > } > #endif > > diff --git a/kernel/rcu/rcu_segcblist.h b/kernel/rcu/rcu_segcblist.h > index 4c1503a82492..8f7c6c34cb1b 100644 > --- a/kernel/rcu/rcu_segcblist.h > +++ b/kernel/rcu/rcu_segcblist.h > @@ -83,7 +83,7 @@ void rcu_segcblist_inc_len(struct rcu_segcblist *rsclp); > void rcu_segcblist_init(struct rcu_segcblist *rsclp); > void rcu_segcblist_disable(struct rcu_segcblist *rsclp); > #ifdef CONFIG_RCU_NOCB_CPU > -void rcu_segcblist_offload(struct rcu_segcblist *rsclp); > +void rcu_segcblist_offload(struct rcu_segcblist *rsclp, bool offload); > #endif > bool rcu_segcblist_ready_cbs(struct rcu_segcblist *rsclp); > bool rcu_segcblist_pend_cbs(struct rcu_segcblist *rsclp); > diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h > index f19e81e0c691..c74a4df8d5f2 100644 > --- a/kernel/rcu/tree_plugin.h > +++ b/kernel/rcu/tree_plugin.h > @@ -1943,6 +1943,10 @@ static void nocb_gp_wait(struct rcu_data *my_rdp) > for (rdp = my_rdp; rdp; rdp = rdp->nocb_next_cb_rdp) { > trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check")); > raw_spin_lock_irqsave(&rdp->nocb_lock, flags); > + if (!rcu_segcblist_is_offloaded(&rdp->cblist)) { > + raw_spin_unlock_irqrestore(&rdp->nocb_lock, flags); > + continue; > + } > bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass); > if (bypass_ncbs && > (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + 1) || > @@ -2176,6 +2180,50 @@ static void do_nocb_deferred_wakeup(struct rcu_data *rdp) > do_nocb_deferred_wakeup_common(rdp); > } > > +static void __rcu_nocb_rdp_deoffload(struct rcu_data *rdp) > +{ > + unsigned long flags; > + struct rcu_node *rnp = rdp->mynode; > + > + printk("De-offloading %d\n", rdp->cpu); nit: s/printk/pr_debug/ ? thanks, - Joel > + kthread_park(rdp->nocb_cb_kthread); > + > + raw_spin_lock_irqsave(&rdp->nocb_lock, flags); > + rcu_nocb_flush_bypass(rdp, NULL, jiffies); > + raw_spin_lock_rcu_node(rnp); > + rcu_segcblist_offload(&rdp->cblist, false); > + raw_spin_unlock_rcu_node(rnp); > + raw_spin_unlock_irqrestore(&rdp->nocb_lock, flags); > +} > + > +static long rcu_nocb_rdp_deoffload(void *arg) > +{ > + struct rcu_data *rdp = arg; > + > + WARN_ON_ONCE(rdp->cpu != raw_smp_processor_id()); > + __rcu_nocb_rdp_deoffload(rdp); > + > + return 0; > +} > + > +void rcu_nocb_cpu_deoffload(int cpu) > +{ > + struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); > + > + mutex_lock(&rcu_state.barrier_mutex); > + cpus_read_lock(); > + if (rcu_segcblist_is_offloaded(&rdp->cblist)) { > + if (cpu_online(cpu)) { > + work_on_cpu(cpu, rcu_nocb_rdp_deoffload, rdp); > + } else { > + __rcu_nocb_rdp_deoffload(rdp); > + } > + cpumask_clear_cpu(cpu, rcu_nocb_mask); > + } > + cpus_read_unlock(); > + mutex_unlock(&rcu_state.barrier_mutex); > +} > + > void __init rcu_init_nohz(void) > { > int cpu; > @@ -2218,7 +2266,7 @@ void __init rcu_init_nohz(void) > rdp = per_cpu_ptr(&rcu_data, cpu); > if (rcu_segcblist_empty(&rdp->cblist)) > rcu_segcblist_init(&rdp->cblist); > - rcu_segcblist_offload(&rdp->cblist); > + rcu_segcblist_offload(&rdp->cblist, true); > } > rcu_organize_nocb_kthreads(); > } > -- > 2.25.0 >