[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 10/12] tools/xl: add support for setting generic per-domain parameters



Add a new xl command "domain-set-parameters" and domain config file
support for setting per-domain generic parameters.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 docs/man/xl.cfg.pod.5.in    | 12 ++++++++++++
 docs/man/xl.pod.1.in        | 19 ++++++++++++++++++
 tools/libxl/libxl.h         | 10 ++++++++++
 tools/libxl/libxl_create.c  | 10 ++++++++++
 tools/libxl/libxl_domain.c  | 47 +++++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_types.idl |  1 +
 tools/xl/xl.h               |  1 +
 tools/xl/xl_cmdtable.c      |  6 ++++++
 tools/xl/xl_parse.c         |  3 +++
 tools/xl/xl_vmcontrol.c     | 25 ++++++++++++++++++++++++
 10 files changed, 134 insertions(+)

diff --git a/docs/man/xl.cfg.pod.5.in b/docs/man/xl.cfg.pod.5.in
index b72718151b..c97ae77129 100644
--- a/docs/man/xl.cfg.pod.5.in
+++ b/docs/man/xl.cfg.pod.5.in
@@ -604,6 +604,18 @@ option should only be used with a trusted device tree.
 Note that the partial device tree should avoid using the phandle 65000
 which is reserved by the toolstack.
 
+=item B<parameters="PARAMS">
+
+Specifies generic parameters for the domain. C<PARAMS> is a list of
+parameter settings in the form of "name[=value]" separated by blanks.
+The following parameter settings are supported:
+
+=over 4
+
+NONE
+
+=back
+
 =back
 
 =head2 Devices
diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in
index a2ddc4b2e0..7ab3e304d7 100644
--- a/docs/man/xl.pod.1.in
+++ b/docs/man/xl.pod.1.in
@@ -263,6 +263,25 @@ using a hardware domain separated from domain 0.
 
 =back
 
+=item B<domain-set-parameters> [I<OPTIONS>] I<domain-id> I<params>
+
+Sets generic parameters I<params> for I<domain-id>.
+
+See the L<xl.cfg(5)> manpage for supported parameters.
+
+B<OPTIONS>
+
+=over 4
+
+=item I<-t>
+
+Set the parameter only temporary. The parameter isn't added to the domain
+config data, so it won't persist across migration or domain save/restore.
+
+=back
+
+=back
+
 =item B<domid> I<domain-name>
 
 Converts a domain name to a domain id.
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index bd26d9fd4a..a3c87407a5 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1164,6 +1164,13 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, 
const libxl_mac *src);
  */
 #define LIBXL_HAVE_PVCALLS 1
 
+/*
+ * LIBXL_HAVE_DOMAIN_SET_PARAMETERS
+ *
+ * If this is defined setting per-domain parameters is supported.
+ */
+#define LIBXL_HAVE_DOMAIN_SET_PARAMETERS 1
+
 /*
  * LIBXL_HAVE_CPUPOOL_SET_PARAMETERS
  *
@@ -1554,6 +1561,9 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid,
                          LIBXL_EXTERNAL_CALLERS_ONLY;
 int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid, 
libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid);
 
+int libxl_domain_set_parameters(libxl_ctx *ctx, uint32_t domid, char *params,
+                                bool temp);
+
 /* get max. number of cpus supported by hypervisor */
 int libxl_get_max_cpus(libxl_ctx *ctx);
 
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index dcfde7787e..1eb0e8f639 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -597,6 +597,16 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config 
*d_config,
             goto out;
         }
 
+        if (d_config->b_info.parameters) {
+            ret = xc_set_domain_parameters(ctx->xch, *domid,
+                                           d_config->b_info.parameters);
+            if (ret < 0) {
+                LOGED(ERROR, *domid, "fail to set domain parameters");
+                rc = ERROR_FAIL;
+                goto out;
+            }
+        }
+
         rc = libxl__arch_domain_save_config(gc, d_config, state, &create);
         if (rc < 0)
             goto out;
diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c
index 3377bba994..e0f78ac489 100644
--- a/tools/libxl/libxl_domain.c
+++ b/tools/libxl/libxl_domain.c
@@ -1773,6 +1773,53 @@ out:
     return rc;
 }
 
+int libxl_domain_set_parameters(libxl_ctx *ctx, uint32_t domid, char *params,
+                                bool temp)
+{
+    libxl__domain_userdata_lock *lock = NULL;
+    libxl_domain_config d_config;
+    GC_INIT(ctx);
+    int rc;
+
+    libxl_domain_config_init(&d_config);
+
+    rc = xc_set_domain_parameters(ctx->xch, domid, params);
+    if (rc) {
+        LOGEV(ERROR, rc, "Error setting domain parameters");
+        rc = ERROR_FAIL;
+        goto out;
+    }
+
+    if (!temp) {
+        lock = libxl__lock_domain_userdata(gc, domid);
+        if (!lock) {
+            rc = ERROR_LOCK_FAIL;
+            goto out;
+        }
+
+        rc = libxl__get_domain_configuration(gc, domid, &d_config);
+        if (rc) goto out;
+
+        if (d_config.b_info.parameters) {
+            d_config.b_info.parameters =
+                libxl__realloc(gc, d_config.b_info.parameters,
+                               strlen(d_config.b_info.parameters) +
+                               strlen(params) + 2);
+            strcat(d_config.b_info.parameters, " ");
+            strcat(d_config.b_info.parameters, params);
+        } else
+            d_config.b_info.parameters = libxl__strdup(gc, params);
+
+        rc = libxl__set_domain_configuration(gc, domid, &d_config);
+    }
+
+out:
+    if (lock) libxl__unlock_domain_userdata(lock);
+    libxl_domain_config_dispose(&d_config);
+    GC_FREE;
+    return rc;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 2cceb8c057..382a6c1d6e 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -488,6 +488,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
 
     ("max_grant_frames",    uint32, {'init_val': 
'LIBXL_MAX_GRANT_FRAMES_DEFAULT'}),
     ("max_maptrack_frames", uint32, {'init_val': 
'LIBXL_MAX_MAPTRACK_FRAMES_DEFAULT'}),
+    ("parameters",      string),
     
     ("device_model_version", libxl_device_model_version),
     ("device_model_stubdomain", libxl_defbool),
diff --git a/tools/xl/xl.h b/tools/xl/xl.h
index a51acc4256..3153a35f22 100644
--- a/tools/xl/xl.h
+++ b/tools/xl/xl.h
@@ -151,6 +151,7 @@ int main_sched_credit2(int argc, char **argv);
 int main_sched_rtds(int argc, char **argv);
 int main_domid(int argc, char **argv);
 int main_domname(int argc, char **argv);
+int main_domainsetparameters(int argc, char **argv);
 int main_rename(int argc, char **argv);
 int main_trigger(int argc, char **argv);
 int main_sysrq(int argc, char **argv);
diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
index 3a469dacc3..41e5bd27a3 100644
--- a/tools/xl/xl_cmdtable.c
+++ b/tools/xl/xl_cmdtable.c
@@ -285,6 +285,12 @@ struct cmd_spec cmd_table[] = {
       "-b BUDGET, --budget=BUDGET     Budget (us)\n"
       "-e Extratime, --extratime=Extratime Extratime (1=yes, 0=no)\n"
     },
+    { "domain-set-parameters",
+      &main_domainsetparameters, 0, 1,
+      "Sets generic parameters for a domain",
+      "[-t] <Domain> <Params>",
+      "  -t                           Set parameter only temporary",
+    },
     { "domid",
       &main_domid, 0, 0,
       "Convert a domain name to domain id",
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 971ec1bc56..0a6fe141b9 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -1558,6 +1558,9 @@ void parse_config_data(const char *config_source,
 
     xlu_cfg_get_defbool(config, "nestedhvm", &b_info->nested_hvm, 0);
 
+    if (!xlu_cfg_get_string (config, "parameters", &buf, 0))
+        xlu_cfg_replace_string(config, "parameters", &b_info->parameters, 0);
+
     switch(b_info->type) {
     case LIBXL_DOMAIN_TYPE_HVM:
         kernel_basename = libxl_basename(b_info->kernel);
diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c
index a1d633795c..8fa2338621 100644
--- a/tools/xl/xl_vmcontrol.c
+++ b/tools/xl/xl_vmcontrol.c
@@ -275,6 +275,31 @@ int main_reboot(int argc, char **argv)
     return main_shutdown_or_reboot(1, argc, argv);
 }
 
+int main_domainsetparameters(int argc, char **argv)
+{
+    int opt;
+    char *params;
+    uint32_t domid;
+    bool temp = false;
+
+    SWITCH_FOREACH_OPT(opt, "t", NULL, "domain-set-parameters", 2) {
+    case 't':
+        temp = true;
+        break;
+    }
+
+    domid = find_domain(argv[optind]);
+    params = argv[++optind];
+
+    if (libxl_domain_set_parameters(ctx, domid, params, temp)) {
+        fprintf(stderr, "cannot set parameters: %s\n", params);
+        fprintf(stderr, "Use \"xl dmesg\" to look for possible reason.\n");
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
+
 static void evdisable_disk_ejects(libxl_evgen_disk_eject **diskws,
                                  int num_disks)
 {
-- 
2.16.4


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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.