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

[Xen-devel] [PATCH v1 03/10] libxl: store a copy of vanilla domain configuration when creating domain



This patch utilises new "libxl-json" file and stores a copy of user
supplied domain configuration in JSON form. This copy will be used as
template.

There're two save operations in total. The template config is first
saved right after the domain gets its UUID and domain id. Then after the
domain creation succeeds, the relevant bits touched by libxl are
synchronised to the stored config.

Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/libxl/libxl_create.c   |   76 ++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_internal.h |   14 ++++++++
 2 files changed, 90 insertions(+)

diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 0686f96..35fa7b7 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -705,6 +705,7 @@ static void initiate_domain_create(libxl__egc *egc,
     int i, ret;
     size_t last_devid = -1;
     bool pod_enabled = false;
+    libxl_domain_config d_config_saved;
 
     /* convenience aliases */
     libxl_domain_config *const d_config = dcs->guest_config;
@@ -713,6 +714,8 @@ static void initiate_domain_create(libxl__egc *egc,
 
     domid = 0;
 
+    libxl_domain_config_init(&d_config_saved);
+
     if (d_config->c_info.ssid_label) {
         char *s = d_config->c_info.ssid_label;
         ret = libxl_flask_context_to_sid(ctx, s, strlen(s),
@@ -789,6 +792,8 @@ static void initiate_domain_create(libxl__egc *egc,
         goto error_out;
     }
 
+    libxl_domain_config_copy(ctx, &d_config_saved, d_config);
+
     ret = libxl__domain_create_info_setdefault(gc, &d_config->c_info);
     if (ret) goto error_out;
 
@@ -803,6 +808,15 @@ static void initiate_domain_create(libxl__egc *egc,
     dcs->guest_domid = domid;
     dcs->dmss.dm.guest_domid = 0; /* means we haven't spawned */
 
+    /* At this point we've got domid and UUID, store configuration */
+    ret = libxl__set_domain_configuration(gc, domid, &d_config_saved);
+    libxl_domain_config_dispose(&d_config_saved);
+    if (ret) {
+        LOGE(ERROR, "cannot store domain configuration: %d", ret);
+        ret = ERROR_FAIL;
+        goto error_out;
+    }
+
     ret = libxl__domain_build_info_setdefault(gc, &d_config->b_info);
     if (ret) goto error_out;
 
@@ -1344,6 +1358,62 @@ error_out:
     domcreate_complete(egc, dcs, ret);
 }
 
+static void update_domain_config(libxl__gc *gc,
+                                 libxl_domain_config *dst,
+                                 const libxl_domain_config *src)
+{
+    /* update network interface information */
+    int i;
+
+    for (i = 0; i < src->num_nics; i++)
+        libxl__update_config_nic(gc, &dst->nics[i], &src->nics[i]);
+
+    /* update vtpm information */
+    for (i = 0; i < src->num_vtpms; i++)
+        libxl__update_config_vtpm(gc, &dst->vtpms[i], &src->vtpms[i]);
+
+    /* update guest UUID */
+    libxl_uuid_copy(CTX, &dst->c_info.uuid, &src->c_info.uuid);
+
+    /* video ram */
+    dst->b_info.video_memkb = src->b_info.video_memkb;
+}
+
+/* update the saved domain configuration with a callback function,
+ * which is responsible to pull in useful fields from src.
+ */
+typedef void (update_callback)(libxl__gc *, libxl_domain_config *,
+                               const libxl_domain_config *);
+static int libxl__update_domain_configuration(libxl__gc *gc,
+                                              uint32_t domid,
+                                              update_callback callback,
+                                              const libxl_domain_config *src)
+{
+    libxl_domain_config d_config_saved;
+    int rc;
+
+    libxl_domain_config_init(&d_config_saved);
+
+    rc = libxl__get_domain_configuration(gc, domid, &d_config_saved);
+
+    if (rc) {
+        LOG(ERROR, "cannot get domain configuration: %d", rc);
+        goto out;
+    }
+
+    callback(gc, &d_config_saved, src);
+
+    rc = libxl__set_domain_configuration(gc, domid, &d_config_saved);
+
+    if (rc)
+        LOG(ERROR, "cannot set domain configuration: %d", rc);
+
+    libxl_domain_config_dispose(&d_config_saved);
+
+out:
+    return rc;
+}
+
 static void domcreate_complete(libxl__egc *egc,
                                libxl__domain_create_state *dcs,
                                int rc)
@@ -1354,6 +1424,12 @@ static void domcreate_complete(libxl__egc *egc,
     if (!rc && d_config->b_info.exec_ssidref)
         rc = xc_flask_relabel_domain(CTX->xch, dcs->guest_domid, 
d_config->b_info.exec_ssidref);
 
+    if (!rc) {
+        rc = libxl__update_domain_configuration(gc, dcs->guest_domid,
+                                                update_domain_config,
+                                                d_config);
+    }
+
     if (rc) {
         if (dcs->guest_domid) {
             dcs->dds.ao = ao;
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index e9d93ac..72d21ad 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3240,6 +3240,20 @@ int libxl__lock_domain_configuration(libxl__gc *gc, 
uint32_t domid,
 int libxl__unlock_domain_configuration(libxl__gc *gc, uint32_t domid,
                                        int *fd_lock);
 
+static inline void libxl__update_config_nic(libxl__gc *gc,
+                                            libxl_device_nic *dst,
+                                            libxl_device_nic *src)
+{
+    libxl_mac_copy(CTX, &dst->mac, &src->mac);
+}
+
+static inline void libxl__update_config_vtpm(libxl__gc *gc,
+                                             libxl_device_vtpm *dst,
+                                             libxl_device_vtpm *src)
+{
+    libxl_uuid_copy(CTX, &dst->uuid, &src->uuid);
+}
+
 #endif
 
 /*
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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