libxl: Set default shadow memory based on final values for vcpus and memory
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 19 May 2010 07:15:05 +0000 (08:15 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 19 May 2010 07:15:05 +0000 (08:15 +0100)
Set default shadow memory based on final versions of memory and vcpus,
not on minimum default versions.

Failure mode was failed p2m allocaitons, e.g., with hvm-linux PV
drivers mapping the shared-info page.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
tools/libxl/xl_cmdimpl.c

index b5d2eba0227d681cc0cdee03e7a92be6a46fa3ce..9c37d43e84fa0ab7c733898734a1d3f2ad78aa13 100644 (file)
@@ -180,7 +180,7 @@ static void init_build_info(libxl_domain_build_info *b_info, libxl_domain_create
     b_info->max_memkb = 32 * 1024;
     b_info->target_memkb = b_info->max_memkb;
     if (c_info->hvm) {
-        b_info->shadow_memkb = libxl_get_required_shadow_memory(b_info->max_memkb, b_info->max_vcpus);
+        b_info->shadow_memkb = 0; /* Set later */
         b_info->video_memkb = 8 * 1024;
         b_info->kernel = "hvmloader";
         b_info->hvm = 1;
@@ -478,12 +478,17 @@ static void parse_config_data(const char *configfile_filename_report,
         b_info->target_memkb = b_info->max_memkb;
     }
 
+    /* libxl_get_required_shadow_memory() must be called after final values
+     * (default or specified) for vcpus and memory are set, because the
+     * calculation depends on those values. */
+    b_info->shadow_memkb = !xlu_cfg_get_long(config, "shadow_memory", &l)
+        ? l * 1024
+        : libxl_get_required_shadow_memory(b_info->max_memkb,
+                                           b_info->max_vcpus);
+
     if (!xlu_cfg_get_long(config, "tsc_mode", &l))
         b_info->tsc_mode = l;
 
-    if (!xlu_cfg_get_long (config, "shadow_memory", &l))
-        b_info->shadow_memkb = l * 1024;
-
     if (!xlu_cfg_get_long (config, "videoram", &l))
         b_info->video_memkb = l * 1024;