Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp440592rwr; Wed, 3 May 2023 00:28:59 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7tryh4dyGKnyd4jBc4OEXRG7fg8shIUuNB9+0oAmpAQMrq+3i/d/NfXrvq7NMKQHPN5wMF X-Received: by 2002:a05:6a00:174a:b0:63b:54e4:871b with SMTP id j10-20020a056a00174a00b0063b54e4871bmr1643610pfc.8.1683098939587; Wed, 03 May 2023 00:28:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683098939; cv=none; d=google.com; s=arc-20160816; b=nWaaAQL8HgVyEldBfbFwfIMyevv81Jlm4TgqUcC6CKyHB5sX65Sx2tCW7ndNwWLwJn 9IOXVCY9XEgQlUUwqQbEZIhVlGcad69jrGnaVO5xpKbNHBOX/YqhpVi6Qb2Ncq0fcLPw cIX45ZdwGu8ldv32N1oLWkH8nlwsQts3L85q5dTgot5EmyrvwPM4Lgc9GTbFxtE5Gfj/ r43L9vUj6eHDPbn2if0HkbLwpGMm73ESmJYEdSRcNzKMkEiTGYnyW9DqXh4bOMhGVDXg XGjcMYFmMi6kDpyrexZyehNQLnkKv6yXPS1JYJt11kgQOgHfPkUk2ik8fjLoYrM4vRNj BkBw== 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 :dkim-signature; bh=T6oalUZq+znxEQ+aiMIlVP5IUOx8Oj8y5hFDoaPcV5Y=; b=dBfmXx/ltb6UuF7kFvQcnZ9f3oX1qoVQnszLYpQab/tWYqNnHbWI0Lg0MVe4KGWoE1 Q5JfbChB+9r3fjjvrDxPaAi1XTVqUQb9grvFAnBP5bUF2MFzEHUiWTTfTisPEHbwVgYw XDbKm027wInS1k32yuuS/TxJhIhulFJAEfJ59lUyU0YqPF+Vlqb0af6tJ70meGALG0Lp X/QuMtp7BpaLwOtxcKrahJbVLNlkkPSGgMz7Jjnl4+qpomGynNiLdR0efnrBSIAvzeTD /1BLZIO9UrnhmvjRMYzUtaV3BMyAE6IYWg07W3avIOsdQP1tcGFuKbRdbnZPlELSMqvH dtYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Gtr53rK6; 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=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m14-20020a656a0e000000b0051b930ef847si36260122pgu.134.2023.05.03.00.28.46; Wed, 03 May 2023 00:28:59 -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=@redhat.com header.s=mimecast20190719 header.b=Gtr53rK6; 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229478AbjECHZA (ORCPT + 99 others); Wed, 3 May 2023 03:25:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34796 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229893AbjECHYZ (ORCPT ); Wed, 3 May 2023 03:24:25 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51D144231 for ; Wed, 3 May 2023 00:23:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1683098595; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=T6oalUZq+znxEQ+aiMIlVP5IUOx8Oj8y5hFDoaPcV5Y=; b=Gtr53rK65fVSIVc3Cl8nQtY6CBS8TnPuoY1LXgNUiYfRLpC6ozULusTMDv+84fbIQVDG+n WUJlUeRtJFvIe6h3dHHDmQf9ZtDXek9iQhv56ddHJ85JEEV6mKjUTxyHobGavc7HQz5IVy n6bzDuGncWqojT+ODZY5RPTBEVVWD8s= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-330-lgjIlMNPPmWPYVDfK1DIiA-1; Wed, 03 May 2023 03:23:14 -0400 X-MC-Unique: lgjIlMNPPmWPYVDfK1DIiA-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-3f170a1fbe7so28924135e9.2 for ; Wed, 03 May 2023 00:23:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683098593; x=1685690593; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T6oalUZq+znxEQ+aiMIlVP5IUOx8Oj8y5hFDoaPcV5Y=; b=i4wNAgmWEWPEmMMXhPOCHX/Ra60l73YRKw1+T4ytOMs0U0rUG3837qCVDMlzz5qgQd GLca8x4EqbqPX8WQs5FQSFw3ZoNgTigb2bIx3ccVQKIll3TNVoDJb66UYgCzON4TCbRB RcsbaTnWFWrS83MfV3Cg2t6miX3jO4u2hihRhlqPjpMEQPwOTuSrWCu+Ny7RTszDEVai lCz0O4Z2pLQGJzbbJT8AMjy3qXKCQvw0OpnxTPH/CV9OEsxKAKpChgywoTPy44XRzjN7 9F7kKA5rNExcLJLzhHbXrYS45MApX769Hjs+Ld5HOt/zpT49/LNNeE2m7Bedr4E2tR1y gybA== X-Gm-Message-State: AC+VfDyv3J/eqMFQGMtfbKuWIDTO/2Jt9O+/LmD5d5kRuyvmcWmOeDYR m7yB7MJ/iHz9PeWuRRCg2cvQlUUFnpT6JVhCuaZm3ZM2QOz+yNpVQzwA8IAAVkioxnLP7VJ7Pr6 rYp0XWsqYZMAkMqkX18672Zoo X-Received: by 2002:a1c:4c0e:0:b0:3f0:7f4b:f3c0 with SMTP id z14-20020a1c4c0e000000b003f07f4bf3c0mr14741107wmf.19.1683098593142; Wed, 03 May 2023 00:23:13 -0700 (PDT) X-Received: by 2002:a1c:4c0e:0:b0:3f0:7f4b:f3c0 with SMTP id z14-20020a1c4c0e000000b003f07f4bf3c0mr14741087wmf.19.1683098592742; Wed, 03 May 2023 00:23:12 -0700 (PDT) Received: from localhost.localdomain.com ([2a02:b127:8011:7489:32ac:78e2:be8c:a5fb]) by smtp.gmail.com with ESMTPSA id k1-20020a7bc301000000b003eddc6aa5fasm947259wmj.39.2023.05.03.00.23.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 May 2023 00:23:11 -0700 (PDT) From: Juri Lelli To: Peter Zijlstra , Ingo Molnar , Qais Yousef , Waiman Long , Tejun Heo , Zefan Li , Johannes Weiner , Hao Luo Cc: Dietmar Eggemann , Steven Rostedt , linux-kernel@vger.kernel.org, luca.abeni@santannapisa.it, claudio@evidence.eu.com, tommaso.cucinotta@santannapisa.it, bristot@redhat.com, mathieu.poirier@linaro.org, cgroups@vger.kernel.org, Vincent Guittot , Wei Wang , Rick Yiu , Quentin Perret , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Sudeep Holla , Juri Lelli Subject: [PATCH v2 5/6] sched/deadline: Create DL BW alloc, free & check overflow interface Date: Wed, 3 May 2023 09:22:27 +0200 Message-Id: <20230503072228.115707-6-juri.lelli@redhat.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230503072228.115707-1-juri.lelli@redhat.com> References: <20230503072228.115707-1-juri.lelli@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable 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 From: Dietmar Eggemann Rework the existing dl_cpu_busy() interface which offers DL BW overflow checking and per-task DL BW allocation. Add dl_bw_free() as an interface to be able to free DL BW. It will be used to allow freeing of the DL BW request done during cpuset_can_attach() in case multiple controllers are attached to the cgroup next to the cpuset controller and one of the non-cpuset can_attach() fails. dl_bw_alloc() (and dl_bw_free()) now take a `u64 dl_bw` parameter instead of `struct task_struct *p` used in dl_cpu_busy(). This allows to allocate DL BW for a set of tasks too rater than only for a single task. Signed-off-by: Dietmar Eggemann Signed-off-by: Juri Lelli --- include/linux/sched.h | 2 ++ kernel/sched/core.c | 4 ++-- kernel/sched/deadline.c | 53 +++++++++++++++++++++++++++++++---------- kernel/sched/sched.h | 2 +- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index eed5d65b8d1f..0bee06542450 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1853,6 +1853,8 @@ current_restore_flags(unsigned long orig_flags, unsigned long flags) extern int cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial); extern int task_can_attach(struct task_struct *p, const struct cpumask *cs_effective_cpus); +extern int dl_bw_alloc(int cpu, u64 dl_bw); +extern void dl_bw_free(int cpu, u64 dl_bw); #ifdef CONFIG_SMP extern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); extern int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d826bec1c522..df659892d7d5 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -9319,7 +9319,7 @@ int task_can_attach(struct task_struct *p, if (unlikely(cpu >= nr_cpu_ids)) return -EINVAL; - ret = dl_cpu_busy(cpu, p); + ret = dl_bw_alloc(cpu, p->dl.dl_bw); } out: @@ -9604,7 +9604,7 @@ static void cpuset_cpu_active(void) static int cpuset_cpu_inactive(unsigned int cpu) { if (!cpuhp_tasks_frozen) { - int ret = dl_cpu_busy(cpu, NULL); + int ret = dl_bw_check_overflow(cpu); if (ret) return ret; diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index e11de074a6fd..166c3e6eae61 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -3058,26 +3058,38 @@ int dl_cpuset_cpumask_can_shrink(const struct cpumask *cur, return ret; } -int dl_cpu_busy(int cpu, struct task_struct *p) +enum dl_bw_request { + dl_bw_req_check_overflow = 0, + dl_bw_req_alloc, + dl_bw_req_free +}; + +static int dl_bw_manage(enum dl_bw_request req, int cpu, u64 dl_bw) { - unsigned long flags, cap; + unsigned long flags; struct dl_bw *dl_b; - bool overflow; + bool overflow = 0; rcu_read_lock_sched(); dl_b = dl_bw_of(cpu); raw_spin_lock_irqsave(&dl_b->lock, flags); - cap = dl_bw_capacity(cpu); - overflow = __dl_overflow(dl_b, cap, 0, p ? p->dl.dl_bw : 0); - if (!overflow && p) { - /* - * We reserve space for this task in the destination - * root_domain, as we can't fail after this point. - * We will free resources in the source root_domain - * later on (see set_cpus_allowed_dl()). - */ - __dl_add(dl_b, p->dl.dl_bw, dl_bw_cpus(cpu)); + if (req == dl_bw_req_free) { + __dl_sub(dl_b, dl_bw, dl_bw_cpus(cpu)); + } else { + unsigned long cap = dl_bw_capacity(cpu); + + overflow = __dl_overflow(dl_b, cap, 0, dl_bw); + + if (req == dl_bw_req_alloc && !overflow) { + /* + * We reserve space in the destination + * root_domain, as we can't fail after this point. + * We will free resources in the source root_domain + * later on (see set_cpus_allowed_dl()). + */ + __dl_add(dl_b, dl_bw, dl_bw_cpus(cpu)); + } } raw_spin_unlock_irqrestore(&dl_b->lock, flags); @@ -3085,6 +3097,21 @@ int dl_cpu_busy(int cpu, struct task_struct *p) return overflow ? -EBUSY : 0; } + +int dl_bw_check_overflow(int cpu) +{ + return dl_bw_manage(dl_bw_req_check_overflow, cpu, 0); +} + +int dl_bw_alloc(int cpu, u64 dl_bw) +{ + return dl_bw_manage(dl_bw_req_alloc, cpu, dl_bw); +} + +void dl_bw_free(int cpu, u64 dl_bw) +{ + dl_bw_manage(dl_bw_req_free, cpu, dl_bw); +} #endif #ifdef CONFIG_SCHED_DEBUG diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index ec7b3e0a2b20..0ad712811e35 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -330,7 +330,7 @@ extern void __getparam_dl(struct task_struct *p, struct sched_attr *attr); extern bool __checkparam_dl(const struct sched_attr *attr); extern bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr); extern int dl_cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial); -extern int dl_cpu_busy(int cpu, struct task_struct *p); +extern int dl_bw_check_overflow(int cpu); #ifdef CONFIG_CGROUP_SCHED -- 2.40.1