WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH] xl: support specifing '[vars]' in 'xl create'

To: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] xl: support specifing '[vars]' in 'xl create'
From: Yu Zhiguo <yuzg@xxxxxxxxxxxxxx>
Date: Thu, 29 Apr 2010 12:32:43 +0800
Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, Keir Fraser <Keir.Fraser@xxxxxxxxxxxxx>
Delivery-date: Wed, 28 Apr 2010 21:33:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <alpine.DEB.2.00.1004281959050.11380@kaball-desktop>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <4BD7F6F8.30404@xxxxxxxxxxxxxx> <alpine.DEB.2.00.1004281959050.11380@kaball-desktop>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 3.0a1 (Windows/2008050715)
Hi Stefano,

Stefano Stabellini wrote:
>> -static int create_domain(int debug, int daemonize, const char *config_file, 
>> const char *restore_file, int paused, int migrate_fd /* -1 means none */, 
>> char **migration_domname_r)
>> +static int create_domain(int debug, int daemonize, const char *config_file, 
>> const char *restore_file,
>> +                         int paused, int migrate_fd /* -1 means none */, 
>> char **migration_domname_r,
>> +                         const char *extra_config)
> 
> This line is misaligned.
> Also, I feel that create_domain's arguments are growing too much, it would
> be a good idea to reorganize them in a struct.
> 

Thanks for you advice, I think it's a good idea and fix the patch.
Could you ack the new version?

Regards
Yu Zhiguo

---------------v2--------------------

Add support of specifing '[vars]' in 'xl create'.
It is said '[vars]' can be used in help message of 'xl create',
but in fact cannot now, so add this function.

After this fix:
# xl create pvguest1.conf
# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1024     2     r-----    541.7
pvguest1                                    56   256     2     -b----      0.4
# xl destroy pvguest1
# xl create pvguest1.conf vcpus=4 memory=512 'name="pv1"'
# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1024     2        r--    542.2
pv1                                         57   512     4        r--      0.5

Signed-off-by: Yu Zhiguo <yuzg@xxxxxxxxxxxxxx>

diff -r 9a1d7caa2024 -r 262f87853b2d tools/libxl/xl.c
--- a/tools/libxl/xl.c  Mon Apr 26 12:13:23 2010 +0100
+++ b/tools/libxl/xl.c  Thu Apr 29 20:06:47 2010 +0800
@@ -70,6 +70,17 @@
    *            from target to source
    */
 
+struct domain_create {
+    int debug;
+    int daemonize;
+    int paused;
+    const char *config_file;
+    const char *extra_config; /* extra config string */
+    const char *restore_file;
+    int migrate_fd; /* -1 means none */
+    char **migration_domname_r;
+};
+
 struct save_file_header {
     char magic[32]; /* savefileheader_magic */
     /* All uint32_ts are in domain's byte order. */
@@ -777,7 +788,7 @@
     return r;
 }
 
-static int create_domain(int debug, int daemonize, const char *config_file, 
const char *restore_file, int paused, int migrate_fd /* -1 means none */, char 
**migration_domname_r)
+static int create_domain(struct domain_create *dom_info)
 {
     libxl_domain_create_info info1;
     libxl_domain_build_info info2;
@@ -789,6 +800,16 @@
     libxl_device_vfb *vfbs = NULL;
     libxl_device_vkb *vkbs = NULL;
     libxl_device_console console;
+
+    int debug = dom_info->debug;
+    int daemonize = dom_info->daemonize;
+    int paused = dom_info->paused;
+    const char *config_file = dom_info->config_file;
+    const char *extra_config = dom_info->extra_config;
+    const char *restore_file = dom_info->restore_file;
+    int migrate_fd = dom_info->migrate_fd;
+    char **migration_domname_r = dom_info->migration_domname_r;
+
     int num_disks = 0, num_vifs = 0, num_pcidevs = 0, num_vfbs = 0, num_vkbs = 
0;
     int i, fd;
     int need_daemon = 1;
@@ -873,6 +894,23 @@
                                        &config_data, &config_len);
         if (ret) { fprintf(stderr, "Failed to read config file: %s: %s\n",
                            config_file, strerror(errno)); return ERROR_FAIL; }
+        if (!restore_file && extra_config
+            && strlen(extra_config)) {
+            if (config_len > INT_MAX - (strlen(extra_config) + 2)) {
+                fprintf(stderr, "Failed to attach extra configration\n");
+                return ERROR_FAIL;
+            }
+            config_data = realloc(config_data, config_len
+                + strlen(extra_config) + 2);
+            if (!config_data) {
+                fprintf(stderr, "Failed to realloc config_data\n");
+                return ERROR_FAIL;
+            }
+            strcat(config_data, "\n");
+            strcat(config_data, extra_config);
+            strcat(config_data, "\n");
+            config_len += (strlen(extra_config) + 2);
+        }
     } else {
         if (!config_data) {
             fprintf(stderr, "Config file not specified and"
@@ -1921,6 +1959,7 @@
     int rc, rc2;
     char rc_buf;
     char *migration_domname;
+    struct domain_create dom_info;
 
     signal(SIGPIPE, SIG_IGN);
     /* if we get SIGPIPE we'd rather just have it as an error */
@@ -1933,10 +1972,14 @@
                                    "migration ack stream",
                                    "banner") );
 
-    rc = create_domain(debug, daemonize,
-                       0 /* no config file, use incoming */,
-                       "incoming migration stream", 1,
-                       0, &migration_domname);
+    memset(&dom_info, 0, sizeof(dom_info));
+    dom_info.debug = debug;
+    dom_info.daemonize = daemonize;
+    dom_info.paused = 1;
+    dom_info.restore_file = "incoming migration stream";
+    dom_info.migration_domname_r = &migration_domname;
+
+    rc = create_domain(&dom_info);
     if (rc) {
         fprintf(stderr, "migration target: Domain creation failed"
                 " (code %d).\n", rc);
@@ -2014,6 +2057,7 @@
     char *checkpoint_file = NULL;
     char *config_file = NULL;
     int paused = 0, debug = 0, daemonize = 1;
+    struct domain_create dom_info;
     int opt, rc;
 
     while ((opt = getopt(argc, argv, "hpde")) != -1) {
@@ -2045,8 +2089,16 @@
         help("restore");
         exit(2);
     }
-    rc = create_domain(debug, daemonize, config_file,
-                       checkpoint_file, paused, -1, 0);
+
+    memset(&dom_info, 0, sizeof(dom_info));
+    dom_info.debug = debug;
+    dom_info.daemonize = daemonize;
+    dom_info.paused = paused;
+    dom_info.config_file = config_file;
+    dom_info.restore_file = checkpoint_file;
+    dom_info.migrate_fd = -1;
+
+    rc = create_domain(&dom_info);
     exit(-rc);
 }
 
@@ -2292,6 +2344,9 @@
 {
     char *filename = NULL;
     int paused = 0, debug = 0, daemonize = 1;
+#define MAX_EXTRA       1024
+    char *p, extra_config[MAX_EXTRA];
+    struct domain_create dom_info;
     int opt, rc;
 
     while ((opt = getopt(argc, argv, "hdep")) != -1) {
@@ -2314,14 +2369,33 @@
         }
     }
 
-    if (optind >= argc) {
-        help("create");
-        exit(2);
+    memset(extra_config, 0, MAX_EXTRA);
+    while (optind < argc) {
+        if ((p = strchr(argv[optind], '='))) {
+            if (strlen(extra_config) + 1 < MAX_EXTRA) {
+                if (strlen(extra_config))
+                    strcat(extra_config, "\n");
+                strcat(extra_config, argv[optind]);
+            }
+        } else if (!filename) {
+            filename = argv[optind];
+        } else {
+            help("create");
+            exit(2);
+        }
+
+        optind++;
     }
 
-    filename = argv[optind];
-    rc = create_domain(debug, daemonize, filename, NULL, paused,
-                       -1, 0);
+    memset(&dom_info, 0, sizeof(dom_info));
+    dom_info.debug = debug;
+    dom_info.daemonize = daemonize;
+    dom_info.paused = paused;
+    dom_info.config_file = filename;
+    dom_info.extra_config = extra_config;
+    dom_info.migrate_fd = -1;
+
+    rc = create_domain(&dom_info);
     exit(-rc);
 }
 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>