From: Dario Faggioli <dario.faggioli@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Juergen Gross <jgross@suse.com>,
George Dunlap <george.dunlap@eu.citrix.com>,
Robert VanVossen <robert.vanvossen@dornerworks.com>,
Josh Whitehead <josh.whitehead@dornerworks.com>,
Meng Xu <mengxu@cis.upenn.edu>, Jan Beulich <JBeulich@suse.com>
Subject: [PATCH 03/16] xen: sched: make implementing .alloc_pdata optional
Date: Fri, 18 Mar 2016 20:04:16 +0100 [thread overview]
Message-ID: <20160318190416.8117.57233.stgit@Solace.station> (raw)
In-Reply-To: <20160318185524.8117.74837.stgit@Solace.station>
The .alloc_pdata scheduler hook must, before this change,
be implemented by all schedulers --even those ones that
don't need to allocate anything.
Make it possible to just use the SCHED_OP(), like for
the other hooks, by using ERR_PTR() and IS_ERR() for
error reporting. This:
- makes NULL a variant of success;
- allows for errors other than ENOMEM to be properly
communicated (if ever necessary).
This, in turn, means that schedulers not needing to
allocate any per-pCPU data, can avoid implementing the
hook. In fact, the artificial implementation of
.alloc_pdata in the ARINC653 is removed (and, while there,
nuke .free_pdata too, as it is equally useless).
Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
---
Cc: George Dunlap <george.dunlap@eu.citrix.com>
Cc: Robert VanVossen <robert.vanvossen@dornerworks.com>
Cc: Josh Whitehead <josh.whitehead@dornerworks.com>
Cc: Meng Xu <mengxu@cis.upenn.edu>
Cc: Jan Beulich <JBeulich@suse.com>
Cc: Juergen Gross <jgross@suse.com>
---
Changes from v1:
* use IS_ERR() and friends to deal with the return value
of alloc_pdata, as suggested during review.
---
xen/common/sched_arinc653.c | 31 -------------------------------
xen/common/sched_credit.c | 4 ++--
xen/common/sched_credit2.c | 2 +-
xen/common/sched_rt.c | 7 +++----
xen/common/schedule.c | 18 ++++++++----------
xen/include/xen/sched-if.h | 1 +
6 files changed, 15 insertions(+), 48 deletions(-)
diff --git a/xen/common/sched_arinc653.c b/xen/common/sched_arinc653.c
index 8a11a2f..b79fcdf 100644
--- a/xen/common/sched_arinc653.c
+++ b/xen/common/sched_arinc653.c
@@ -456,34 +456,6 @@ a653sched_free_vdata(const struct scheduler *ops, void *priv)
}
/**
- * This function allocates scheduler-specific data for a physical CPU
- *
- * We do not actually make use of any per-CPU data but the hypervisor expects
- * a non-NULL return value
- *
- * @param ops Pointer to this instance of the scheduler structure
- *
- * @return Pointer to the allocated data
- */
-static void *
-a653sched_alloc_pdata(const struct scheduler *ops, int cpu)
-{
- /* return a non-NULL value to keep schedule.c happy */
- return SCHED_PRIV(ops);
-}
-
-/**
- * This function frees scheduler-specific data for a physical CPU
- *
- * @param ops Pointer to this instance of the scheduler structure
- */
-static void
-a653sched_free_pdata(const struct scheduler *ops, void *pcpu, int cpu)
-{
- /* nop */
-}
-
-/**
* This function allocates scheduler-specific data for a domain
*
* We do not actually make use of any per-domain data but the hypervisor
@@ -737,9 +709,6 @@ static const struct scheduler sched_arinc653_def = {
.free_vdata = a653sched_free_vdata,
.alloc_vdata = a653sched_alloc_vdata,
- .free_pdata = a653sched_free_pdata,
- .alloc_pdata = a653sched_alloc_pdata,
-
.free_domdata = a653sched_free_domdata,
.alloc_domdata = a653sched_alloc_domdata,
diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c
index 305889a..288749f 100644
--- a/xen/common/sched_credit.c
+++ b/xen/common/sched_credit.c
@@ -532,12 +532,12 @@ csched_alloc_pdata(const struct scheduler *ops, int cpu)
/* Allocate per-PCPU info */
spc = xzalloc(struct csched_pcpu);
if ( spc == NULL )
- return NULL;
+ return ERR_PTR(-ENOMEM);
if ( !alloc_cpumask_var(&spc->balance_mask) )
{
xfree(spc);
- return NULL;
+ return ERR_PTR(-ENOMEM);
}
spin_lock_irqsave(&prv->lock, flags);
diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c
index 7ddad38..36dc9ee 100644
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -2044,7 +2044,7 @@ csched2_alloc_pdata(const struct scheduler *ops, int cpu)
printk("%s: cpu %d not online yet, deferring initializatgion\n",
__func__, cpu);
- return (void *)1;
+ return NULL;
}
static void
diff --git a/xen/common/sched_rt.c b/xen/common/sched_rt.c
index d98bfb6..ac8019f 100644
--- a/xen/common/sched_rt.c
+++ b/xen/common/sched_rt.c
@@ -665,7 +665,7 @@ rt_alloc_pdata(const struct scheduler *ops, int cpu)
spin_unlock_irqrestore(old_lock, flags);
if ( !alloc_cpumask_var(&_cpumask_scratch[cpu]) )
- return NULL;
+ return ERR_PTR(-ENOMEM);
if ( prv->repl_timer == NULL )
{
@@ -673,13 +673,12 @@ rt_alloc_pdata(const struct scheduler *ops, int cpu)
prv->repl_timer = xzalloc(struct timer);
if ( prv->repl_timer == NULL )
- return NULL;
+ return ERR_PTR(-ENOMEM);
init_timer(prv->repl_timer, repl_timer_handler, (void *)ops, cpu);
}
- /* 1 indicates alloc. succeed in schedule.c */
- return (void *)1;
+ return NULL;
}
static void
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index 0627eb5..1adc0e2 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -1491,9 +1491,9 @@ static int cpu_schedule_up(unsigned int cpu)
if ( idle_vcpu[cpu] == NULL )
return -ENOMEM;
- if ( (ops.alloc_pdata != NULL) &&
- ((sd->sched_priv = ops.alloc_pdata(&ops, cpu)) == NULL) )
- return -ENOMEM;
+ sd->sched_priv = SCHED_OP(&ops, alloc_pdata, cpu);
+ if ( IS_ERR(sd->sched_priv) )
+ return PTR_ERR(sd->sched_priv);
return 0;
}
@@ -1503,8 +1503,7 @@ static void cpu_schedule_down(unsigned int cpu)
struct schedule_data *sd = &per_cpu(schedule_data, cpu);
struct scheduler *sched = per_cpu(scheduler, cpu);
- if ( sd->sched_priv != NULL )
- SCHED_OP(sched, free_pdata, sd->sched_priv, cpu);
+ SCHED_OP(sched, free_pdata, sd->sched_priv, cpu);
SCHED_OP(sched, free_vdata, idle_vcpu[cpu]->sched_priv);
idle_vcpu[cpu]->sched_priv = NULL;
@@ -1599,9 +1598,8 @@ void __init scheduler_init(void)
idle_domain->max_vcpus = nr_cpu_ids;
if ( alloc_vcpu(idle_domain, 0, 0) == NULL )
BUG();
- if ( ops.alloc_pdata &&
- !(this_cpu(schedule_data).sched_priv = ops.alloc_pdata(&ops, 0)) )
- BUG();
+ this_cpu(schedule_data).sched_priv = SCHED_OP(&ops, alloc_pdata, 0);
+ BUG_ON(IS_ERR(this_cpu(schedule_data).sched_priv));
SCHED_OP(&ops, init_pdata, this_cpu(schedule_data).sched_priv, 0);
}
@@ -1644,8 +1642,8 @@ int schedule_cpu_switch(unsigned int cpu, struct cpupool *c)
idle = idle_vcpu[cpu];
ppriv = SCHED_OP(new_ops, alloc_pdata, cpu);
- if ( ppriv == NULL )
- return -ENOMEM;
+ if ( IS_ERR(ppriv) )
+ return PTR_ERR(ppriv);
SCHED_OP(new_ops, init_pdata, ppriv, cpu);
vpriv = SCHED_OP(new_ops, alloc_vdata, idle, idle->domain->sched_priv);
if ( vpriv == NULL )
diff --git a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h
index 70c08c6..560cba5 100644
--- a/xen/include/xen/sched-if.h
+++ b/xen/include/xen/sched-if.h
@@ -9,6 +9,7 @@
#define __XEN_SCHED_IF_H__
#include <xen/percpu.h>
+#include <xen/err.h>
/* A global pointer to the initial cpupool (POOL0). */
extern struct cpupool *cpupool0;
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-03-18 19:04 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-18 19:03 [PATCH 00/16] Fixes and improvement (including hard affinity!) for Credit2 Dario Faggioli
2016-03-18 19:04 ` [PATCH 01/16] xen: sched: fix locking when allocating an RTDS pCPU Dario Faggioli
2016-03-19 2:22 ` Meng Xu
2016-03-23 15:37 ` George Dunlap
2016-03-18 19:04 ` [PATCH 02/16] xen: sched: add .init_pdata hook to the scheduler interface Dario Faggioli
2016-03-22 8:08 ` Juergen Gross
2016-03-23 17:32 ` George Dunlap
2016-03-18 19:04 ` Dario Faggioli [this message]
2016-03-19 2:23 ` [PATCH 03/16] xen: sched: make implementing .alloc_pdata optional Meng Xu
2016-03-21 14:22 ` Jan Beulich
2016-03-23 17:36 ` George Dunlap
2016-03-24 9:43 ` Jan Beulich
2016-03-24 13:14 ` Dario Faggioli
2016-03-21 14:48 ` Juergen Gross
2016-03-21 15:07 ` Jan Beulich
2016-04-01 17:01 ` Dario Faggioli
2016-04-04 4:21 ` Juergen Gross
2016-04-04 6:13 ` Jan Beulich
2016-04-05 16:01 ` Dario Faggioli
2016-03-23 17:38 ` George Dunlap
2016-03-18 19:04 ` [PATCH 04/16] xen: sched: implement .init_pdata in all schedulers Dario Faggioli
2016-03-19 2:24 ` Meng Xu
2016-03-22 8:03 ` Juergen Gross
2016-03-23 17:46 ` George Dunlap
2016-03-18 19:04 ` [PATCH 05/16] xen: sched: move pCPU initialization in an helper Dario Faggioli
2016-03-23 17:51 ` George Dunlap
2016-03-23 18:09 ` George Dunlap
2016-03-24 13:21 ` Dario Faggioli
2016-03-18 19:04 ` [PATCH 06/16] xen: sched: prepare a .switch_sched hook for Credit1 Dario Faggioli
2016-03-18 19:04 ` [PATCH 07/16] xen: sched: prepare a .switch_sched hook for Credit2 Dario Faggioli
2016-03-18 19:04 ` [PATCH 08/16] " Dario Faggioli
2016-03-19 2:24 ` Meng Xu
2016-03-21 14:25 ` Jan Beulich
2016-03-18 19:05 ` [PATCH 09/16] xen: sched: close potential races when switching scheduler to CPUs Dario Faggioli
2016-03-19 2:25 ` Meng Xu
2016-03-23 19:05 ` George Dunlap
2016-04-05 16:26 ` Dario Faggioli
2016-04-06 15:51 ` Dario Faggioli
2016-03-24 12:14 ` George Dunlap
2016-04-05 17:37 ` Dario Faggioli
2016-04-06 16:21 ` Dario Faggioli
2016-03-18 19:05 ` [PATCH 10/16] xen: sched: improve credit2 bootparams' scope, placement and signedness Dario Faggioli
2016-03-21 14:51 ` Juergen Gross
2016-03-24 12:20 ` George Dunlap
2016-03-18 19:05 ` [PATCH 11/16] xen: sched: on Credit2, don't reprogram the timer if idle Dario Faggioli
2016-03-24 15:03 ` George Dunlap
2016-03-18 19:05 ` [PATCH 12/16] xen: sched: fix per-socket runqueue creation in credit2 Dario Faggioli
2016-03-24 12:24 ` George Dunlap
2016-03-18 19:05 ` [PATCH 13/16] xen: sched: allow for choosing credit2 runqueues configuration at boot Dario Faggioli
2016-03-22 7:46 ` Juergen Gross
2016-03-24 12:36 ` George Dunlap
2016-03-18 19:05 ` [PATCH 14/16] xen: sched: per-core runqueues as default in credit2 Dario Faggioli
2016-03-24 12:37 ` George Dunlap
2016-03-18 19:06 ` [PATCH 15/16] xen: sched: scratch space for cpumasks on Credit2 Dario Faggioli
2016-03-18 19:27 ` Andrew Cooper
2016-03-24 12:44 ` George Dunlap
2016-03-24 12:56 ` Andrew Cooper
2016-03-24 13:10 ` Dario Faggioli
2016-03-18 19:06 ` [PATCH 16/16] xen: sched: implement vcpu hard affinity in Credit2 Dario Faggioli
2016-03-24 15:42 ` George Dunlap
2016-04-05 16:50 ` Dario Faggioli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160318190416.8117.57233.stgit@Solace.station \
--to=dario.faggioli@citrix.com \
--cc=JBeulich@suse.com \
--cc=george.dunlap@eu.citrix.com \
--cc=jgross@suse.com \
--cc=josh.whitehead@dornerworks.com \
--cc=mengxu@cis.upenn.edu \
--cc=robert.vanvossen@dornerworks.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.