From nobody Mon Feb 9 16:45:57 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0B093C761A6 for ; Wed, 29 Mar 2023 12:57:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230062AbjC2M5a (ORCPT ); Wed, 29 Mar 2023 08:57:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229852AbjC2M5W (ORCPT ); Wed, 29 Mar 2023 08:57:22 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E3141708 for ; Wed, 29 Mar 2023 05:56:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680094599; 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=iaWZTicEe0Rf17O02C5dBoHMVec0v/VEmNZr7Wzl9CM=; b=jP/UsPQ1D1KbB5NLeq2T3VNT6kppjDWzrhzSlvi2kqfl2NjcVARIG3ZqyHC4lW8YVmr8q4 tDlYpmGuxRfxZT6PjQhmx1O2z1G+Z21aoG7s3tyX7SQWwuq0KLP3R6asLJ+GwPIjN4a9iu nP1l2+zEJowZEM11B3aQxbwC+7ArAl4= Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-549-JiPWSA-zNcCp0HV2a1D3kw-1; Wed, 29 Mar 2023 08:56:37 -0400 X-MC-Unique: JiPWSA-zNcCp0HV2a1D3kw-1 Received: by mail-qv1-f71.google.com with SMTP id y19-20020ad445b3000000b005a5123cb627so6510409qvu.20 for ; Wed, 29 Mar 2023 05:56:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680094597; 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=iaWZTicEe0Rf17O02C5dBoHMVec0v/VEmNZr7Wzl9CM=; b=efuMKWRiX33sQULZDd/guas9XF46HFMakozoliT2aFdZrpwWFldoeZwAx4Yhqp5D5C ngNiGBEm4Q6bkEUT7+VDe7fSlqt0Da/aDAUn7xxzQmYyu3lcceZ+bNzLvsBvEYyUBzY0 t20mUG+6KCyb+6V3pca944BOTnA0hh5yMXonHmiAj0H+cNNpQfhXqXQAWz+6C5sApW0M OV8OcNppeVAf2tqiOgtnhD+GlQrFXIS6ZEF1K4VYES3A/w+tT39U/m+KKlx6i31E4sei Cn3J/bavB9785Ff7YpcDTDeldDSPiyiGQtqpx9+q4MQfEtOXtrt1Wv8qCBkAr7EuV6EU NBfQ== X-Gm-Message-State: AO0yUKUl26A9xbA4c3g9LDs5RMNFDZ3G9d+vz6fPJqTm45iS0H1VOzp5 c/HwOrGUScuuy/obUYmFSpb43QjrXsMTz0p9DdzmxkI2VKqAkLx7lIaGf8cGg3dUe82E7hP7vw4 cg7hyFzMEWIZ1eAG24y4aygfG X-Received: by 2002:ac8:57d5:0:b0:3b8:340b:1aab with SMTP id w21-20020ac857d5000000b003b8340b1aabmr31612101qta.25.1680094597323; Wed, 29 Mar 2023 05:56:37 -0700 (PDT) X-Google-Smtp-Source: AK7set8qYTTO3HQ+f+NKBZ2N8SbKSDpArbeHLUxBVSfCUX0h0ZlK/ctdeeDs/mPZ+Gr6Z6daWTz5Xg== X-Received: by 2002:ac8:57d5:0:b0:3b8:340b:1aab with SMTP id w21-20020ac857d5000000b003b8340b1aabmr31612059qta.25.1680094597004; Wed, 29 Mar 2023 05:56:37 -0700 (PDT) Received: from localhost.localdomain.com ([151.29.151.163]) by smtp.gmail.com with ESMTPSA id c23-20020a379a17000000b007436d0e9408sm13527134qke.127.2023.03.29.05.56.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Mar 2023 05:56:36 -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 4/6] sched/deadline: Create DL BW alloc, free & check overflow interface Date: Wed, 29 Mar 2023 14:55:56 +0200 Message-Id: <20230329125558.255239-5-juri.lelli@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230329125558.255239-1-juri.lelli@redhat.com> References: <20230329125558.255239-1-juri.lelli@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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 6d654eb4cabd..6f3d84e0ed08 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1848,6 +1848,8 @@ current_restore_flags(unsigned long orig_flags, unsig= ned long flags) =20 extern int cpuset_cpumask_can_shrink(const struct cpumask *cur, const stru= ct 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 cpumas= k *new_mask); extern int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumas= k *new_mask); diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 179266ff653f..c83dae6b8586 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -9294,7 +9294,7 @@ int task_can_attach(struct task_struct *p, =20 if (unlikely(cpu >=3D nr_cpu_ids)) return -EINVAL; - ret =3D dl_cpu_busy(cpu, p); + ret =3D dl_bw_alloc(cpu, p->dl.dl_bw); } =20 out: @@ -9579,7 +9579,7 @@ static void cpuset_cpu_active(void) static int cpuset_cpu_inactive(unsigned int cpu) { if (!cpuhp_tasks_frozen) { - int ret =3D dl_cpu_busy(cpu, NULL); + int ret =3D dl_bw_check_overflow(cpu); =20 if (ret) return ret; diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 8f92f0f87383..5b6965e0e537 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -3057,26 +3057,38 @@ int dl_cpuset_cpumask_can_shrink(const struct cpuma= sk *cur, return ret; } =20 -int dl_cpu_busy(int cpu, struct task_struct *p) +enum dl_bw_request { + dl_bw_req_check_overflow =3D 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 =3D 0; =20 rcu_read_lock_sched(); dl_b =3D dl_bw_of(cpu); raw_spin_lock_irqsave(&dl_b->lock, flags); - cap =3D dl_bw_capacity(cpu); - overflow =3D __dl_overflow(dl_b, cap, 0, p ? p->dl.dl_bw : 0); =20 - 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 =3D=3D dl_bw_req_free) { + __dl_sub(dl_b, dl_bw, dl_bw_cpus(cpu)); + } else { + unsigned long cap =3D dl_bw_capacity(cpu); + + overflow =3D __dl_overflow(dl_b, cap, 0, dl_bw); + + if (req =3D=3D 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)); + } } =20 raw_spin_unlock_irqrestore(&dl_b->lock, flags); @@ -3084,6 +3096,21 @@ int dl_cpu_busy(int cpu, struct task_struct *p) =20 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 =20 #ifdef CONFIG_SCHED_DEBUG diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 060616944d7a..81ecfd1a1a48 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_att= r *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); =20 #ifdef CONFIG_CGROUP_SCHED =20 --=20 2.39.2