[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 07/12] xen: add domain specific parameter support
Add the framework for being able to define cpupool specific parameters. This includes the needed macros for defining a parameter and the minimal set of functions for doing parameter parsing. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- xen/common/cpupool.c | 10 ++++++++++ xen/common/kernel.c | 12 ++++++++++++ xen/common/sysctl.c | 14 ++++++++++++++ xen/include/xen/init.h | 23 +++++++++++++++++++++++ xen/include/xen/lib.h | 2 ++ xen/include/xen/sched.h | 1 + 6 files changed, 62 insertions(+) diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c index 1e8edcbd57..0a9f875602 100644 --- a/xen/common/cpupool.c +++ b/xen/common/cpupool.c @@ -808,6 +808,16 @@ static int __init cpupool_presmp_init(void) } presmp_initcall(cpupool_presmp_init); +int cpupool_check_parflags(void *instance, unsigned int flags) +{ + struct cpupool *c = instance; + + if ( !(flags & PARAM_FLAG_RUNTIME) && (c->n_dom != 0) ) + return -EBUSY; + + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/common/kernel.c b/xen/common/kernel.c index d0b3af1453..81155d5ebe 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -222,6 +222,13 @@ static const struct parse_data runtime_parse_data = { .end = __param_end, }; +static const struct parse_data cpupool_parse_data = { + .scope = SCOPE_CPUPOOL, + .start = __param_start, + .end = __param_end, + .check = cpupool_check_parflags, +}; + static const struct parse_data domain_parse_data = { .scope = SCOPE_DOMAIN, .start = __param_start, @@ -239,6 +246,11 @@ int runtime_parse(const char *line) return parse_params(line, &runtime_parse_data, NULL); } +int cpupool_param_parse(struct cpupool *c, const char *line) +{ + return parse_params(line, &cpupool_parse_data, c); +} + int domain_param_parse(struct domain *d, const char *line) { return parse_params(line, &domain_parse_data, d); diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index f10cd279f7..575248301e 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -499,6 +499,20 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) ret = op->u.set_parameter.instance ? -EINVAL : runtime_parse(params); break; + case XEN_SYSCTL_SETPAR_SCOPE_CPUPOOL: + { + struct cpupool *c; + + c = cpupool_get_by_id(op->u.set_parameter.instance); + if ( c == NULL ) + ret = -ESRCH; + else + { + ret = cpupool_param_parse(c, params); + cpupool_put(c); + } + break; + } default: ret = -EINVAL; break; diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h index 13cf5214b3..598ae0b5d4 100644 --- a/xen/include/xen/init.h +++ b/xen/include/xen/init.h @@ -54,6 +54,7 @@ #ifndef __ASSEMBLY__ +struct cpupool; struct domain; /* @@ -77,6 +78,7 @@ void do_initcalls(void); */ enum param_scope { SCOPE_GLOBAL, + SCOPE_CPUPOOL, SCOPE_DOMAIN }; @@ -96,6 +98,7 @@ struct kernel_param { union { void *var; int (*func)(const char *); + int (*func_cpupool)(const char *, struct cpupool *); int (*func_domain)(const char *, struct domain *); int (*call)(const char *, void *); } par; @@ -182,6 +185,26 @@ extern const struct kernel_param __param_start[], __param_end[]; string_param(_name, _var); \ string_runtime_only_param(_name, _var) +#define custom_cpupool_param(_name, _flags, _var) \ + __rtparam __cpupool_par_##_var = \ + def_custom_param(_name, SCOPE_CPUPOOL, _flags, func_cpupool, _var) +#define boolean_cpupool_param(_name, _flags, _var) \ + __rtparam __cpupool_par_##_var = \ + def_var_param(_name, OPT_BOOL, SCOPE_CPUPOOL, _flags, \ + (struct cpupool *)NULL->_var) +#define integer_cpupool_param(_name, _flags, _var) \ + __rtparam __cpupool_par_##_var = \ + def_var_param(_name, OPT_UINT, SCOPE_CPUPOOL, _flags, \ + (struct cpupool *)NULL->_var) +#define size_cpupool_param(_name, _flags, _var) \ + __rtparam __cpupool_par_##_var = \ + def_var_param(_name, OPT_SIZE, SCOPE_CPUPOOL, _flags, \ + (struct cpupool *)NULL->_var) +#define string_cpupool_param(_name, _flags, _var) \ + __rtparam __cpupool_par_##_var = \ + def_var_param(_name, OPT_STR, SCOPE_CPUPOOL, _flags, \ + (struct cpupool *)NULL->_var) + #define custom_domain_param(_name, _flags, _var) \ __rtparam __domain_par_##_var = \ def_custom_param(_name, SCOPE_DOMAIN, _flags, func_domain, _var) diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index 7ba5929ed5..17f60607ca 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -66,10 +66,12 @@ #define ROUNDUP(x, a) (((x) + (a) - 1) & ~((a) - 1)) +struct cpupool; struct domain; void cmdline_parse(const char *cmdline); int runtime_parse(const char *line); +int cpupool_param_parse(struct cpupool *c, const char *line); int domain_param_parse(struct domain *d, const char *line); int parse_bool(const char *s, const char *e); diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 0ba80cb1a8..97f838b7c0 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -919,6 +919,7 @@ int cpupool_move_domain(struct domain *d, struct cpupool *c); int cpupool_do_sysctl(struct xen_sysctl_cpupool_op *op); void schedule_dump(struct cpupool *c); extern void dump_runq(unsigned char key); +int cpupool_check_parflags(void *instance, unsigned int flags); void arch_do_physinfo(struct xen_sysctl_physinfo *pi); -- 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |