Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp1010368ybz; Thu, 16 Apr 2020 00:46:18 -0700 (PDT) X-Google-Smtp-Source: APiQypJORIEWSz3HbESHYPZAjehVjjjXCdlBMqcAk+jbCZUz53NgIfLGlqToH7npEWOiJze1lM0g X-Received: by 2002:a05:6402:1766:: with SMTP id da6mr1166667edb.119.1587023178661; Thu, 16 Apr 2020 00:46:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587023178; cv=none; d=google.com; s=arc-20160816; b=0pgs6Hoy7KZvGZ+WiNmAtvEQzxtU5IOTllyojsDggsdrtXJtEzEmWhSmJf8iP8yL+Q XVCGZF/IX3R3dSmoXJZfJ7Hchdh/wxBR65VpgkxyHSCt9dkcfLMI+heHB5yp1S71TS0F 5OLPwusjEmVwblMTHifJ+E0M0o3wKYyIZaqm7D1BX93RKz44zeUkb6Jjm9WEGaEivZR5 abbXt+f8rX2rqFnMPQQNdIrLHy4NswisFQA//UpQkt4RciDQVWBOztmbgT1p1om0OVk9 p3wJE6jpRhFxR7dBX5e9YolRaIjIXeeHIBmIY/0HHZThciVZBOrYZGMHW/YjHE1k8ABO disw== 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=0VdHAofzjKiou8tV1+dVPXOIqJxr7GWJIpgp9ALy8M0=; b=ddg4sp47mtH2gTLE8TgjWzUTUPIA6fnXDTHyL8EGjgH3+3I1kNcE/zbfVlI/BxceuO uU2JVq8TurA03cWK4t+nzrE5ELZfebb6QjZ6H5G+KnJWVkeECaPskgjwW7XCHncGLSvt or4F4/Orxsi2zekLWuTdYacxdcIGWmKkP0mZTwnBRP2nEQCPFecQym0kGk8Bm3igzvLW /CKeF7/+WZCwjLis39oAgI5vwG+eKVWqbRGqdBHYAEebMYGCrF4DpO29w5R8Eaqr3Qaz uXC3KN9tsSG4HKhfBRBee/L58DJYQOUdmmitCJCQLZW7/WnfeaflnVKFY9XZuQ3AUe5x ekpg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=jDbYjq5b; 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=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v11si4694879edy.483.2020.04.16.00.45.55; Thu, 16 Apr 2020 00:46:18 -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=@linaro.org header.s=google header.b=jDbYjq5b; 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=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439506AbgDPHmz (ORCPT + 99 others); Thu, 16 Apr 2020 03:42:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S2439328AbgDPHmw (ORCPT ); Thu, 16 Apr 2020 03:42:52 -0400 Received: from mail-lj1-x243.google.com (mail-lj1-x243.google.com [IPv6:2a00:1450:4864:20::243]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8845C061A0C for ; Thu, 16 Apr 2020 00:42:50 -0700 (PDT) Received: by mail-lj1-x243.google.com with SMTP id m8so6761581lji.1 for ; Thu, 16 Apr 2020 00:42:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=0VdHAofzjKiou8tV1+dVPXOIqJxr7GWJIpgp9ALy8M0=; b=jDbYjq5baULpkmlwYfNz04Hm25k7Oz/CmgHWCD2pXmOIq+5K3oI6VQP5tHdhuyvxHP n+GFJnRhBwXUqUrs6i11RiKm+iP6F5Q0JXmd2Zu588smMUNECixDKRzz9lzC5q+WSQjd Mum3upwVMLpZNRwM5/iBdN2l3ewfngYCWgX8w4jya91kY4GWNZ9Gu9P7O7SjcJe72Y+i BP+qE4VY1CnGA1JZgSMXHz3bGw5QgsiiPqxbcy+9WPEuo7/R1xsZCyV+DCChZpNQs017 VArY8DO/jLV85cyBHTMJ/V61hbv7e94GzMUAxPjh7Y+A7vs1eteNKg941idxNo5AwPUW WF7w== 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=0VdHAofzjKiou8tV1+dVPXOIqJxr7GWJIpgp9ALy8M0=; b=rZcL3w2pB5/LgniGXJv9dKnUDUPVd7eSRAfLOCk06czV5Z7/x2wfWirwS6u6Qsa6qA k8PXXgaIm+6z/tkkuN7ieq9qIswvB8VNEmckLU+mLFHbvjykubOhejWkWsJhUJxHAw3X kGD3lFtMNQDpZSwu8CFPaPKUEESPntatstc2tFCQ9Jihxr21bsIcAWhUQhuaIwCPwXPh kmuQvwoIyICtAK5iZ1Rtqh5FwRDAUDcjDGY+BnIC1+1n5HBsy+lXc/jstnrGvt20k0UY 0PEJgCZ05DhQtB9maRe4X9O2eGxeLiCxdGqnkytFuvycJ1i5V6+kR/JLxK/dPIeqUs0q sbug== X-Gm-Message-State: AGi0PuaS8IIhDNG7yAJwYxbgg7Se3niO6a/XBcfd6j3lUuD7Vsen9ZQI hXwQgJ9W/bSz6gTEbqd/qfjO5DZoUxXyfVUkPrQASg== X-Received: by 2002:a2e:8046:: with SMTP id p6mr1618547ljg.21.1587022968469; Thu, 16 Apr 2020 00:42:48 -0700 (PDT) MIME-Version: 1.0 References: <20200415210512.805-1-valentin.schneider@arm.com> <20200415210512.805-7-valentin.schneider@arm.com> In-Reply-To: <20200415210512.805-7-valentin.schneider@arm.com> From: Vincent Guittot Date: Thu, 16 Apr 2020 09:42:36 +0200 Message-ID: Subject: Re: [PATCH v3 6/9] sched: Kill select_task_rq()'s sd_flag parameter To: Valentin Schneider Cc: linux-kernel , Ingo Molnar , Peter Zijlstra , Dietmar Eggemann , Ingo Molnar , Juri Lelli , Steven Rostedt 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 On Wed, 15 Apr 2020 at 23:05, Valentin Schneider wrote: > > Only select_task_rq_fair() uses that parameter to do an actual domain > search, other classes only care about what kind of wakeup is happening > (fork, exec, or "regular") and thus just translate the flag into a wakeup > type. > > WF_TTWU and WF_EXEC have just been added, use these along with WF_FORK to > encode the wakeup types we care about. This cleans up the API a > bit, but adds an extra conversion layer within select_task_rq_fair(). > > Cc: Ingo Molnar > Cc: Peter Zijlstra > Cc: Juri Lelli > Cc: Vincent Guittot > Cc: Dietmar Eggemann > Cc: Steven Rostedt > Signed-off-by: Valentin Schneider > --- > kernel/sched/core.c | 10 +++++----- > kernel/sched/deadline.c | 4 ++-- > kernel/sched/fair.c | 18 +++++++++++++++--- > kernel/sched/idle.c | 2 +- > kernel/sched/rt.c | 4 ++-- > kernel/sched/sched.h | 2 +- > kernel/sched/stop_task.c | 2 +- > 7 files changed, 27 insertions(+), 15 deletions(-) > > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 3a61a3b8eaa9..aea9badd397a 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -2094,12 +2094,12 @@ static int select_fallback_rq(int cpu, struct task_struct *p) > * The caller (fork, wakeup) owns p->pi_lock, ->cpus_ptr is stable. > */ > static inline > -int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags) > +int select_task_rq(struct task_struct *p, int cpu, int wake_flags) > { > lockdep_assert_held(&p->pi_lock); > > if (p->nr_cpus_allowed > 1) > - cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags); > + cpu = p->sched_class->select_task_rq(p, cpu, wake_flags); > else > cpu = cpumask_any(p->cpus_ptr); > > @@ -2612,7 +2612,7 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) > atomic_dec(&task_rq(p)->nr_iowait); > } > > - cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags); > + cpu = select_task_rq(p, p->wake_cpu, wake_flags | WF_TTWU); > if (task_cpu(p) != cpu) { > wake_flags |= WF_MIGRATED; > psi_ttwu_dequeue(p); > @@ -2945,7 +2945,7 @@ void wake_up_new_task(struct task_struct *p) > * as we're not fully set-up yet. > */ > p->recent_used_cpu = task_cpu(p); > - __set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0)); > + __set_task_cpu(p, select_task_rq(p, task_cpu(p), WF_FORK)); > #endif > rq = __task_rq_lock(p, &rf); > update_rq_clock(rq); > @@ -3486,7 +3486,7 @@ void sched_exec(void) > int dest_cpu; > > raw_spin_lock_irqsave(&p->pi_lock, flags); > - dest_cpu = p->sched_class->select_task_rq(p, task_cpu(p), SD_BALANCE_EXEC, 0); > + dest_cpu = p->sched_class->select_task_rq(p, task_cpu(p), WF_EXEC); > if (dest_cpu == smp_processor_id()) > goto unlock; > > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c > index 504d2f51b0d6..0e96b435c51b 100644 > --- a/kernel/sched/deadline.c > +++ b/kernel/sched/deadline.c > @@ -1601,12 +1601,12 @@ static void yield_task_dl(struct rq *rq) > static int find_later_rq(struct task_struct *task); > > static int > -select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags) > +select_task_rq_dl(struct task_struct *p, int cpu, int flags) > { > struct task_struct *curr; > struct rq *rq; > > - if (sd_flag != SD_BALANCE_WAKE) > + if (!(flags & WF_TTWU)) > goto out; > > rq = cpu_rq(cpu); > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 3d34b4e4060f..b0bf98e6798b 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -6611,7 +6611,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) > > /* > * select_task_rq_fair: Select target runqueue for the waking task in domains > - * that have the 'sd_flag' flag set. In practice, this is SD_BALANCE_WAKE, > + * that have the relevant SD flag set. In practice, this is SD_BALANCE_WAKE, > * SD_BALANCE_FORK, or SD_BALANCE_EXEC. > * > * Balances load by selecting the idlest CPU in the idlest group, or under > @@ -6622,13 +6622,25 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) > * preempt must be disabled. > */ > static int > -select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_flags) > +select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags) > { > + int sync = (wake_flags & WF_SYNC) && !(current->flags & PF_EXITING); > struct sched_domain *tmp, *sd = NULL; > int cpu = smp_processor_id(); > int new_cpu = prev_cpu; > int want_affine = 0; > - int sync = (wake_flags & WF_SYNC) && !(current->flags & PF_EXITING); > + int sd_flag; > + > + switch (wake_flags & (WF_TTWU | WF_FORK | WF_EXEC)) { You remove a function parameter, which was directly set with the right flag, but then you add a switch case to recreate this sd_flag internally. Not sure we can say that it's real benefit > + case WF_TTWU: > + sd_flag = SD_BALANCE_WAKE; > + break; > + case WF_FORK: > + sd_flag = SD_BALANCE_FORK; > + break; > + default: > + sd_flag = SD_BALANCE_EXEC; > + } > > if (sd_flag & SD_BALANCE_WAKE) { > record_wakee(p); > diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c > index b743bf38f08f..e9c6a27f0647 100644 > --- a/kernel/sched/idle.c > +++ b/kernel/sched/idle.c > @@ -367,7 +367,7 @@ void cpu_startup_entry(enum cpuhp_state state) > > #ifdef CONFIG_SMP > static int > -select_task_rq_idle(struct task_struct *p, int cpu, int sd_flag, int flags) > +select_task_rq_idle(struct task_struct *p, int cpu, int flags) > { > return task_cpu(p); /* IDLE tasks as never migrated */ > } > diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c > index df11d88c9895..88427ea0231b 100644 > --- a/kernel/sched/rt.c > +++ b/kernel/sched/rt.c > @@ -1426,14 +1426,14 @@ static void yield_task_rt(struct rq *rq) > static int find_lowest_rq(struct task_struct *task); > > static int > -select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags) > +select_task_rq_rt(struct task_struct *p, int cpu, int flags) > { > struct task_struct *curr; > struct rq *rq; > bool test; > > /* For anything but wake ups, just return the task_cpu */ > - if (sd_flag != SD_BALANCE_WAKE && sd_flag != SD_BALANCE_FORK) > + if (!(flags & (WF_TTWU | WF_FORK))) > goto out; > > rq = cpu_rq(cpu); > diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h > index f32c5fa229af..448f5d630544 100644 > --- a/kernel/sched/sched.h > +++ b/kernel/sched/sched.h > @@ -1767,7 +1767,7 @@ struct sched_class { > > #ifdef CONFIG_SMP > int (*balance)(struct rq *rq, struct task_struct *prev, struct rq_flags *rf); > - int (*select_task_rq)(struct task_struct *p, int task_cpu, int sd_flag, int flags); > + int (*select_task_rq)(struct task_struct *p, int task_cpu, int flags); > void (*migrate_task_rq)(struct task_struct *p, int new_cpu); > > void (*task_woken)(struct rq *this_rq, struct task_struct *task); > diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c > index 4c9e9975684f..4f061ddf8470 100644 > --- a/kernel/sched/stop_task.c > +++ b/kernel/sched/stop_task.c > @@ -11,7 +11,7 @@ > > #ifdef CONFIG_SMP > static int > -select_task_rq_stop(struct task_struct *p, int cpu, int sd_flag, int flags) > +select_task_rq_stop(struct task_struct *p, int cpu, int flags) > { > return task_cpu(p); /* stop tasks as never migrate */ > } > -- > 2.24.0 >