From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gentwo.org (gentwo.org [62.72.0.81]) (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 F204B390C84 for ; Wed, 29 Jul 2026 18:17:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=62.72.0.81 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785349033; cv=none; b=DnZJM+w/z7Pvz2GNrzpT3ZhQF9A6/5/05qW1tvE38HwhQQDUOIUtbVbZJwCq9ETQ26Dp6yMchJv0TOAgqSXiEXjV9ZtezC6oa77q+wEMzPtUv4je7IGlTyMKsXuNQP7YOKobz0NhhRoaEYR7+aeZHCn6+fJHsLlvID0/98o47Lg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785349033; c=relaxed/simple; bh=WP3HUWhKQ4zE6mRW0N/Dm1Q6VihE4FHhRVZw7gloe60=; h=Date:From:To:cc:Subject:In-Reply-To:Message-ID:References: MIME-Version:Content-Type; b=OwIaADp8gkQJJFbRq8TsNmNRzEF/oItXsNmNihp8rAhEWHbfbaUTvCbFrRwfgoyzjqJ9OGSkSR0aQwJlSd6Jkyl+m8yLIJdOrlP7adM1coNFtb6Zaq/sQPmZ+iCpFq4k+9aAVAGIcI6uq3yiniGGfpFIQUmIVq9JjLg5/Yj6AC4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=gentwo.org; spf=pass smtp.mailfrom=gentwo.org; dkim=pass (1024-bit key) header.d=gentwo.org header.i=@gentwo.org header.b=hsh8QLmK; arc=none smtp.client-ip=62.72.0.81 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=gentwo.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gentwo.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=gentwo.org header.i=@gentwo.org header.b="hsh8QLmK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gentwo.org; s=default; t=1785348361; bh=WP3HUWhKQ4zE6mRW0N/Dm1Q6VihE4FHhRVZw7gloe60=; h=Date:From:To:cc:Subject:In-Reply-To:References:From; b=hsh8QLmKp84iuWOqQNbQkyXUVKBuYJAB4TG+YiF6Wyezben/elE58ajoBEtHwiy4R O8XkY5aRKrR7cHQioDzDoZeLF5phA2Nezp22miHZI8ASIs5Ke+UE7BA6FpxHUvUTz5 TORDETrpOgLJjw99ooPIV0QDwh64KdeugqQ3zvnQ= Received: by gentwo.org (Postfix, from userid 1007) id 3F493401AE; Wed, 29 Jul 2026 11:06:01 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by gentwo.org (Postfix) with ESMTP id 3798340110; Wed, 29 Jul 2026 11:06:01 -0700 (PDT) Date: Wed, 29 Jul 2026 11:06:01 -0700 (PDT) From: Shubhang To: Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , K Prateek Nayak cc: "Christoph Lameter (Ampere)" , Shubhang Kaushik , linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] sched/fair: Prefer waker CPU for reciprocal sync wakeups In-Reply-To: <20260722-b4-sched-sync-wakeup-v2-1-f1164560b24b@gentwo.org> Message-ID: <5a064321-6505-2aed-903d-3e47cbae4096@gentwo.org> References: <20260722-b4-sched-sync-wakeup-v2-1-f1164560b24b@gentwo.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Hi all, v3 was recently posted, kindly review the same here: https://lore.kernel.org/all/20260727-b4-sched-sync-wakeup-v3-1-90cf481dbd85@gentwo.org/ Compared to v2, it limits the direct waker-CPU preference to non-SMT systems. SMT systems continue through the existing wake_affine() and select_idle_sibling() path, leaving idle sibling/core placement in SIS. It also drops the redundant cpumask_test_cpu(cpu, p->cpus_ptr) check from the helper, removes READ_ONCE() around p->last_wakee, and refreshes testing on v7.2-rc5. Thanks, Shubhang Kaushik On Wed, 22 Jul 2026, Shubhang Kaushik (Ampere) wrote: > Pipe-style ping-pong workloads can be dominated by handoff cost. In > such cases, placing the wakee on an idle CPU can be slower than keeping > the pair on the same runqueue. > > Use the existing last_wakee and wake_wide() state to identify narrow > reciprocal WF_SYNC wakeups: > > A wakes B > B wakes A > A wakes B > ... > > When the wake-affine domain allows SD_WAKE_AFFINE, prefer the waker CPU > for these narrow reciprocal handoffs. Do so only when the waker CPU has no > other runnable fair task, the wakee is allowed on that CPU, and the wakee > fits there on asymmetric capacity systems. > > Wakeups that do not match this pattern continue through the existing > wake_affine() and select_idle_sibling() path. > > Signed-off-by: Shubhang Kaushik (Ampere) > --- > Tested on 80-core Ampere Altra: perf bench sched pipe -l 1000000 improved > by about 30%, averaged over 20 runs. Hackbench, schbench and SPECjBB > showed no material regression. > > Baseline ~ v7.2-rc4 (mainline origin/master at 248951ddc14d) > --- > Changes in v2: > - Move the reciprocal handoff preference under the existing > SD_WAKE_AFFINE domain check. > - Drop futex from the changelog motivation. > - Refresh perf bench sched pipe results after rebasing. > > Link to v1: https://lore.kernel.org/r/20260721-b4-sched-sync-wakeup-v1-1-dc94f184e27f@gentwo.org > --- > kernel/sched/fair.c | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index d78467ec6ee1343050fcc2794dafb38ade3599e5..d188e91b85d74dd3ed3c8b99f171bd142e72da5e 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -8794,6 +8794,29 @@ static inline bool asym_fits_cpu(unsigned long util, > return true; > } > > +/* > + * For reciprocal WF_SYNC handoffs, prefer the waker CPU when it has no > + * other runnable fair task. > + */ > +static bool prefer_sync_pair_cpu(struct task_struct *p, int cpu) > +{ > + struct rq *rq = cpu_rq(cpu); > + > + if ((rq->nr_running - cfs_h_nr_delayed(rq)) != 1) > + return false; > + > + if (!cpumask_test_cpu(cpu, p->cpus_ptr)) > + return false; > + > + if (sched_asym_cpucap_active()) { > + sync_entity_load_avg(&p->se); > + if (!task_fits_cpu(p, cpu)) > + return false; > + } > + > + return true; > +} > + > /* > * Try and locate an idle core/thread in the LLC cache domain. > */ > @@ -9579,6 +9602,11 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags) > */ > if (want_affine && (tmp->flags & SD_WAKE_AFFINE) && > cpumask_test_cpu(prev_cpu, sched_domain_span(tmp))) { > + if (sync && > + READ_ONCE(p->last_wakee) == current && > + prefer_sync_pair_cpu(p, cpu)) > + return cpu; > + > if (cpu != prev_cpu) > new_cpu = wake_affine(tmp, p, cpu, prev_cpu, sync); > > > --- > base-commit: 248951ddc14de84de3910f9b13f51491a8cd91df > change-id: 20260721-b4-sched-sync-wakeup-04d40cbeb1da > > Best regards, > -- > Shubhang Kaushik (Ampere) >