From patchwork Tue May 28 10:32:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juergen Gross X-Patchwork-Id: 10964619 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4B25992A for ; Tue, 28 May 2019 10:35:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3773126E4F for ; Tue, 28 May 2019 10:35:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 27D3827528; Tue, 28 May 2019 10:35:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 306BC2848B for ; Tue, 28 May 2019 10:35:01 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hVZQ8-0004gx-FJ; Tue, 28 May 2019 10:33:28 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hVZQ5-0004c0-NG for xen-devel@lists.xenproject.org; Tue, 28 May 2019 10:33:25 +0000 X-Inumbo-ID: 03838b16-8134-11e9-957d-9fa688e50d06 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 03838b16-8134-11e9-957d-9fa688e50d06; Tue, 28 May 2019 10:33:21 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 905EAB02F; Tue, 28 May 2019 10:33:18 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Tue, 28 May 2019 12:32:22 +0200 Message-Id: <20190528103313.1343-10-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190528103313.1343-1-jgross@suse.com> References: <20190528103313.1343-1-jgross@suse.com> Subject: [Xen-devel] [PATCH 09/60] xen/sched: let pick_cpu return a scheduler resource X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Tim Deegan , Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Robert VanVossen , Dario Faggioli , Julien Grall , Josh Whitehead , Meng Xu , Jan Beulich MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Instead of returning a physical cpu number let pick_cpu() return a scheduler resource instead. Rename pick_cpu() to pick_resource() to reflect that change. Signed-off-by: Juergen Gross Reviewed-by: Dario Faggioli --- xen/common/sched_arinc653.c | 12 ++++++------ xen/common/sched_credit.c | 16 ++++++++-------- xen/common/sched_credit2.c | 22 +++++++++++----------- xen/common/sched_null.c | 20 +++++++++++--------- xen/common/sched_rt.c | 18 +++++++++--------- xen/common/schedule.c | 10 ++++++---- xen/include/xen/perfc_defn.h | 2 +- xen/include/xen/sched-if.h | 12 ++++++------ 8 files changed, 58 insertions(+), 54 deletions(-) diff --git a/xen/common/sched_arinc653.c b/xen/common/sched_arinc653.c index 840891318e..383df750b0 100644 --- a/xen/common/sched_arinc653.c +++ b/xen/common/sched_arinc653.c @@ -601,15 +601,15 @@ a653sched_do_schedule( } /** - * Xen scheduler callback function to select a CPU for the VCPU to run on + * Xen scheduler callback function to select a resource for the VCPU to run on * * @param ops Pointer to this instance of the scheduler structure * @param unit Pointer to struct sched_unit * - * @return Number of selected physical CPU + * @return Scheduler resource to run on */ -static int -a653sched_pick_cpu(const struct scheduler *ops, struct sched_unit *unit) +static struct sched_resource * +a653sched_pick_resource(const struct scheduler *ops, struct sched_unit *unit) { struct vcpu *vc = unit->vcpu; cpumask_t *online; @@ -627,7 +627,7 @@ a653sched_pick_cpu(const struct scheduler *ops, struct sched_unit *unit) || (cpu >= nr_cpu_ids) ) cpu = vc->processor; - return cpu; + return get_sched_res(cpu); } /** @@ -720,7 +720,7 @@ static const struct scheduler sched_arinc653_def = { .do_schedule = a653sched_do_schedule, - .pick_cpu = a653sched_pick_cpu, + .pick_resource = a653sched_pick_resource, .switch_sched = a653_switch_sched, diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index 0cd139ec29..7f7596b3bf 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -858,8 +858,8 @@ _csched_cpu_pick(const struct scheduler *ops, struct vcpu *vc, bool_t commit) return cpu; } -static int -csched_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) +static struct sched_resource * +csched_res_pick(const struct scheduler *ops, struct sched_unit *unit) { struct vcpu *vc = unit->vcpu; struct csched_vcpu *svc = CSCHED_VCPU(vc); @@ -872,7 +872,7 @@ csched_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) * get boosted, which we don't deserve as we are "only" migrating. */ set_bit(CSCHED_FLAG_VCPU_MIGRATING, &svc->flags); - return _csched_cpu_pick(ops, vc, 1); + return get_sched_res(_csched_cpu_pick(ops, vc, 1)); } static inline void @@ -972,7 +972,7 @@ csched_vcpu_acct(struct csched_private *prv, unsigned int cpu) /* * If it's been active a while, check if we'd be better off * migrating it to run elsewhere (see multi-core and multi-thread - * support in csched_cpu_pick()). + * support in csched_res_pick()). */ new_cpu = _csched_cpu_pick(ops, current, 0); @@ -1027,11 +1027,11 @@ csched_unit_insert(const struct scheduler *ops, struct sched_unit *unit) BUG_ON( is_idle_vcpu(vc) ); - /* csched_cpu_pick() looks in vc->processor's runq, so we need the lock. */ + /* csched_res_pick() looks in vc->processor's runq, so we need the lock. */ lock = vcpu_schedule_lock_irq(vc); - vc->processor = csched_cpu_pick(ops, unit); - unit->res = get_sched_res(vc->processor); + unit->res = csched_res_pick(ops, unit); + vc->processor = unit->res->processor; spin_unlock_irq(lock); @@ -2282,7 +2282,7 @@ static const struct scheduler sched_credit_def = { .adjust_affinity= csched_aff_cntl, .adjust_global = csched_sys_cntl, - .pick_cpu = csched_cpu_pick, + .pick_resource = csched_res_pick, .do_schedule = csched_schedule, .dump_cpu_state = csched_dump_pcpu, diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c index c92a090905..b71802bba2 100644 --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -625,9 +625,9 @@ static inline bool has_cap(const struct csched2_vcpu *svc) * runq, _always_ happens by means of tickling: * - when a vcpu wakes up, it calls csched2_unit_wake(), which calls * runq_tickle(); - * - when a migration is initiated in schedule.c, we call csched2_cpu_pick(), + * - when a migration is initiated in schedule.c, we call csched2_res_pick(), * csched2_unit_migrate() (which calls migrate()) and csched2_unit_wake(). - * csched2_cpu_pick() looks for the least loaded runq and return just any + * csched2_res_pick() looks for the least loaded runq and return just any * of its processors. Then, csched2_unit_migrate() just moves the vcpu to * the chosen runq, and it is again runq_tickle(), called by * csched2_unit_wake() that actually decides what pcpu to use within the @@ -676,7 +676,7 @@ void smt_idle_mask_clear(unsigned int cpu, cpumask_t *mask) } /* - * In csched2_cpu_pick(), it may not be possible to actually look at remote + * In csched2_res_pick(), it may not be possible to actually look at remote * runqueues (the trylock-s on their spinlocks can fail!). If that happens, * we pick, in order of decreasing preference: * 1) svc's current pcpu, if it is part of svc's soft affinity; @@ -2201,8 +2201,8 @@ csched2_context_saved(const struct scheduler *ops, struct sched_unit *unit) } #define MAX_LOAD (STIME_MAX) -static int -csched2_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) +static struct sched_resource * +csched2_res_pick(const struct scheduler *ops, struct sched_unit *unit) { struct csched2_private *prv = csched2_priv(ops); struct vcpu *vc = unit->vcpu; @@ -2214,7 +2214,7 @@ csched2_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) ASSERT(!cpumask_empty(&prv->active_queues)); - SCHED_STAT_CRANK(pick_cpu); + SCHED_STAT_CRANK(pick_resource); /* Locking: * - Runqueue lock of vc->processor is already locked @@ -2423,7 +2423,7 @@ csched2_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) (unsigned char *)&d); } - return new_cpu; + return get_sched_res(new_cpu); } /* Working state of the load-balancing algorithm */ @@ -3120,11 +3120,11 @@ csched2_unit_insert(const struct scheduler *ops, struct sched_unit *unit) ASSERT(!is_idle_vcpu(vc)); ASSERT(list_empty(&svc->runq_elem)); - /* csched2_cpu_pick() expects the pcpu lock to be held */ + /* csched2_res_pick() expects the pcpu lock to be held */ lock = vcpu_schedule_lock_irq(vc); - vc->processor = csched2_cpu_pick(ops, unit); - unit->res = get_sched_res(vc->processor); + unit->res = csched2_res_pick(ops, unit); + vc->processor = unit->res->processor; spin_unlock_irq(lock); @@ -4103,7 +4103,7 @@ static const struct scheduler sched_credit2_def = { .adjust_affinity= csched2_aff_cntl, .adjust_global = csched2_sys_cntl, - .pick_cpu = csched2_cpu_pick, + .pick_resource = csched2_res_pick, .migrate = csched2_unit_migrate, .do_schedule = csched2_schedule, .context_saved = csched2_context_saved, diff --git a/xen/common/sched_null.c b/xen/common/sched_null.c index 7c01d0272d..1ea8643a9c 100644 --- a/xen/common/sched_null.c +++ b/xen/common/sched_null.c @@ -269,9 +269,11 @@ static void null_free_domdata(const struct scheduler *ops, void *data) * * So this is not part of any hot path. */ -static unsigned int pick_cpu(struct null_private *prv, struct vcpu *v) +static struct sched_resource * +pick_res(struct null_private *prv, struct sched_unit *unit) { unsigned int bs; + struct vcpu *v = unit->vcpu; unsigned int cpu = v->processor, new_cpu; cpumask_t *cpus = cpupool_domain_cpumask(v->domain); @@ -335,7 +337,7 @@ static unsigned int pick_cpu(struct null_private *prv, struct vcpu *v) __trace_var(TRC_SNULL_PICKED_CPU, 1, sizeof(d), &d); } - return new_cpu; + return get_sched_res(new_cpu); } static void vcpu_assign(struct null_private *prv, struct vcpu *v, @@ -421,8 +423,8 @@ static void null_unit_insert(const struct scheduler *ops, lock = vcpu_schedule_lock_irq(v); retry: - cpu = v->processor = pick_cpu(prv, v); - unit->res = get_sched_res(cpu); + unit->res = pick_res(prv, unit); + cpu = v->processor = unit->res->processor; spin_unlock(lock); @@ -578,11 +580,11 @@ static void null_unit_sleep(const struct scheduler *ops, SCHED_STAT_CRANK(vcpu_sleep); } -static int null_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) +static struct sched_resource * +null_res_pick(const struct scheduler *ops, struct sched_unit *unit) { - struct vcpu *v = unit->vcpu; - ASSERT(!is_idle_vcpu(v)); - return pick_cpu(null_priv(ops), v); + ASSERT(!is_idle_vcpu(unit->vcpu)); + return pick_res(null_priv(ops), unit); } static void null_unit_migrate(const struct scheduler *ops, @@ -901,7 +903,7 @@ const struct scheduler sched_null_def = { .wake = null_unit_wake, .sleep = null_unit_sleep, - .pick_cpu = null_cpu_pick, + .pick_resource = null_res_pick, .migrate = null_unit_migrate, .do_schedule = null_schedule, diff --git a/xen/common/sched_rt.c b/xen/common/sched_rt.c index 715a7cd218..b80bc02357 100644 --- a/xen/common/sched_rt.c +++ b/xen/common/sched_rt.c @@ -632,12 +632,12 @@ replq_reinsert(const struct scheduler *ops, struct rt_vcpu *svc) } /* - * Pick a valid CPU for the vcpu vc - * Valid CPU of a vcpu is intesection of vcpu's affinity - * and available cpus + * Pick a valid resource for the vcpu vc + * Valid resource of a vcpu is intesection of vcpu's affinity + * and available resources */ -static int -rt_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) +static struct sched_resource * +rt_res_pick(const struct scheduler *ops, struct sched_unit *unit) { struct vcpu *vc = unit->vcpu; cpumask_t cpus; @@ -652,7 +652,7 @@ rt_cpu_pick(const struct scheduler *ops, struct sched_unit *unit) : cpumask_cycle(vc->processor, &cpus); ASSERT( !cpumask_empty(&cpus) && cpumask_test_cpu(cpu, &cpus) ); - return cpu; + return get_sched_res(cpu); } /* @@ -893,8 +893,8 @@ rt_unit_insert(const struct scheduler *ops, struct sched_unit *unit) BUG_ON( is_idle_vcpu(vc) ); /* This is safe because vc isn't yet being scheduled */ - vc->processor = rt_cpu_pick(ops, unit); - unit->res = get_sched_res(vc->processor); + unit->res = rt_res_pick(ops, unit); + vc->processor = unit->res->processor; lock = vcpu_schedule_lock_irq(vc); @@ -1563,7 +1563,7 @@ static const struct scheduler sched_rtds_def = { .adjust = rt_dom_cntl, - .pick_cpu = rt_cpu_pick, + .pick_resource = rt_res_pick, .do_schedule = rt_schedule, .sleep = rt_unit_sleep, .wake = rt_unit_wake, diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 32ce248f24..5dfdaaece2 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -687,7 +687,8 @@ static void vcpu_migrate_finish(struct vcpu *v) break; /* Select a new CPU. */ - new_cpu = sched_pick_cpu(vcpu_scheduler(v), v->sched_unit); + new_cpu = sched_pick_resource(vcpu_scheduler(v), + v->sched_unit)->processor; if ( (new_lock == per_cpu(schedule_data, new_cpu).schedule_lock) && cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) ) break; @@ -793,8 +794,9 @@ void restore_vcpu_affinity(struct domain *d) v->sched_unit->res = get_sched_res(v->processor); lock = vcpu_schedule_lock_irq(v); - v->processor = sched_pick_cpu(vcpu_scheduler(v), v->sched_unit); - v->sched_unit->res = get_sched_res(v->processor); + v->sched_unit->res = sched_pick_resource(vcpu_scheduler(v), + v->sched_unit); + v->processor = v->sched_unit->res->processor; spin_unlock_irq(lock); if ( old_cpu != v->processor ) @@ -1800,7 +1802,7 @@ void __init scheduler_init(void) sched_test_func(init); sched_test_func(deinit); - sched_test_func(pick_cpu); + sched_test_func(pick_resource); sched_test_func(alloc_vdata); sched_test_func(free_vdata); sched_test_func(switch_sched); diff --git a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h index ef6f86b91e..1ad4384080 100644 --- a/xen/include/xen/perfc_defn.h +++ b/xen/include/xen/perfc_defn.h @@ -69,7 +69,7 @@ PERFCOUNTER(migrate_on_runq, "csched2: migrate_on_runq") PERFCOUNTER(migrate_no_runq, "csched2: migrate_no_runq") PERFCOUNTER(runtime_min_timer, "csched2: runtime_min_timer") PERFCOUNTER(runtime_max_timer, "csched2: runtime_max_timer") -PERFCOUNTER(pick_cpu, "csched2: pick_cpu") +PERFCOUNTER(pick_resource, "csched2: pick_resource") PERFCOUNTER(need_fallback_cpu, "csched2: need_fallback_cpu") PERFCOUNTER(migrated, "csched2: migrated") PERFCOUNTER(migrate_resisted, "csched2: migrate_resisted") diff --git a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h index bc7f223aad..dc149bc102 100644 --- a/xen/include/xen/sched-if.h +++ b/xen/include/xen/sched-if.h @@ -189,8 +189,8 @@ struct scheduler { struct task_slice (*do_schedule) (const struct scheduler *, s_time_t, bool_t tasklet_work_scheduled); - int (*pick_cpu) (const struct scheduler *, - struct sched_unit *); + struct sched_resource * (*pick_resource) (const struct scheduler *, + struct sched_unit *); void (*migrate) (const struct scheduler *, struct sched_unit *, unsigned int); int (*adjust) (const struct scheduler *, struct domain *, @@ -351,14 +351,14 @@ static inline void sched_migrate(const struct scheduler *s, else { unit->vcpu->processor = cpu; - unit->res = per_cpu(sched_res, cpu); + unit->res = get_sched_res(cpu); } } -static inline int sched_pick_cpu(const struct scheduler *s, - struct sched_unit *unit) +static inline struct sched_resource *sched_pick_resource( + const struct scheduler *s, struct sched_unit *unit) { - return s->pick_cpu(s, unit); + return s->pick_resource(s, unit); } static inline void sched_adjust_affinity(const struct scheduler *s,