Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp6461938rwl; Tue, 4 Apr 2023 13:09:43 -0700 (PDT) X-Google-Smtp-Source: AKy350awOWPc6HWgDtAOAee2nHdIj/rpQyPQCrfDi4rfnveIh+baQYiSSPwsi/sfukdoCF1QIvLy X-Received: by 2002:a05:6402:33a:b0:500:29e3:ce with SMTP id q26-20020a056402033a00b0050029e300cemr531396edw.36.1680638983298; Tue, 04 Apr 2023 13:09:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680638983; cv=none; d=google.com; s=arc-20160816; b=ixi2qd8OQlflP8cF71HukeY3qm3qoLieOP6Atj2Jda+6z2Iiyv2Xjq2Vs81jC/EiDh vxrO/U7Nn4C4yJW1hwyxG9yf9LtGmINOQynN347Sa6uhfAbi56uodh+L+V8DYLlWetTm 2uLs5FNTj1NLcvsZNlGtUIjG+L9Q2ai3unaO51Sl//nrPextNSW9UrsG2hGAYZOsfAbQ G5IjtP8OBvjuC8CFKIr+48c9kexG1UsAPxohiyFiIxN3HEX24G51tLFhZJMj58KLEc/t 2Pqi9fs4GcdtJMTyOZWRPwkw6Fa+PtDbMOIts9rVytfjSarY9QhDsmCTkb765PWFSSgj 1I1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=fzcIcdfK6v6WZlW481z/oaOzg6K9dkiqV3VlSKeaQxk=; b=zFK1K+ZBrhN5V3MGB5KwK/caZz86hgadjGjWdaunTQPHTxs6LkdxvB6PIgH66L/Nkd byIXI/aANWbp3gr0n6C+VRFvOs4k5ow901Aw2hmFr1kZbg32vhoYgiXTn4OcvIQF8zeN 9TWb+XLbm4gu/BUvDYNHnyvxrX1zKMfumlXyYW7f+ci5nIy5aKkMCEAiAJTvQuaZdiGN SK3dL88GFxdl5kbww6bcnHKgOZEn+83Pj24Xx/mG9N7J5cfZM7Cox47ZbLO4tA6uaK4B UiEXAEVk1KAk/UyQvOYLGQ1gCyU6jxlQe2h5n6gz86PK2FkET1+HsUjkcJL2joiv/gdE LnEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@layalina-io.20210112.gappssmtp.com header.s=20210112 header.b=dOr7Zq8P; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w16-20020aa7cb50000000b004fcbd87bb03si2196681edt.333.2023.04.04.13.09.18; Tue, 04 Apr 2023 13:09:43 -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=@layalina-io.20210112.gappssmtp.com header.s=20210112 header.b=dOr7Zq8P; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234808AbjDDUGO (ORCPT + 99 others); Tue, 4 Apr 2023 16:06:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53278 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236245AbjDDUGK (ORCPT ); Tue, 4 Apr 2023 16:06:10 -0400 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 01A43170B for ; Tue, 4 Apr 2023 13:06:04 -0700 (PDT) Received: by mail-wr1-x434.google.com with SMTP id t4so28803954wra.7 for ; Tue, 04 Apr 2023 13:06:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=layalina-io.20210112.gappssmtp.com; s=20210112; t=1680638763; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=fzcIcdfK6v6WZlW481z/oaOzg6K9dkiqV3VlSKeaQxk=; b=dOr7Zq8PSNVIa43CVrIIl7DPYIkM2Hj1+TqDDbU/S3cBOJEMJy2M31X53CLptqz3Q9 LgsoDnQOo5KapDOVeMmqkWxn2fCGJ3H7SG0yWveDmyJ/0W4wv3jdzWtjAVbBt6H91xed 7dydChFL/a0cs3yf/oZTxHg1pQhrP9wtXoCkmtxIQ3qEhpwt+Eu0UdePh0QxIFae36Xa MHIvFEVshrFIFEez+s+4X7ed0mANRSoQ6FU1NFvXaIIQoDSFvBVmh3JH0LXpzHDLLR7R WBBX3GkbIvmHN9DX1qq9ETPnn9EzHgMqYPu4CSpcnA/O3siN+XkECtOs9xt5ckNHtLuu sjfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680638763; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=fzcIcdfK6v6WZlW481z/oaOzg6K9dkiqV3VlSKeaQxk=; b=C3zSz5VO4zCc2Gmy9abzlCSSokniuI4iAZkTvgsjNIp5s67L/QoxT0o4NTi0uVpOsi r99cWjcM0dExiOZaqImDMURilS1KRyx08QDC7U2J/KgV3M0Yfzd05z1rVRJcPNWs38De CK+GrLujon4C9sbtXyq2pHS76N0f/G8estlUBVrxRtZP8ER0oEFWy+6QAlp2PzZKYXFA l0v3JPz/g5E3L9/0RiyCxF8GZ35eldUn0YKA1/PR3vx/zXNpo1l9GEvKg5NhWj4vfeEL mBMzV00sZ1R/gHXWMJT7efbzSBTqjBZTayA5UdCuWkGrXmfrbyrDArUuSnH9o5BZsasI wzvg== X-Gm-Message-State: AAQBX9estw+ksCSk9SptSgACdrn0UAGDHp0Mio2Yio0BYcAREKAdmn90 i+5XrQFfhoCP2x/NUKpQjmwH1Q== X-Received: by 2002:a05:6000:1292:b0:2cf:efad:9c1f with SMTP id f18-20020a056000129200b002cfefad9c1fmr2270129wrx.46.1680638763359; Tue, 04 Apr 2023 13:06:03 -0700 (PDT) Received: from airbuntu (host86-163-35-64.range86-163.btcentralplus.com. [86.163.35.64]) by smtp.gmail.com with ESMTPSA id k12-20020adfe8cc000000b002c7b229b1basm13054297wrn.15.2023.04.04.13.06.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Apr 2023 13:06:02 -0700 (PDT) Date: Tue, 4 Apr 2023 21:06:01 +0100 From: Qais Yousef To: Juri Lelli Cc: Peter Zijlstra , Ingo Molnar , Waiman Long , Tejun Heo , Zefan Li , Johannes Weiner , Hao Luo , 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 Subject: Re: [PATCH 3/6] sched/cpuset: Keep track of SCHED_DEADLINE task in cpusets Message-ID: <20230404200601.vjsju6iayisy7gjt@airbuntu> References: <20230329125558.255239-1-juri.lelli@redhat.com> <20230329125558.255239-4-juri.lelli@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20230329125558.255239-4-juri.lelli@redhat.com> X-Spam-Status: No, score=0.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS 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 On 03/29/23 14:55, Juri Lelli wrote: > Qais reported that iterating over all tasks when rebuilding root domains > for finding out which ones are DEADLINE and need their bandwidth > correctly restored on such root domains can be a costly operation (10+ > ms delays on suspend-resume). > > To fix the problem keep track of the number of DEADLINE tasks belonging > to each cpuset and then use this information (followup patch) to only > perform the above iteration if DEADLINE tasks are actually present in > the cpuset for which a corresponding root domain is being rebuilt. > > Reported-by: Qais Yousef > Link: https://lore.kernel.org/lkml/20230206221428.2125324-1-qyousef@layalina.io/ > Signed-off-by: Juri Lelli > --- Reviewed-by: Qais Yousef Tested-by: Qais Yousef Thanks! -- Qais Yousef > include/linux/cpuset.h | 4 ++++ > kernel/cgroup/cgroup.c | 4 ++++ > kernel/cgroup/cpuset.c | 25 +++++++++++++++++++++++++ > kernel/sched/deadline.c | 14 ++++++++++++++ > 4 files changed, 47 insertions(+) > > diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h > index 355f796c5f07..0348dba5680e 100644 > --- a/include/linux/cpuset.h > +++ b/include/linux/cpuset.h > @@ -71,6 +71,8 @@ extern void cpuset_init_smp(void); > extern void cpuset_force_rebuild(void); > extern void cpuset_update_active_cpus(void); > extern void cpuset_wait_for_hotplug(void); > +extern void inc_dl_tasks_cs(struct task_struct *task); > +extern void dec_dl_tasks_cs(struct task_struct *task); > extern void cpuset_lock(void); > extern void cpuset_unlock(void); > extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); > @@ -196,6 +198,8 @@ static inline void cpuset_update_active_cpus(void) > > static inline void cpuset_wait_for_hotplug(void) { } > > +static inline void inc_dl_tasks_cs(struct task_struct *task) { } > +static inline void dec_dl_tasks_cs(struct task_struct *task) { } > static inline void cpuset_lock(void) { } > static inline void cpuset_unlock(void) { } > > diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c > index 935e8121b21e..ff27b2d2bf0b 100644 > --- a/kernel/cgroup/cgroup.c > +++ b/kernel/cgroup/cgroup.c > @@ -57,6 +57,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -6673,6 +6674,9 @@ void cgroup_exit(struct task_struct *tsk) > list_add_tail(&tsk->cg_list, &cset->dying_tasks); > cset->nr_tasks--; > > + if (dl_task(tsk)) > + dec_dl_tasks_cs(tsk); > + > WARN_ON_ONCE(cgroup_task_frozen(tsk)); > if (unlikely(!(tsk->flags & PF_KTHREAD) && > test_bit(CGRP_FREEZE, &task_dfl_cgroup(tsk)->flags))) > diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c > index fbc10b494292..eb0854ef9757 100644 > --- a/kernel/cgroup/cpuset.c > +++ b/kernel/cgroup/cpuset.c > @@ -193,6 +193,12 @@ struct cpuset { > int use_parent_ecpus; > int child_ecpus_count; > > + /* > + * number of SCHED_DEADLINE tasks attached to this cpuset, so that we > + * know when to rebuild associated root domain bandwidth information. > + */ > + int nr_deadline_tasks; > + > /* Invalid partition error code, not lock protected */ > enum prs_errcode prs_err; > > @@ -245,6 +251,20 @@ static inline struct cpuset *parent_cs(struct cpuset *cs) > return css_cs(cs->css.parent); > } > > +void inc_dl_tasks_cs(struct task_struct *p) > +{ > + struct cpuset *cs = task_cs(p); > + > + cs->nr_deadline_tasks++; > +} > + > +void dec_dl_tasks_cs(struct task_struct *p) > +{ > + struct cpuset *cs = task_cs(p); > + > + cs->nr_deadline_tasks--; > +} > + > /* bits in struct cpuset flags field */ > typedef enum { > CS_ONLINE, > @@ -2477,6 +2497,11 @@ static int cpuset_can_attach(struct cgroup_taskset *tset) > ret = security_task_setscheduler(task); > if (ret) > goto out_unlock; > + > + if (dl_task(task)) { > + cs->nr_deadline_tasks++; > + cpuset_attach_old_cs->nr_deadline_tasks--; > + } > } > > /* > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c > index 4cc7e1ca066d..8f92f0f87383 100644 > --- a/kernel/sched/deadline.c > +++ b/kernel/sched/deadline.c > @@ -16,6 +16,8 @@ > * Fabio Checconi > */ > > +#include > + > /* > * Default limits for DL period; on the top end we guard against small util > * tasks still getting ridiculously long effective runtimes, on the bottom end we > @@ -2595,6 +2597,12 @@ static void switched_from_dl(struct rq *rq, struct task_struct *p) > if (task_on_rq_queued(p) && p->dl.dl_runtime) > task_non_contending(p); > > + /* > + * In case a task is setscheduled out from SCHED_DEADLINE we need to > + * keep track of that on its cpuset (for correct bandwidth tracking). > + */ > + dec_dl_tasks_cs(p); > + > if (!task_on_rq_queued(p)) { > /* > * Inactive timer is armed. However, p is leaving DEADLINE and > @@ -2635,6 +2643,12 @@ static void switched_to_dl(struct rq *rq, struct task_struct *p) > if (hrtimer_try_to_cancel(&p->dl.inactive_timer) == 1) > put_task_struct(p); > > + /* > + * In case a task is setscheduled to SCHED_DEADLINE we need to keep > + * track of that on its cpuset (for correct bandwidth tracking). > + */ > + inc_dl_tasks_cs(p); > + > /* If p is not queued we will update its parameters at next wakeup. */ > if (!task_on_rq_queued(p)) { > add_rq_bw(&p->dl, &rq->dl); > -- > 2.39.2 >