Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1317310pxk; Sat, 12 Sep 2020 21:02:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzv2UlTlmtWo9wfTK/wLEknkhuMVDObYfUuguwoUFFzd/FzaNpb17tI5Zq502V9UVr/18hM X-Received: by 2002:a17:907:7293:: with SMTP id dt19mr8542787ejc.5.1599969734068; Sat, 12 Sep 2020 21:02:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599969734; cv=none; d=google.com; s=arc-20160816; b=ikdRkTQLID/DpeCmZZSmutG9Q25pvrrVdoCHEz60KQMA+vglx6B2YR/NKI6a+nofwI 34+UUqT+QMv3z2u27yG/5jVEyTdzZ57uAaJXa1xTvLaHyd3/vJEBssdVQ0c+I4Bf+Z75 EBN10IYAOfrkx8e7La7ZnJsqXqoR/cA7tnxQ6QM07YJeeXxQLFBcBkhDPEVIlC8hadkV +hr80YIq0qTBn0AnMSrb7iGSGxh4I1jx5nk5cfTXe/16jlxw8wbhT236nd07lg7oKjud tA5ZYkWoxtvWoQ0BsBVidX6aDCmPVp6D5tDL65FcMEG9at+1GU+5UDySmgbtjVEGsv7M XbNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=Axj7dqz+5SFuOgGcn5J7uk7r49/6rAWVqjS9AY/4xjo=; b=vplVIUysVqAGbngrTexbT7B9P8FaDd1Nsa8UMpOftUirQefCOZEugLo8BKjSX1rEZG gEIs3UZ1Y4hePQRXGp+CYrIebR2HZOPwBeH5qb7zmLitvQuyrLfB3MUMGk25k1aFTT/N npvtCMyJSsUAZZFuJx3bmkEwTeCnAr40MprxK/TNwLh5LE2Cee3OoFDw1+Dm6A/a70d3 RLQZoq6kFt+ytAbZwCMnA4fiiHaBQPwLlLV5CKT0gF9yPrSlFWQnR+LmiUrsZ/GYJj8W 1NmvFdY3ilzgrXSiXkH5uJxlkgtKd71Y2ecimqEX+LmYb3RDZIZZO8g0JhIAHAL5f/R4 kt/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PUsN0kvy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qq11si4520902ejb.445.2020.09.12.21.01.38; Sat, 12 Sep 2020 21:02:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PUsN0kvy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725910AbgIMD75 (ORCPT + 99 others); Sat, 12 Sep 2020 23:59:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgIMD7w (ORCPT ); Sat, 12 Sep 2020 23:59:52 -0400 Received: from mail-oi1-x243.google.com (mail-oi1-x243.google.com [IPv6:2607:f8b0:4864:20::243]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 72D9CC061573 for ; Sat, 12 Sep 2020 20:59:51 -0700 (PDT) Received: by mail-oi1-x243.google.com with SMTP id c13so13930130oiy.6 for ; Sat, 12 Sep 2020 20:59:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Axj7dqz+5SFuOgGcn5J7uk7r49/6rAWVqjS9AY/4xjo=; b=PUsN0kvyna8jAT51+xAbJn+ImY6unubCDQJ13WW3fvrZzoWH8FTPOB4Q72d46Rv5+h fZSkchlIEGLg/yn43axTQ23k344+xpXvubbUCVLfxjysdnHaUrbMgMU6Pbn1LQdppOlo 3DTqfyD2la17+RyZDLErU8xi3fQH9Sgl5H2M4kYQaDr6yzodkbb48wAX8UP6Vjnzkyu6 rbXjaV/Gm5/P4RxbFEiOYkWqSiVF4RMFCUvNomgdqVk8kjcsov33AMWTOCwYuBYmcBao emK0I7e8Ex+laiuvCOKU0sqTgRuPibFMc6IiVYuCyuOSvnmJpOU+Co8DLkdvAR40JSp1 UFuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Axj7dqz+5SFuOgGcn5J7uk7r49/6rAWVqjS9AY/4xjo=; b=jpbJj+pEzFtf5njZ0iwllrVl0KSqM3tHOo2ZSz2ge09Gn03+ODi/YwFhVi30gf4CgD IIqvIRajMUxvdZJbuBJjpykTR3i5qQPbjRpLW+OGyxZSSwU2ExY3pi6gwafi7lCbirk9 W4xuI2gRVQzQ+fdk36Ubi2CqzgLO5ZqogS/X6rmCnMQm+cLfD/SsWvYe4auJ9Q/gsbDR r+VoNYRD2WbDY4LjZLba05tw+sLvyrGOVbDNSmZdWD59MueG6qAjbcDi8LqHptthOFw6 TJVg2d/fiS4akvjSKsw93N46aEI1L/VnjHZRXwKYLegTSWD2P97uqUi9et1WiB2vJvlH JYhg== X-Gm-Message-State: AOAM5335aqULxJoEJ94x2oV2N/w3L9oPLVt0jErfm9O1I+LSaVmwHsSL oaLBdhHbL8YAtEO5lt7uKLy8T9gCcWNlbV2BbRQ6Z1K2dNs= X-Received: by 2002:aca:aa84:: with SMTP id t126mr5462951oie.5.1599969591226; Sat, 12 Sep 2020 20:59:51 -0700 (PDT) MIME-Version: 1.0 References: <20200910054203.525420-1-aubrey.li@intel.com> <20200910054203.525420-2-aubrey.li@intel.com> In-Reply-To: <20200910054203.525420-2-aubrey.li@intel.com> From: Jiang Biao Date: Sun, 13 Sep 2020 11:59:40 +0800 Message-ID: Subject: Re: [RFC PATCH v1 1/1] sched/fair: select idle cpu from idle cpumask in sched domain To: Aubrey Li Cc: Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Tim Chen , linux-kernel , Aubrey Li Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Aubrey On Fri, 11 Sep 2020 at 23:48, Aubrey Li wrote: > > Added idle cpumask to track idle cpus in sched domain. When a CPU > enters idle, its corresponding bit in the idle cpumask will be set, > and when the CPU exits idle, its bit will be cleared. > > When a task wakes up to select an idle cpu, scanning idle cpumask > has low cost than scanning all the cpus in last level cache domain, > especially when the system is heavily loaded. > > Signed-off-by: Aubrey Li > --- > include/linux/sched/topology.h | 13 +++++++++++++ > kernel/sched/fair.c | 4 +++- > kernel/sched/topology.c | 2 +- > 3 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h > index fb11091129b3..43a641d26154 100644 > --- a/include/linux/sched/topology.h > +++ b/include/linux/sched/topology.h > @@ -65,8 +65,21 @@ struct sched_domain_shared { > atomic_t ref; > atomic_t nr_busy_cpus; > int has_idle_cores; > + /* > + * Span of all idle CPUs in this domain. > + * > + * NOTE: this field is variable length. (Allocated dynamically > + * by attaching extra space to the end of the structure, > + * depending on how many CPUs the kernel has booted up with) > + */ > + unsigned long idle_cpus_span[]; > }; > > +static inline struct cpumask *sds_idle_cpus(struct sched_domain_shared *sds) > +{ > + return to_cpumask(sds->idle_cpus_span); > +} > + > struct sched_domain { > /* These fields must be setup */ > struct sched_domain __rcu *parent; /* top domain must be null terminated */ > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 6b3b59cc51d6..3b6f8a3589be 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -6136,7 +6136,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t > > time = cpu_clock(this); > > - cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr); > + cpumask_and(cpus, sds_idle_cpus(sd->shared), p->cpus_ptr); Is the sds_idle_cpus() always empty if nohz=off? Do we need to initialize the idle_cpus_span with sched_domain_span(sd)? > > for_each_cpu_wrap(cpu, cpus, target) { > if (!--nr) > @@ -10182,6 +10182,7 @@ static void set_cpu_sd_state_busy(int cpu) > sd->nohz_idle = 0; > > atomic_inc(&sd->shared->nr_busy_cpus); > + cpumask_clear_cpu(cpu, sds_idle_cpus(sd->shared)); > unlock: > rcu_read_unlock(); > } > @@ -10212,6 +10213,7 @@ static void set_cpu_sd_state_idle(int cpu) > sd->nohz_idle = 1; > > atomic_dec(&sd->shared->nr_busy_cpus); > + cpumask_set_cpu(cpu, sds_idle_cpus(sd->shared)); This only works when entering/exiting tickless mode? :) Why not update idle_cpus_span during tick_nohz_idle_enter()/exit()? Thx. Regards, Jiang > unlock: > rcu_read_unlock(); > } > diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c > index 9079d865a935..92d0aeef86bf 100644 > --- a/kernel/sched/topology.c > +++ b/kernel/sched/topology.c > @@ -1769,7 +1769,7 @@ static int __sdt_alloc(const struct cpumask *cpu_map) > > *per_cpu_ptr(sdd->sd, j) = sd; > > - sds = kzalloc_node(sizeof(struct sched_domain_shared), > + sds = kzalloc_node(sizeof(struct sched_domain_shared) + cpumask_size(), > GFP_KERNEL, cpu_to_node(j)); > if (!sds) > return -ENOMEM; > -- > 2.25.1 >