From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EDD7385D78 for ; Thu, 21 May 2026 19:47:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.118.77.12 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779392830; cv=none; b=igmkrPOq1EzwKEY11derf50Bt1xCcfo5BfW1ohjWItEfbHI5xqnWM6q462u9rVKThBJ0Tofw8YUjWQZiuOR3FBiLPXrVexnRf86DleHdqMR/mgp/f9IDuxFBFxgVx/z+/6ZzIfU7Wzu8Srp37wJE2yB05qYMVVE9GLpP3uLzwUE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779392830; c=relaxed/simple; bh=rDv8iGnEGajgmhqclsmDdh8Y2KpIwbj50zE62p076OM=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:From:In-Reply-To: Content-Type:References; b=nFIpovIBliOF3N//OJpvXt2e7KwlvtmEvnovQJdFePyV8TMdIkNZ2En4fUuOxw4oZyuhFjyl+aBmFeqIT8Qk1kxsDUfwGUEW2jWkHTjqPrzrnzLlzjBg+qMlr1n4sWuy23hnrL6OWc+tsdxC+UQ2XX36R1QTWiYEy4ZBAFdgZFU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com; spf=pass smtp.mailfrom=samsung.com; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b=eKlI/3Kw; arc=none smtp.client-ip=210.118.77.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=samsung.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=samsung.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="eKlI/3Kw" Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20260521194705euoutp02f0658fe82d84b1e999a2679c8b7f4f1f~xrFjmJgF80227702277euoutp02k for ; Thu, 21 May 2026 19:47:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20260521194705euoutp02f0658fe82d84b1e999a2679c8b7f4f1f~xrFjmJgF80227702277euoutp02k DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1779392825; bh=VnxkhwhOd8fuMGpnrg7NsbFThTo0y0JhSx9ZSUlDTiU=; h=Date:Subject:To:Cc:From:In-Reply-To:References:From; b=eKlI/3Kwvp6KPksDvrMEFPXmW1lmvDlw3kp6HWn6grZ8XcUkHNGX6xWySvjMwRtfn R10g8FnouQt6euB3A517gqbSBMsMmlJED5vHyTNxVKiywC6q5zJOT62fu3iCXRrp+y xFLv2EVRyNJSCuDyc2ELoHPxMHBfLbhKxiXl5nVo= Received: from eusmtip1.samsung.com (unknown [203.254.199.221]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20260521194704eucas1p19ffbed79a4ae514fb1136218c567add6~xrFi-JGNH0565405654eucas1p1W; Thu, 21 May 2026 19:47:04 +0000 (GMT) Received: from [106.210.134.192] (unknown [106.210.134.192]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20260521194703eusmtip1291c1ef8575370e0258fcf9c69e60d9e~xrFiDPieE0465604656eusmtip1K; Thu, 21 May 2026 19:47:03 +0000 (GMT) Message-ID: <38fe0a1d-1a48-435a-910a-c278024d9ac9@samsung.com> Date: Thu, 21 May 2026 21:47:03 +0200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Betterbird (Windows) Subject: Re: [PATCH 1/5] sched/fair: Drop redundant RCU read lock in NOHZ kick path To: Andrea Righi , Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot Cc: Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , K Prateek Nayak , Christian Loehle , Phil Auld , Koba Ko , Felix Abecassis , Balbir Singh , Joel Fernandes , Shrikanth Hegde , linux-kernel@vger.kernel.org Content-Language: en-US From: Marek Szyprowski In-Reply-To: <20260509180955.1840064-2-arighi@nvidia.com> Content-Transfer-Encoding: 8bit X-CMS-MailID: 20260521194704eucas1p19ffbed79a4ae514fb1136218c567add6 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20260521194704eucas1p19ffbed79a4ae514fb1136218c567add6 X-EPHeader: CA X-CMS-RootMailID: 20260521194704eucas1p19ffbed79a4ae514fb1136218c567add6 References: <20260509180955.1840064-1-arighi@nvidia.com> <20260509180955.1840064-2-arighi@nvidia.com> On 09.05.2026 20:07, Andrea Righi wrote: > nohz_balancer_kick() is reached from sched_balance_trigger(), which is > called from sched_tick(). sched_tick() runs with IRQs disabled, so the > additional rcu_read_lock/unlock() used around sched_domain accesses in > this path is redundant. Rely on the existing IRQ-disabled context (and > the rcu_dereference_all() checking) instead. > > The same applies to set_cpu_sd_state_idle(), called from the idle entry > path with IRQs disabled, and to set_cpu_sd_state_busy(), reachable via > nohz_balance_exit_idle() from two contexts: nohz_balancer_kick() (IRQs > disabled, as above) and sched_cpu_deactivate() (the CPUHP_AP_ACTIVE > teardown, which runs under cpus_write_lock(), so it cannot race with > sched-domain rebuilds). In both cases the rcu_dereference_all() > validation is sufficient. > > No functional change intended. > > Cc: Vincent Guittot > Cc: Dietmar Eggemann > Suggested-by: K Prateek Nayak > Reviewed-by: K Prateek Nayak > Signed-off-by: Andrea Righi This patch landed in today's linux-next as commit c9d93a73ce87 ("sched/fair: Drop redundant RCU read lock in NOHZ kick path"). In my tests I found that it introduced the following warning during the CPU hot-plug tests: root@target:~# for i in /sys/devices/system/cpu/cpu[1-9]; do echo 0 >$i/online; done ============================= WARNING: suspicious RCU usage 7.1.0-rc2+ #12775 Not tainted ----------------------------- kernel/sched/fair.c:12793 suspicious rcu_dereference_check() usage! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 2 locks held by cpuhp/1/20:  #0: ffffffff81a16220 (cpu_hotplug_lock){++++}-{0:0}, at: cpuhp_thread_fun+0x42/0x1ae  #1: ffffffff81a16270 (cpuhp_state-down){+.+.}-{0:0}, at: cpuhp_thread_fun+0x72/0x1ae stack backtrace: CPU: 1 UID: 0 PID: 20 Comm: cpuhp/1 Not tainted 7.1.0-rc2+ #12775 PREEMPTLAZY Hardware name: StarFive VisionFive 2 v1.2A (DT) Call Trace: [] dump_backtrace+0x1c/0x24 [] show_stack+0x28/0x34 [] dump_stack_lvl+0x5e/0x86 [] dump_stack+0x14/0x1c [] lockdep_rcu_suspicious+0x14c/0x1b8 [] nohz_balance_exit_idle+0xf4/0xf6 [] sched_cpu_deactivate+0x6c/0x1c8 [] cpuhp_invoke_callback+0xf8/0x1ce [] cpuhp_thread_fun+0x150/0x1ae [] smpboot_thread_fn+0x138/0x2a4 [] kthread+0xea/0x10c [] ret_from_fork_kernel+0x22/0x386 [] ret_from_fork_kernel_asm+0x16/0x18 CPU1: off CPU2: off CPU3: off This issue is observed on most of my ARM 32bit, ARM 64bit and RiscV64 based boards. > --- > kernel/sched/fair.c | 38 +++++++++++--------------------------- > 1 file changed, 11 insertions(+), 27 deletions(-) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 3ebec186f9823..6b059ee80b631 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -12785,8 +12785,6 @@ static void nohz_balancer_kick(struct rq *rq) > goto out; > } > > - rcu_read_lock(); > - > sd = rcu_dereference_all(rq->sd); > if (sd) { > /* > @@ -12794,8 +12792,8 @@ static void nohz_balancer_kick(struct rq *rq) > * capacity, kick the ILB to see if there's a better CPU to run on: > */ > if (rq->cfs.h_nr_runnable >= 1 && check_cpu_capacity(rq, sd)) { > - flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > - goto unlock; > + flags |= NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > + goto out; > } > } > > @@ -12811,8 +12809,8 @@ static void nohz_balancer_kick(struct rq *rq) > */ > for_each_cpu_and(i, sched_domain_span(sd), nohz.idle_cpus_mask) { > if (sched_asym(sd, i, cpu)) { > - flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > - goto unlock; > + flags |= NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > + goto out; > } > } > } > @@ -12823,10 +12821,8 @@ static void nohz_balancer_kick(struct rq *rq) > * When ASYM_CPUCAPACITY; see if there's a higher capacity CPU > * to run the misfit task on. > */ > - if (check_misfit_status(rq)) { > - flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > - goto unlock; > - } > + if (check_misfit_status(rq)) > + flags |= NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > > /* > * For asymmetric systems, we do not want to nicely balance > @@ -12835,7 +12831,7 @@ static void nohz_balancer_kick(struct rq *rq) > * > * Skip the LLC logic because it's not relevant in that case. > */ > - goto unlock; > + goto out; > } > > sds = rcu_dereference_all(per_cpu(sd_llc_shared, cpu)); > @@ -12850,13 +12846,9 @@ static void nohz_balancer_kick(struct rq *rq) > * like this LLC domain has tasks we could move. > */ > nr_busy = atomic_read(&sds->nr_busy_cpus); > - if (nr_busy > 1) { > - flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > - goto unlock; > - } > + if (nr_busy > 1) > + flags |= NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; > } > -unlock: > - rcu_read_unlock(); > out: > if (READ_ONCE(nohz.needs_update)) > flags |= NOHZ_NEXT_KICK; > @@ -12868,17 +12860,13 @@ static void nohz_balancer_kick(struct rq *rq) > static void set_cpu_sd_state_busy(int cpu) > { > struct sched_domain *sd; > - > - rcu_read_lock(); > sd = rcu_dereference_all(per_cpu(sd_llc, cpu)); > > if (!sd || !sd->nohz_idle) > - goto unlock; > + return; > sd->nohz_idle = 0; > > atomic_inc(&sd->shared->nr_busy_cpus); > -unlock: > - rcu_read_unlock(); > } > > void nohz_balance_exit_idle(struct rq *rq) > @@ -12897,17 +12885,13 @@ void nohz_balance_exit_idle(struct rq *rq) > static void set_cpu_sd_state_idle(int cpu) > { > struct sched_domain *sd; > - > - rcu_read_lock(); > sd = rcu_dereference_all(per_cpu(sd_llc, cpu)); > > if (!sd || sd->nohz_idle) > - goto unlock; > + return; > sd->nohz_idle = 1; > > atomic_dec(&sd->shared->nr_busy_cpus); > -unlock: > - rcu_read_unlock(); > } > > /* Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland