All of lore.kernel.org
 help / color / mirror / Atom feed
From: Juergen Gross <jgross@suse.com>
To: xen-devel@lists.xenproject.org
Cc: Juergen Gross <jgross@suse.com>,
	Stefano Stabellini <sstabellini@kernel.org>,
	Wei Liu <wei.liu2@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	Julien Grall <julien.grall@arm.com>,
	Jan Beulich <jbeulich@suse.com>
Subject: [PATCH 03/12] xen: add support for parameter scopes
Date: Tue, 18 Sep 2018 08:03:00 +0200	[thread overview]
Message-ID: <20180918060309.7186-4-jgross@suse.com> (raw)
In-Reply-To: <20180918060309.7186-1-jgross@suse.com>

In order to prepare support for domain-specific parameters similar to
boot- and runtime-parameters of the hypervisor, add generic support for
those to the parameter parsing framework.

To each parameter definition a scope (global only for now) is added.
Global parameters keep using pointers to the related variables in the
struct kernel_param of their definitions, while those of narrower scope
will use the offset in the structure (e.g. struct domain) for that
purpose.

This scheme requires passing the pointer to the structure instance to
the parsing function and the parameter type specific subfunctions, of
course.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 xen/common/kernel.c    | 38 ++++++++++++++++++++++++--------------
 xen/include/xen/init.h | 32 ++++++++++++++++++++------------
 2 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/xen/common/kernel.c b/xen/common/kernel.c
index a7e82453c2..f7f4e0dbff 100644
--- a/xen/common/kernel.c
+++ b/xen/common/kernel.c
@@ -19,6 +19,7 @@
 #ifndef COMPAT
 
 struct parse_data {
+    enum param_scope scope;
     const struct kernel_param *start;
     const struct kernel_param *end;
 };
@@ -28,27 +29,28 @@ enum system_state system_state = SYS_STATE_early_boot;
 xen_commandline_t saved_cmdline;
 static const char __initconst opt_builtin_cmdline[] = CONFIG_CMDLINE;
 
-static int assign_integer_param(const struct kernel_param *param, uint64_t val)
+static int assign_integer_param(const struct kernel_param *param,
+                                void *ptr, uint64_t val)
 {
     switch ( param->len )
     {
     case sizeof(uint8_t):
         if ( val > UINT8_MAX && val < (uint64_t)INT8_MIN )
             return -EOVERFLOW;
-        *(uint8_t *)param->par.var = val;
+        *(uint8_t *)ptr = val;
         break;
     case sizeof(uint16_t):
         if ( val > UINT16_MAX && val < (uint64_t)INT16_MIN )
             return -EOVERFLOW;
-        *(uint16_t *)param->par.var = val;
+        *(uint16_t *)ptr = val;
         break;
     case sizeof(uint32_t):
         if ( val > UINT32_MAX && val < (uint64_t)INT32_MIN )
             return -EOVERFLOW;
-        *(uint32_t *)param->par.var = val;
+        *(uint32_t *)ptr = val;
         break;
     case sizeof(uint64_t):
-        *(uint64_t *)param->par.var = val;
+        *(uint64_t *)ptr = val;
         break;
     default:
         BUG();
@@ -57,7 +59,8 @@ static int assign_integer_param(const struct kernel_param *param, uint64_t val)
     return 0;
 }
 
-static int parse_params(const char *cmdline, const struct parse_data *data)
+static int parse_params(const char *cmdline, const struct parse_data *data,
+                        void *instance)
 {
     char opt[128], *optval, *optkey, *q;
     const char *p = cmdline, *key;
@@ -108,6 +111,10 @@ static int parse_params(const char *cmdline, const struct parse_data *data)
         {
             int rctmp;
             const char *s;
+            void *ptr;
+
+            if ( param->scope != data->scope )
+                continue;
 
             if ( strcmp(param->name, optkey) )
             {
@@ -117,7 +124,7 @@ static int parse_params(const char *cmdline, const struct parse_data *data)
                 {
                     found = true;
                     optval[-1] = '=';
-                    rctmp = param->par.func(q);
+                    rctmp = param->par.call(q, instance);
                     optval[-1] = '\0';
                     if ( !rc )
                         rc = rctmp;
@@ -127,14 +134,15 @@ static int parse_params(const char *cmdline, const struct parse_data *data)
 
             rctmp = 0;
             found = true;
+            ptr = (void *)((uint64_t)param->par.var + (uint64_t)instance);
             switch ( param->type )
             {
             case OPT_STR:
-                strlcpy(param->par.var, optval, param->len);
+                strlcpy(ptr, optval, param->len);
                 break;
             case OPT_UINT:
                 rctmp = assign_integer_param(
-                    param,
+                    param, ptr,
                     simple_strtoll(optval, &s, 0));
                 if ( *s )
                     rctmp = -EINVAL;
@@ -146,11 +154,11 @@ static int parse_params(const char *cmdline, const struct parse_data *data)
                 if ( !rctmp )
                     bool_assert = !bool_assert;
                 rctmp = 0;
-                assign_integer_param(param, bool_assert);
+                assign_integer_param(param, ptr, bool_assert);
                 break;
             case OPT_SIZE:
                 rctmp = assign_integer_param(
-                    param,
+                    param, ptr,
                     parse_size_and_unit(optval, &s));
                 if ( *s )
                     rctmp = -EINVAL;
@@ -164,7 +172,7 @@ static int parse_params(const char *cmdline, const struct parse_data *data)
                     safe_strcpy(opt, "no");
                     optval = opt;
                 }
-                rctmp = param->par.func(optval);
+                rctmp = param->par.call(optval, instance);
                 break;
             default:
                 BUG();
@@ -192,23 +200,25 @@ static int parse_params(const char *cmdline, const struct parse_data *data)
 }
 
 static const struct parse_data boot_parse_data = {
+    .scope  = SCOPE_GLOBAL,
     .start  = __setup_start,
     .end    = __setup_end,
 };
 
 static const struct parse_data runtime_parse_data = {
+    .scope  = SCOPE_GLOBAL,
     .start  = __param_start,
     .end    = __param_end,
 };
 
 static void __init _cmdline_parse(const char *cmdline)
 {
-    parse_params(cmdline, &boot_parse_data);
+    parse_params(cmdline, &boot_parse_data, NULL);
 }
 
 int runtime_parse(const char *line)
 {
-    return parse_params(line, &runtime_parse_data);
+    return parse_params(line, &runtime_parse_data, NULL);
 }
 
 /**
diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h
index d0b07b3d39..b04534c11a 100644
--- a/xen/include/xen/init.h
+++ b/xen/include/xen/init.h
@@ -73,6 +73,10 @@ void do_initcalls(void);
 /*
  * Used for kernel command line parameter setup
  */
+enum param_scope {
+    SCOPE_GLOBAL
+};
+
 struct kernel_param {
     const char *name;
     enum {
@@ -83,9 +87,11 @@ struct kernel_param {
         OPT_CUSTOM
     } type;
     unsigned int len;
+    enum param_scope scope;
     union {
         void *var;
         int (*func)(const char *);
+        int (*call)(const char *, void *);
     } par;
 };
 
@@ -101,54 +107,56 @@ extern const struct kernel_param __param_start[], __param_end[];
     __attribute__((__aligned__(1))) char
 #define __kparam          __param(__initsetup)
 
-#define def_custom_param(_name, _func) \
+#define def_custom_param(_name, _scope, _func) \
     { .name = _name, \
       .type = OPT_CUSTOM, \
+      .scope = _scope, \
       .par.func = _func }
-#define def_var_param(_name, _type, _var) \
+#define def_var_param(_name, _type, _scope, _var) \
     { .name = _name, \
       .type = _type, \
       .len = sizeof(_var), \
+      .scope = _scope, \
       .par.var = &_var }
 
 #define custom_param(_name, _var) \
     __setup_str __setup_str_##_var[] = _name; \
     __kparam __setup_##_var = \
-        def_custom_param(__setup_str_##_var, _var)
+        def_custom_param(__setup_str_##_var, SCOPE_GLOBAL, _var)
 #define boolean_param(_name, _var) \
     __setup_str __setup_str_##_var[] = _name; \
     __kparam __setup_##_var = \
-        def_var_param(__setup_str_##_var, OPT_BOOL, _var)
+        def_var_param(__setup_str_##_var, OPT_BOOL, SCOPE_GLOBAL, _var)
 #define integer_param(_name, _var) \
     __setup_str __setup_str_##_var[] = _name; \
     __kparam __setup_##_var = \
-        def_var_param(__setup_str_##_var, OPT_UINT, _var)
+        def_var_param(__setup_str_##_var, OPT_UINT, SCOPE_GLOBAL, _var)
 #define size_param(_name, _var) \
     __setup_str __setup_str_##_var[] = _name; \
     __kparam __setup_##_var = \
-        def_var_param(__setup_str_##_var, OPT_SIZE, _var)
+        def_var_param(__setup_str_##_var, OPT_SIZE, SCOPE_GLOBAL, _var)
 #define string_param(_name, _var) \
     __setup_str __setup_str_##_var[] = _name; \
     __kparam __setup_##_var = \
-        def_var_param(__setup_str_##_var, OPT_STR, _var)
+        def_var_param(__setup_str_##_var, OPT_STR, SCOPE_GLOBAL, _var)
 
 #define __rtparam         __param(__dataparam)
 
 #define custom_runtime_only_param(_name, _var) \
     __rtparam __rtpar_##_var = \
-        def_custom_param(_name, _var)
+        def_custom_param(_name, SCOPE_GLOBAL, _var)
 #define boolean_runtime_only_param(_name, _var) \
     __rtparam __rtpar_##_var = \
-        def_var_param(_name, OPT_BOOL, _var)
+        def_var_param(_name, OPT_BOOL, SCOPE_GLOBAL, _var)
 #define integer_runtime_only_param(_name, _var) \
     __rtparam __rtpar_##_var = \
-        def_var_param(_name, OPT_UINT, _var)
+        def_var_param(_name, OPT_UINT, SCOPE_GLOBAL, _var)
 #define size_runtime_only_param(_name, _var) \
     __rtparam __rtpar_##_var = \
-        def_var_param(_name, OPT_SIZE, _var)
+        def_var_param(_name, OPT_SIZE, SCOPE_GLOBAL, _var)
 #define string_runtime_only_param(_name, _var) \
     __rtparam __rtpar_##_var = \
-        def_var_param(_name, OPT_STR, _var)
+        def_var_param(_name, OPT_STR, SCOPE_GLOBAL, _var)
 
 #define custom_runtime_param(_name, _var) \
     custom_param(_name, _var); \
-- 
2.16.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  parent reply	other threads:[~2018-09-18  6:03 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-18  6:02 [PATCH 00/12] add per-domain and per-cpupool generic parameters Juergen Gross
2018-09-18  6:02 ` [PATCH 01/12] xen: use macros for filling parameter definition blocks Juergen Gross
2018-09-26 15:32   ` Dario Faggioli
2018-10-04 15:37   ` Jan Beulich
2018-09-18  6:02 ` [PATCH 02/12] xen: use a structure to define parsing parameters Juergen Gross
2018-09-26 15:17   ` Dario Faggioli
2018-10-04 15:40   ` Jan Beulich
2018-09-18  6:03 ` Juergen Gross [this message]
2018-09-18  6:03 ` [PATCH 04/12] xen: add a generic flags field to parameter definitions Juergen Gross
2018-09-18  6:03 ` [PATCH 05/12] xen: add hypercall interfaces for domain and cpupool parameter setting Juergen Gross
2018-09-18 21:23   ` Daniel De Graaf
2018-09-19  5:14     ` Juergen Gross
2018-09-26 17:06   ` Dario Faggioli
2018-09-18  6:03 ` [PATCH 06/12] xen: add domain specific parameter support Juergen Gross
2018-09-18  6:03 ` [PATCH 07/12] " Juergen Gross
2018-09-26 16:58   ` Dario Faggioli
2018-09-18  6:03 ` [PATCH 08/12] tools/libxc: add per domain/cpupool " Juergen Gross
2018-09-18  6:03 ` [PATCH 09/12] tools/xl: add support for setting generic per-cpupool parameters Juergen Gross
2018-09-26 17:17   ` Dario Faggioli
2018-09-27  5:14     ` Juergen Gross
2018-09-18  6:03 ` [PATCH 10/12] tools/xl: add support for setting generic per-domain parameters Juergen Gross
2018-09-18  6:03 ` [PATCH 11/12] x86: add domain type flags for domain parameters Juergen Gross
2018-09-18  6:03 ` [PATCH 12/12] x86/xpti: add per-domain parameter for controlling xpti Juergen Gross
2018-09-18 10:32 ` [PATCH 00/12] add per-domain and per-cpupool generic parameters Jan Beulich
2018-09-18 11:10   ` Juergen Gross
     [not found]     ` <5?==?UTF-8?Q?BA0DF9602000078001=3d=3fUTF-8=3fQ=3fE9448@suse.com>
     [not found]       ` <6d56ad90-782?==?UTF-8?Q?5-adb7-f4e5-6c3ceb3210f6@suse.com>
     [not found]         ` <001ab73a-078d-4ec1-4acd-2fb43?==?UTF-8?Q?89e8867@citrix.com>
2018-09-18 11:18     ` George Dunlap
2018-09-18 11:30       ` Juergen Gross
2018-09-18 11:20     ` Jan Beulich
     [not found]     ` <5?= =?UTF-8?Q?BA0DF9602000078001=3d=3fUTF-8=3fQ=3fE9448@suse.com>
     [not found]       ` <6d56ad90-782?= =?UTF-8?Q?5-adb7-f4e5-6c3ceb3210f6@suse.com>
     [not found]         ` <001ab73a-078d-4ec1-4acd-2fb43?= =?UTF-8?Q?89e8867@citrix.com>
     [not found]           ` <20180919172818.3aksiju4s3ipw42p@zion.uk.xens?= =?UTF-8?Q?ource.com>
2018-09-19 17:58             ` Juergen Gross
     [not found]               ` <20180920160629.j?==?UTF-8?Q?ullgb435zi7bcbr@zi=3d=3fUTF-8=3fQ=3fon.uk.xensource.com>
     [not found]                 ` <eba521d?==?UTF-8?Q?2-f6c5-5096-82c2-af5983ed2372@suse.com>
2018-09-20 16:06               ` Wei Liu
     [not found]               ` <20180920160629.j?= =?UTF-8?Q?ullgb435zi7bcbr@zi=3d=3fUTF-8=3fQ=3fon.uk.xensource.com>
     [not found]                 ` <eba521d?= =?UTF-8?Q?2-f6c5-5096-82c2-af5983ed2372@suse.com>
     [not found]                   ` <20180921085240.dqzt5pomt?= =?UTF-8?Q?nfjs665@zion.uk.xensource.com>
2018-09-27  5:58                     ` Juergen Gross
2018-10-03 10:58                       ` Wei Liu
     [not found] ` <5BA0D44602000078001E93EA@suse.com>
2018-09-18 11:02   ` Juergen Gross
2018-09-18 11:19     ` Jan Beulich
2018-09-18 11:20       ` George Dunlap
2018-09-18 11:23         ` Jan Beulich
2018-09-18 11:29           ` George Dunlap
2018-09-18 11:34             ` Juergen Gross
2018-09-18 11:52             ` Jan Beulich
2018-09-18 11:24         ` Juergen Gross
     [not found]   ` <f8bc94ca-9eee-a5a2-5c32-0c?= =?UTF-8?Q?a1ed0cbf5d@suse.com>
     [not found]     ` <5BA0DF3702000078001E9444@suse.com>
2018-09-18 11:26       ` Juergen Gross
2018-09-18 11:47         ` Jan Beulich
     [not found]   ` <f8bc94ca=ef=bf=bd9eee?= =?UTF-8?B?77+9YTVhMu+/vTVjMzLvv70wY2ExZWQwY2JmNWRAc3VzZS5jb20+IDw1QkEwREYz?= =?UTF-8?Q?702000078001E9444@prv1=ef=bf=bdmh.provo.novell.com>
     [not found]     ` <78501912-e58?= =?UTF-8?Q?6-faa9-3569-3b2fd2fef9f5@citrix.com>
     [not found]       ` <5BA0E01902000078001E9468@su?= =?UTF-8?Q?se.com>
2018-09-18 11:28         ` Juergen Gross
     [not found] <20180918060309.7186=ef=bf=bd1=ef=bf=bdjgross@suse.com?= =?UTF-8?Q?>
     [not found] ` <5BA0D44602000078001E93EA@prv1=ef=bf=bdmh.provo.novell.com>
     [not found]   ` <7c?==?UTF-8?Q?b2a460-095c-27c8-a4cf-47ef8e7850d5@suse.com>
     [not found]   ` <7c?= =?UTF-8?Q?b2a460-095c-27c8-a4cf-47ef8e7850d5@suse.com>
     [not found]     ` <5BA0DF9602000078001?= =?UTF-8?Q?E9448@suse.com>
2018-09-18 11:32       ` Juergen Gross
     [not found]         ` <001ab73a-07?==?UTF-8?Q?8d-4ec1-4acd-2fb4389e8867@citrix.com>
     [not found]           ` <20180919172818.3aksiju4s3i?==?UTF-8?Q?pw42p@zion.uk.xens=3d=3fUTF-8=3fQ=3fource.com>
     [not found]             ` <fffd7e59-e437-8ed?==?UTF-8?Q?9-b228-b537fde050cd@suse.com>
2018-09-18 13:25         ` George Dunlap
2018-09-19 17:28           ` Wei Liu
     [not found]         ` <?= =?UTF-8?Q?001ab73a-078d-4ec1-4acd-2fb4389e8867@citrix.com>
2018-09-18 13:36           ` Juergen Gross
     [not found]           ` <0a89246d-00a6-d?= =?UTF-8?Q?04a-4bce-3f0b98839d39@suse.com>
2018-09-18 13:57             ` George Dunlap
2018-09-26 15:10               ` Dario Faggioli
     [not found]             ` <d698d8c9-2582-6314-10cb-ecb9535f?= =?UTF-8?Q?62e0@citrix.com>
2018-09-18 14:57               ` Juergen Gross
2018-09-18 15:21                 ` George Dunlap
     [not found]               ` <7785b4d9724db9224ca8bed58d0f061ce1d67b71.camel@?= =?UTF-8?Q?suse.com>
2018-09-27  6:10                 ` Juergen Gross
     [not found]         ` <001ab73a-07?= =?UTF-8?Q?8d-4ec1-4acd-2fb4389e8867@citrix.com>
     [not found]           ` <20180919172818.3aksiju4s3i?= =?UTF-8?Q?pw42p@zion.uk.xens=3d=3fUTF-8=3fQ=3fource.com>
     [not found]             ` <fffd7e59-e437-8ed?= =?UTF-8?Q?9-b228-b537fde050cd@suse.com>
     [not found]               ` <20180920160629.jullgb435zi7bcbr@zi?= =?UTF-8?Q?on.uk.xensource.com>
2018-09-21  5:23                 ` Juergen Gross
2018-09-21  8:52                   ` Wei Liu
2018-09-26 17:30                     ` Dario Faggioli
2018-10-03 11:00                       ` Wei Liu
2018-10-03 11:07                         ` Juergen Gross
2018-10-03 11:27                           ` Wei Liu
     [not found] <7cb2a460-095c-27c8-a4cf-47ef8e7?=850d5@suse.com>
     [not found] <20180918060309.7186=3def=3dbf=3dbd1=3def=3dbf=3dbdjgr?= =?UTF-8?Q?oss@suse.com=3f=3d>
     [not found] <20180918060309.7186=3d3def=3d3dbf=3d3dbd1=3d3def=3d3d?= =?UTF-8?Q?bf=3d3dbdjgr=3f=3doss@suse.com=3f=3d>
     [not found] ` <5BA0D44602000078001E93EA@p?= =?UTF-8?Q?rv1=ef=bf=bdmh.provo.novell.com>
     [not found]   ` <7cb2a460-095c-27c8-a4cf-47ef8e7?= =?UTF-8?Q?850d5@suse.com>
     [not found] <7cb2a460-095c-2?==?UTF-8?Q?7c8-a4cf-47ef8e7850d5@suse.com>
     [not found] ` <5BA0DF9602000078001=3d=3fUTF-8?==?UTF-8?Q?=3fQ=3fE9448@suse.com>
     [not found] <20180918060309.7186=3d3def=3d3dbf=3d3dbd1=3d3def=3d3d?==?UTF-8?Q?bf=3d3dbdjgr=3f=3doss@suse.com=3f=3d>
     [not found] ` <5BA0D44602000078001E93EA@p?==?UTF-8?Q?rv1=ef=bf=bdmh.provo.novell.com>
     [not found]   ` <7cb2a460-095c-27c8-a4cf-47ef8e7?==?UTF-8?Q?850d5@suse.com>
     [not found] <20180918060309.7186=3def=3dbf=3dbd1=3def=3dbf=3dbdjgr?==?UTF-8?Q?oss@suse.com=3f=3d>
     [not found] <20180918060309.7186=3d3d3def=3d3d3dbf=3d3d3dbd1=3d3d3?= =?UTF-8?Q?def=3d3d3d=3f=3dbf=3d3dbdjgr=3f=3doss@suse.com=3f=3d>
     [not found] ` <5BA0D44602?= =?UTF-8?Q?000078001E93EA@prv1=ef=bf=bdmh.provo.novell.com>
     [not found]   ` <7cb2a460-095c-2?= =?UTF-8?Q?7c8-a4cf-47ef8e7850d5@suse.com>
     [not found]     ` <5BA0DF9602000078001=3d=3fUTF-8?= =?UTF-8?Q?=3fQ=3fE9448@suse.com>

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=20180918060309.7186-4-jgross@suse.com \
    --to=jgross@suse.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=julien.grall@arm.com \
    --cc=konrad.wilk@oracle.com \
    --cc=sstabellini@kernel.org \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.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.