From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EBA99287506 for ; Mon, 10 Nov 2025 03:32:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762745572; cv=none; b=ONDLBwwnqXt8WjWlcE2TG3NxN7q2agmeTlh0g22T4XGS+EyPwmpwKk8M16tR8Jn9679WlpZg3UHnfW+mOWqTgUjuHWG2nBNy/sbYdGR1g7AkZe241iT5QBiMbOmx0+FtoS8ZCXQmuZP8e11ISiwBy1t3aY/uAUTtWl24aHoE2hg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762745572; c=relaxed/simple; bh=/Sbi2RsDbKFxh18qy4P7m0nH9/yJnCUGEiCikFyDTJk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pKoQKqE9sJIII8QeDPSL7gdc8KvRkuOkHdme3soeiOJqgqKsh70Zi8tDiOk0Bel814MZ+YL9zisx6yGFez11PBQrXKC0XvW5xRTkZ7iCKcqqK3Ao8V0ODDZIKgGpsf6vYlE3zIyGlLJswC5lbwIRPK7agitOyJOoGaYY8xOQMEc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Z8dnngHt; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Z8dnngHt" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-297eca3d0a3so15513375ad.0 for ; Sun, 09 Nov 2025 19:32:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762745570; x=1763350370; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mJ2T78O7RQhMqXnI5opkr+3j7nLw8GADo232iLhnq+M=; b=Z8dnngHt/b5aMUY9WnaF+GYgDuxVtosMTTkzSJ+9CRgjsgwtAjHtJ56ZJDVfM7Pb01 X2FPrOqHu+midWrOugGwvT3a2VcHqXSNi+YWkYmiAGgrAUKnDO9UqCrNb3sYViOlYGju KPuj/1p6cSUp+Z8AOxC1DyJXV4UJsj0+Ur+lxtmbV/mjEtMk8iOd+ZBCR1px9als/aao F0RjxJh7oerqXtNS8wGyQXTeRqLPBJsYZmbHahE/n4u8AGK7+uY/GpHz4eilqihvOAdC KNGtYwkonic8LMn45PTiBVhyrVYMbXKxqY7xn4p3FhJNDs8eJ56f1nFq7VipI5sDn10E gK3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762745570; x=1763350370; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mJ2T78O7RQhMqXnI5opkr+3j7nLw8GADo232iLhnq+M=; b=dcZ3p9vbXU7Twebg+iUhsTEy6Q/oozv4hW+jQ/acEnLSGq3Oo2YUNjNkgocitteIJl W7x2K8y96AO+5BGCn/Qxvai/cY2nSCd6solKh0aP/N3H47JmAMQuwYqGlwCXxs9luSKd 8OAieJvzhufwR+3wyGPxcRALuu26gBCDAGO2mGU9VqXozOf47gnHaqIzfahl4CYBVkpK whlVmDJMg31toO+ULqAvI3YWpUCtCo6v5gykqcDyY9sZPHSX+IerSBqfgeQwVrPz6r23 RrJYHqrvJD/gNIrXmWKWL2WXGy1owISaeLCC3BzKT8ax/57kH50mwt7vcsiFQzXC6Jb9 4PrQ== X-Forwarded-Encrypted: i=1; AJvYcCWlnBDZnOThN8H9L63bCQyT4cZg709mCgU/jblR15BWiIi9H+YtVd4pyuqAXL58gqNle/LVvbZKS91on4A=@vger.kernel.org X-Gm-Message-State: AOJu0YxuXrtxTxbD9FM39TImRUbFk6jmZZkirOAY3c73z+yO0h+EgJAq Qhei2YqVY0ousIxcTyyRy2VCoPf/Cf/4cxWTFtiVAU+zzH9/vTBj+iQLQHoMxUa9l0rwgg== X-Gm-Gg: ASbGncs+FMS8AhQWF22nxcJZJ0wg/VwwVH0guSj7OYh7HWNsdN5Fsq4jl1Lpcxycr9C BYsPHA7YsaTIUEBCEETEgjNJPXBQ2Dbn77ikol4m4PO9UjJBd77WHOHLMbKPfs9cD3877WY5WKB 4e4LoMtm3qPV+q4s4ve52a8U02wXAQD9XrSfbSpErnjrIx7YA2SCvlOvweotn5aaW6niTHrLt/f meFtv+MPxPN/GYzFs5094CPl1oDIVvtc4NgBCEeTcMAG++Dhwy0aoMwQq+9adgA1oeIDFf95uPH 1Vv8IoMix+elRyfzX/48kE1/tI6HwBfV5qvdRs6O96sUcO4kfxVHfmwu7RTSE+5f4b9vPQ80E51 fa41L7QjUfcuhyuIJUvx8hpw4H48vol99TI22I4mUxQQlewK58Lm2Nt+z+rR/WiByaZSQPB52ky O47oYt4CA0 X-Google-Smtp-Source: AGHT+IH8IURFUXv0dHkJ6ZHGGTBAvnY0vbnOOUIKPpXB78BdN5c4T+GwBYMwLuqJLnGxvgOdporgtA== X-Received: by 2002:a17:903:f8c:b0:26c:2e56:ec27 with SMTP id d9443c01a7336-297e5627d67mr89334695ad.19.1762745570152; Sun, 09 Nov 2025 19:32:50 -0800 (PST) Received: from wanpengli.. ([124.93.80.37]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-ba900fa571esm10913877a12.26.2025.11.09.19.32.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Nov 2025 19:32:49 -0800 (PST) From: Wanpeng Li To: Peter Zijlstra , Ingo Molnar , Thomas Gleixner , Paolo Bonzini , Sean Christopherson Cc: Steven Rostedt , Vincent Guittot , Juri Lelli , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Wanpeng Li Subject: [PATCH 03/10] sched/fair: Add cgroup LCA finder for hierarchical yield Date: Mon, 10 Nov 2025 11:32:24 +0800 Message-ID: <20251110033232.12538-4-kernellwp@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251110033232.12538-1-kernellwp@gmail.com> References: <20251110033232.12538-1-kernellwp@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Wanpeng Li From: Wanpeng Li Implement yield_deboost_find_lca() to locate the lowest common ancestor (LCA) in the cgroup hierarchy for EEVDF-aware yield operations. The LCA represents the appropriate hierarchy level where vruntime adjustments should be applied to ensure fairness is maintained across cgroup boundaries. This is critical for virtualization workloads where vCPUs may be organized in nested cgroups. For CONFIG_FAIR_GROUP_SCHED, walk up both entity hierarchies by aligning depths, then ascend together until a common cfs_rq is found. For flat hierarchy, verify both entities share the same cfs_rq. Validate that meaningful contention exists (nr_queued > 1) and ensure the yielding entity has non-zero slice for safe penalty calculation. The function operates under rq->lock protection. This static helper will be integrated in subsequent patches. Signed-off-by: Wanpeng Li --- kernel/sched/fair.c | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index a7dc21c2dbdb..740c002b8f1c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -9058,6 +9058,66 @@ static bool __maybe_unused yield_deboost_validate_tasks(struct rq *rq, struct ta return true; } +/* + * Find the lowest common ancestor (LCA) in the cgroup hierarchy for EEVDF. + * We walk up both entity hierarchies under rq->lock protection. + * Task migration requires task_rq_lock, ensuring parent chains remain stable. + * We locate the first common cfs_rq where both entities coexist, representing + * the appropriate level for vruntime adjustments and EEVDF field updates + * (deadline, vlag) to maintain scheduler consistency. + */ +static bool __maybe_unused yield_deboost_find_lca(struct sched_entity *se_y, struct sched_entity *se_t, + struct sched_entity **se_y_lca_out, + struct sched_entity **se_t_lca_out, + struct cfs_rq **cfs_rq_common_out) +{ + struct sched_entity *se_y_lca, *se_t_lca; + struct cfs_rq *cfs_rq_common; + +#ifdef CONFIG_FAIR_GROUP_SCHED + se_t_lca = se_t; + se_y_lca = se_y; + + while (se_t_lca && se_y_lca && se_t_lca->depth != se_y_lca->depth) { + if (se_t_lca->depth > se_y_lca->depth) + se_t_lca = se_t_lca->parent; + else + se_y_lca = se_y_lca->parent; + } + + while (se_t_lca && se_y_lca) { + if (cfs_rq_of(se_t_lca) == cfs_rq_of(se_y_lca)) { + cfs_rq_common = cfs_rq_of(se_t_lca); + goto found_lca; + } + se_t_lca = se_t_lca->parent; + se_y_lca = se_y_lca->parent; + } + return false; +#else + if (cfs_rq_of(se_y) != cfs_rq_of(se_t)) + return false; + cfs_rq_common = cfs_rq_of(se_y); + se_y_lca = se_y; + se_t_lca = se_t; +#endif + +found_lca: + if (!se_y_lca || !se_t_lca) + return false; + + if (cfs_rq_common->nr_queued <= 1) + return false; + + if (!se_y_lca->slice) + return false; + + *se_y_lca_out = se_y_lca; + *se_t_lca_out = se_t_lca; + *cfs_rq_common_out = cfs_rq_common; + return true; +} + /* * sched_yield() is very simple */ -- 2.43.0