Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp36114243rwd; Mon, 10 Jul 2023 18:23:48 -0700 (PDT) X-Google-Smtp-Source: APBJJlGOCfly663zo7cUXG8WLsnF99ZNMzQdSlrn1QMm+Iucjx2P5SBAvlJg9xiIzj7WCVnQEHoE X-Received: by 2002:a05:6808:bc9:b0:3a3:7fd6:aa63 with SMTP id o9-20020a0568080bc900b003a37fd6aa63mr14503551oik.29.1689038628149; Mon, 10 Jul 2023 18:23:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689038628; cv=none; d=google.com; s=arc-20160816; b=T4M4wPQs4gJn66iBIAE1G5+cLt9ceulZBO0Lci0QSSUbNz/kgAOmDJDPQeZ+ZAsc38 EqB5DlAbkmbRjrOzATJWkv4t4CIFNQdwVRJh6+ZUZxECvQpwI00oT5dMnXDaMB4JBZLO u24kHKfF8m5KbDPC8JmxayiU3eQALSjv9F/c43EKXLocrK4FbkqJC4Thlj//XQo8xq28 vF0aVINVbrE9pW0kFYkUWC9ns7tqaw8VS7Rj3vlGHuPAXpzDPAaMFHoMJ9xWzXQVEpaH AD006it+TyEYZq33Xfw8m6mPa/h++NldLHJh7UIVTQUpR1gYLkAeFl8W8Ka5XmXPCLW8 F3RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:sender :dkim-signature; bh=59kUbRGNCBwkrlZnmQfx5l3diiMKLdHxuABzDztTtsg=; fh=5bvFqXZy/VrzcWOXnXaaKVCt2r2P+2FQUI6EKkM71t8=; b=QPMKkf8zWGGm8DnELhX71whKDW1yS3zu2kZ4SyNPkuK4lap7fuA3i6DuIv99vyXIZz OIyB+77iFjnJgSyaEAHu8BAMGheTvS5iIfolZ7MeJ2SabTKWIaYcoJ6hkw/AK4htIQlX 4FVhv1khpH5Zb5bqzfC6jp65c/kAkVNe8abioi9cVzAIlZcc/1GBVMB+yu37tWkbTtl4 TJU6yv2N2TMhyV8+7bk+wtBmt9vNBRVsPrq1fHP/SZLF+6X9CzHEWcfUj12HRiPF9rlQ S87t76ELpF2SeUxXJXYCGxWjGOs9AXytJW1co87JBbU08/BklVBez+IOnHyvAwUx50yM YdGg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=ogXBy7cF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 205-20020a6302d6000000b005576bff6888si515022pgc.817.2023.07.10.18.23.35; Mon, 10 Jul 2023 18:23:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=ogXBy7cF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231511AbjGKBPX (ORCPT + 99 others); Mon, 10 Jul 2023 21:15:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231358AbjGKBPG (ORCPT ); Mon, 10 Jul 2023 21:15:06 -0400 Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 30EF81B0; Mon, 10 Jul 2023 18:14:39 -0700 (PDT) Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-1b8b2886364so33277335ad.0; Mon, 10 Jul 2023 18:14:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1689038078; x=1691630078; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=59kUbRGNCBwkrlZnmQfx5l3diiMKLdHxuABzDztTtsg=; b=ogXBy7cFeySx7rLIp6U1Q2dK3EFMy1UWMAE8WBwVfKTCOC0gImht+H1rtiUJ9bY/eN 3ll1plvaKIdNCLVyfC5WII6+HRBBPi4nI6ck38MbV7HG0QqPCCfjkwqE/9GzL00YUsMU K0D6GAhZJNkyqJAwkq52HqZTqAa3/QZvX0SqzRJwUInXgBBONbgu9G6Jx25exwrkk3ab s+PUTZAM9Dm6Vnkg9CGEKJCh66u5WkQU5GdJ6GYIZ3fx5sst7sS1pYqcl+PwSNq5zAAu lF9MKWoUrq3FRS5LW4x3PVTujbLjjwtZgMdDVP7rv6Ogc/v8UIMuvVlVPcJOGKQQYVhv /4dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689038078; x=1691630078; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=59kUbRGNCBwkrlZnmQfx5l3diiMKLdHxuABzDztTtsg=; b=Ospje01TGTaxCZz0pkZFId/FbHzcCml7HtQB+5QAyHPSlQK1Ew/1WhUxluhS+LC03I qcvpmSx2gXC9zTacEFetQlqVXgUTPuS+tuz6yROdo6dgr/nogXKHLDR4aMEqpfw3lJbe HhNovvvANKhpnRDiwPbgWQ0jjqGwd544nALRsR2uHCNRub/H2QEG4zABsC4ZF6I9y8qc ZxT8WP3nhq1KrFV1/g84MOoZW4TcuLsj+1M1ivYuq26Zabqnxeukf1nAUctc4YzOJA+n TFXx0m1jdkiBSwm7OaxwqpS6Y+CtOIHZhk2HFo8laUergbwaFTPEiUO9oSWDfpsmh84i rzBg== X-Gm-Message-State: ABy/qLZMSWMzLu3hi6IAPXcGYuWet01tgsZs03lnl5xALpFMVZf+LuAS pct0ainX/V8RP/Xxx+Z3VIQ= X-Received: by 2002:a17:902:c20c:b0:1b5:1787:d23f with SMTP id 12-20020a170902c20c00b001b51787d23fmr11010078pll.5.1689038077827; Mon, 10 Jul 2023 18:14:37 -0700 (PDT) Received: from localhost ([2620:10d:c090:400::5:e2fe]) by smtp.gmail.com with ESMTPSA id ji19-20020a170903325300b001b869410ed2sm521941plb.72.2023.07.10.18.14.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jul 2023 18:14:37 -0700 (PDT) Sender: Tejun Heo From: Tejun Heo To: torvalds@linux-foundation.org, mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, bristot@redhat.com, vschneid@redhat.com, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@kernel.org, joshdon@google.com, brho@google.com, pjt@google.com, derkling@google.com, haoluo@google.com, dvernet@meta.com, dschatzberg@meta.com, dskarlat@cs.cmu.edu, riel@surriel.com Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, kernel-team@meta.com, Tejun Heo Subject: [PATCH 11/34] sched_ext: Add boilerplate for extensible scheduler class Date: Mon, 10 Jul 2023 15:13:29 -1000 Message-ID: <20230711011412.100319-12-tj@kernel.org> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230711011412.100319-1-tj@kernel.org> References: <20230711011412.100319-1-tj@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds dummy implementations of sched_ext interfaces which interact with the scheduler core and hook them in the correct places. As they're all dummies, this doesn't cause any behavior changes. This is split out to help reviewing. v2: balance_scx_on_up() dropped. This will be handled in sched_ext proper. Signed-off-by: Tejun Heo Reviewed-by: David Vernet Acked-by: Josh Don Acked-by: Hao Luo Acked-by: Barret Rhoden --- include/linux/sched/ext.h | 12 ++++++++++++ kernel/fork.c | 2 ++ kernel/sched/core.c | 32 ++++++++++++++++++++++++-------- kernel/sched/ext.h | 24 ++++++++++++++++++++++++ kernel/sched/idle.c | 2 ++ kernel/sched/sched.h | 2 ++ 6 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 include/linux/sched/ext.h create mode 100644 kernel/sched/ext.h diff --git a/include/linux/sched/ext.h b/include/linux/sched/ext.h new file mode 100644 index 000000000000..a05dfcf533b0 --- /dev/null +++ b/include/linux/sched/ext.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_SCHED_EXT_H +#define _LINUX_SCHED_EXT_H + +#ifdef CONFIG_SCHED_CLASS_EXT +#error "NOT IMPLEMENTED YET" +#else /* !CONFIG_SCHED_CLASS_EXT */ + +static inline void sched_ext_free(struct task_struct *p) {} + +#endif /* CONFIG_SCHED_CLASS_EXT */ +#endif /* _LINUX_SCHED_EXT_H */ diff --git a/kernel/fork.c b/kernel/fork.c index 0a9c8c03889f..d285d1a91228 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -975,6 +976,7 @@ void __put_task_struct(struct task_struct *tsk) WARN_ON(refcount_read(&tsk->usage)); WARN_ON(tsk == current); + sched_ext_free(tsk); io_uring_free(tsk); cgroup_free(tsk); task_numa_free(tsk, true); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 297740c4a5bc..c8a2c99248b7 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4699,6 +4699,8 @@ late_initcall(sched_core_sysctl_init); */ int sched_fork(unsigned long clone_flags, struct task_struct *p) { + int ret; + __sched_fork(clone_flags, p); /* * We mark the process as NEW here. This guarantees that @@ -4735,12 +4737,16 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) p->sched_reset_on_fork = 0; } - if (dl_prio(p->prio)) - return -EAGAIN; - else if (rt_prio(p->prio)) + scx_pre_fork(p); + + if (dl_prio(p->prio)) { + ret = -EAGAIN; + goto out_cancel; + } else if (rt_prio(p->prio)) { p->sched_class = &rt_sched_class; - else + } else { p->sched_class = &fair_sched_class; + } init_entity_runnable_average(&p->se); @@ -4758,6 +4764,10 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) RB_CLEAR_NODE(&p->pushable_dl_tasks); #endif return 0; + +out_cancel: + scx_cancel_fork(p); + return ret; } int sched_cgroup_fork(struct task_struct *p, struct kernel_clone_args *kargs) @@ -4788,16 +4798,18 @@ int sched_cgroup_fork(struct task_struct *p, struct kernel_clone_args *kargs) p->sched_class->task_fork(p); raw_spin_unlock_irqrestore(&p->pi_lock, flags); - return 0; + return scx_fork(p); } void sched_cancel_fork(struct task_struct *p) { + scx_cancel_fork(p); } void sched_post_fork(struct task_struct *p) { uclamp_post_fork(p); + scx_post_fork(p); } unsigned long to_ratio(u64 period, u64 runtime) @@ -5959,7 +5971,7 @@ static void put_prev_task_balance(struct rq *rq, struct task_struct *prev, * We can terminate the balance pass as soon as we know there is * a runnable task of @class priority or higher. */ - for_class_range(class, prev->sched_class, &idle_sched_class) { + for_balance_class_range(class, prev->sched_class, &idle_sched_class) { if (class->balance(rq, prev, rf)) break; } @@ -5977,6 +5989,9 @@ __pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) const struct sched_class *class; struct task_struct *p; + if (scx_enabled()) + goto restart; + /* * Optimization: we know that if all tasks are in the fair class we can * call that function directly, but only if the @prev task wasn't of a @@ -6002,7 +6017,7 @@ __pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) restart: put_prev_task_balance(rq, prev, rf); - for_each_class(class) { + for_each_active_class(class) { p = class->pick_next_task(rq); if (p) return p; @@ -6035,7 +6050,7 @@ static inline struct task_struct *pick_task(struct rq *rq) const struct sched_class *class; struct task_struct *p; - for_each_class(class) { + for_each_active_class(class) { p = class->pick_task(rq); if (p) return p; @@ -10072,6 +10087,7 @@ void __init sched_init(void) balance_push_set(smp_processor_id(), false); #endif init_sched_fair_class(); + init_sched_ext_class(); psi_init(); diff --git a/kernel/sched/ext.h b/kernel/sched/ext.h new file mode 100644 index 000000000000..6a93c4825339 --- /dev/null +++ b/kernel/sched/ext.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifdef CONFIG_SCHED_CLASS_EXT +#error "NOT IMPLEMENTED YET" +#else /* CONFIG_SCHED_CLASS_EXT */ + +#define scx_enabled() false + +static inline void scx_pre_fork(struct task_struct *p) {} +static inline int scx_fork(struct task_struct *p) { return 0; } +static inline void scx_post_fork(struct task_struct *p) {} +static inline void scx_cancel_fork(struct task_struct *p) {} +static inline void init_sched_ext_class(void) {} + +#define for_each_active_class for_each_class +#define for_balance_class_range for_class_range + +#endif /* CONFIG_SCHED_CLASS_EXT */ + +#if defined(CONFIG_SCHED_CLASS_EXT) && defined(CONFIG_SMP) +#error "NOT IMPLEMENTED YET" +#else +static inline void scx_update_idle(struct rq *rq, bool idle) {} +#endif diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index 342f58a329f5..8767d97fcfa5 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -407,11 +407,13 @@ static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int fl static void put_prev_task_idle(struct rq *rq, struct task_struct *prev) { + scx_update_idle(rq, false); } static void set_next_task_idle(struct rq *rq, struct task_struct *next, bool first) { update_idle_core(rq); + scx_update_idle(rq, true); schedstat_inc(rq->sched_goidle); } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 7eee863942f4..17bd277cf27a 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -3551,4 +3551,6 @@ enum cpu_cftype_id { extern struct cftype cpu_cftypes[CPU_CFTYPE_CNT + 1]; #endif /* CONFIG_CGROUP_SCHED */ +#include "ext.h" + #endif /* _KERNEL_SCHED_SCHED_H */ -- 2.41.0