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

Re: [Xen-devel] [PATCH v2 for-4.5] libxl: account for romfile memory



On 11/25/14 07:43, Stefano Stabellini wrote:
Account for the extra memory needed for the rom files of any emulated nics:
QEMU uses xc_domain_populate_physmap_exact to allocate the memory for
each them. Assume 256K each.

I have seen that this is no longer planned for 4.5, but I do think that libxl will
still be changed for this.

so

  int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
  {
      GC_INIT(ctx);
      char *mem, *endptr;
      uint32_t memorykb;
      char *dompath = libxl__xs_get_dompath(gc, domid);
-    int rc = 1;
+    int rc = 1, romsize;
mem = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/memory/target", dompath));
      if (!mem) {
@@ -4550,11 +4577,18 @@ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t 
domid, uint32_t max_memkb)
          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "memory_static_max must be greater 
than or or equal to memory_dynamic_max\n");
          goto out;
      }
-    rc = xc_domain_setmaxmem(ctx->xch, domid, max_memkb + 
LIBXL_MAXMEM_CONSTANT);
+    rc = libxl__get_rom_memory_kb(gc, domid, NULL);
+    if (rc < 0)
+        goto out;
+    romsize = rc;
+    rc = xc_domain_setmaxmem(ctx->xch, domid,
+                             max_memkb + LIBXL_MAXMEM_CONSTANT
+                             + romsize);

Keeping LIBXL_MAXMEM_CONSTANT is wrong.  Should be dropped.

      if (rc != 0) {
          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
                  "xc_domain_setmaxmem domid=%d memkb=%d failed "
-                "rc=%d\n", domid, max_memkb + LIBXL_MAXMEM_CONSTANT, rc);
+                "rc=%d\n", domid, max_memkb + LIBXL_MAXMEM_CONSTANT +
+                romsize, rc);
          goto out;
      }

And here.

@@ -4683,7 +4717,7 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t 
domid,
          int32_t target_memkb, int relative, int enforce)
  {
      GC_INIT(ctx);
-    int rc = 1, abort_transaction = 0;
+    int rc = 1, abort_transaction = 0, romsize;
      uint32_t memorykb = 0, videoram = 0;
      uint32_t current_target_memkb = 0, new_target_memkb = 0;
      uint32_t current_max_memkb = 0;
@@ -4769,12 +4803,19 @@ retry_transaction:
if (enforce) {
          memorykb = new_target_memkb;
+        rc = libxl__get_rom_memory_kb(gc, domid, NULL);
+        if (rc < 0) {
+            abort_transaction = 1;
+            goto out;
+        }
+        romsize = rc;
          rc = xc_domain_setmaxmem(ctx->xch, domid, memorykb +
-                LIBXL_MAXMEM_CONSTANT);
+                LIBXL_MAXMEM_CONSTANT + romsize);

And here.

          if (rc != 0) {
              LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
                      "xc_domain_setmaxmem domid=%d memkb=%d failed "
-                    "rc=%d\n", domid, memorykb + LIBXL_MAXMEM_CONSTANT, rc);
+                    "rc=%d\n", domid, memorykb + LIBXL_MAXMEM_CONSTANT +
+                    romsize, rc);
              abort_transaction = 1;
              goto out;
          }
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 74ea84b..733f4c7 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -305,7 +305,7 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid,
      libxl_domain_build_info *const info = &d_config->b_info;
      libxl_ctx *ctx = libxl__gc_owner(gc);
      char *xs_domid, *con_domid;
-    int rc;
+    int rc, romsize;
if (xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus) != 0) {
          LOG(ERROR, "Couldn't set max vcpu count");
@@ -405,8 +405,12 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid,
          }
      }
+ rc = libxl__get_rom_memory_kb(gc, domid, d_config);
+       if (rc < 0)
+               return rc;
+       romsize = rc;
      if (xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb +
-        LIBXL_MAXMEM_CONSTANT) < 0) {
+        LIBXL_MAXMEM_CONSTANT + romsize) < 0) {
          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't set max memory");
          return ERROR_FAIL;
      }
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 4361421..33826ea 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -90,6 +90,7 @@
  #define LIBXL_XENCONSOLE_LIMIT 1048576
  #define LIBXL_XENCONSOLE_PROTOCOL "vt100"
  #define LIBXL_MAXMEM_CONSTANT 1024
+#define LIBXL_ROMSIZE_KB 256
  #define LIBXL_PV_EXTRA_MEMORY 1024
  #define LIBXL_HVM_EXTRA_MEMORY 2048

This should be "romsize" + 1024 as far as I know.

  #define LIBXL_MIN_DOM0_MEM (128*1024)
@@ -1023,6 +1024,12 @@ _hidden char * libxl__domain_pvcontrol_read(libxl__gc 
*gc,
  _hidden int libxl__domain_pvcontrol_write(libxl__gc *gc, xs_transaction_t t,
                                            uint32_t domid, const char *cmd);
+/* Returns the amount of extra mem required to allocate roms or an libxl
+ * error code on error.
+ * The *d_config parameter is optional.
+ */
+_hidden int libxl__get_rom_memory_kb(libxl__gc *gc, uint32_t domid, 
libxl_domain_config *d_config);
+
  /* from xl_device */
  _hidden char *libxl__device_disk_string_of_backend(libxl_disk_backend 
backend);
  _hidden char *libxl__device_disk_string_of_format(libxl_disk_format format);

    -Don Slutz

_______________________________________________
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®.