[libvirt] [libvirt-glib 4/4] config: Add gvir_config_domain_[gs]et_current_memory

Christophe Fergeau cfergeau at redhat.com
Tue Sep 4 12:44:48 UTC 2012


libvirt will insert a <currentMemory> node when setting the domain
maximum memory. If we want to be able to later increase the domain
maximum memory, libvirt-gconfig needs to be able to set this
currentMemory node as well, otherwise this will cap the available
memory in the domain.
---
 libvirt-gconfig/libvirt-gconfig-domain.c | 64 +++++++++++++++++++++++++++++++-
 libvirt-gconfig/libvirt-gconfig-domain.h |  2 +
 libvirt-gconfig/libvirt-gconfig.sym      |  6 +++
 3 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c
index dd4e232..e679e3a 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain.c
@@ -43,7 +43,8 @@ enum {
     PROP_DESCRIPTION,
     PROP_MEMORY,
     PROP_VCPU,
-    PROP_FEATURES
+    PROP_FEATURES,
+    PROP_CURRENT_MEMORY
 };
 
 static void gvir_config_domain_get_property(GObject *object,
@@ -66,6 +67,9 @@ static void gvir_config_domain_get_property(GObject *object,
     case PROP_MEMORY:
         g_value_set_uint64(value, gvir_config_domain_get_memory(domain));
         break;
+    case PROP_CURRENT_MEMORY:
+        g_value_set_uint64(value, gvir_config_domain_get_current_memory(domain));
+        break;
     case PROP_VCPU:
         g_value_set_uint64(value, gvir_config_domain_get_vcpus(domain));
         break;
@@ -98,6 +102,9 @@ static void gvir_config_domain_set_property(GObject *object,
     case PROP_MEMORY:
         gvir_config_domain_set_memory(domain, g_value_get_uint64(value));
         break;
+    case PROP_CURRENT_MEMORY:
+        gvir_config_domain_set_current_memory(domain, g_value_get_uint64(value));
+        break;
     case PROP_VCPU:
         gvir_config_domain_set_vcpus(domain, g_value_get_uint64(value));
         break;
@@ -153,6 +160,15 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass)
                                                         G_PARAM_READWRITE |
                                                         G_PARAM_STATIC_STRINGS));
     g_object_class_install_property(object_class,
+                                    PROP_CURRENT_MEMORY,
+                                    g_param_spec_uint64("current-memory",
+                                                        "Current memory",
+                                                        "Current Guest Memory (in kilobytes)",
+                                                        0, G_MAXUINT64,
+                                                        0,
+                                                        G_PARAM_READWRITE |
+                                                        G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property(object_class,
                                     PROP_VCPU,
                                     g_param_spec_uint64("vcpu",
                                                         "Virtual CPUs",
@@ -361,6 +377,27 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain)
 }
 
 /**
+ * gvir_config_domain_get_current_memory:
+ * @domain: a #GVirConfigDomain
+ *
+ * Returns: current amount of RAM in kilobytes (i.e. blocks of 1024 bytes).
+ */
+guint64 gvir_config_domain_get_current_memory(GVirConfigDomain *domain)
+{
+    const char *unit;
+    guint64 unit_base;
+    guint64 memory;
+
+    unit = gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(domain), "currentMemory", "unit");
+    unit_base = get_unit_base(unit, 1024);
+
+    memory = gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain),
+                                                        "currentMemory");
+
+    return memory * unit_base / 1024;
+}
+
+/**
  * gvir_config_domain_set_memory:
  * @domain: a #GVirConfigDomain
  * @memory: The maximum amount of RAM in kilobytes.
@@ -380,6 +417,31 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory)
     g_object_notify(G_OBJECT(domain), "memory");
 }
 
+/**
+ * gvir_config_domain_set_current_memory:
+ * @domain: a #GVirConfigDomain
+ * @memory: The current amount of RAM in kilobytes.
+ *
+ * Sets the current amount of RAM allocated to @domain in kilobytes (i.e.
+ * blocks of 1024 bytes). This can be set to less than the maximum domain
+ * memory to allow to balloon the guest memory on the fly. Be aware that
+ * libvirt will set it automatically if it's not explictly set, which means
+ * you may need to set this value in addition to 'memory' if you want to
+ * change the available domain memory after creation.
+ */
+void gvir_config_domain_set_current_memory(GVirConfigDomain *domain,
+                                           guint64 memory)
+{
+    GVirConfigObject *node;
+
+    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), "currentMemory");
+    gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(node), NULL, memory);
+    gvir_config_object_set_attribute(GVIR_CONFIG_OBJECT(node),
+                                     "unit", "KiB",
+                                     NULL);
+    g_object_notify(G_OBJECT(domain), "current-memory");
+}
+
 guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain)
 {
     return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain),
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h
index b9a0dce..a7bd73b 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain.h
+++ b/libvirt-gconfig/libvirt-gconfig-domain.h
@@ -108,6 +108,8 @@ const char *gvir_config_domain_get_description(GVirConfigDomain *domain);
 void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *description);
 guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain);
 void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory);
+guint64 gvir_config_domain_get_current_memory(GVirConfigDomain *domain);
+void gvir_config_domain_set_current_memory(GVirConfigDomain *domain, guint64 memory);
 guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain);
 void gvir_config_domain_set_vcpus(GVirConfigDomain *domain,
                                   guint64 vcpu_count);
diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym
index 7507d45..f83eabb 100644
--- a/libvirt-gconfig/libvirt-gconfig.sym
+++ b/libvirt-gconfig/libvirt-gconfig.sym
@@ -460,4 +460,10 @@ LIBVIRT_GCONFIG_0.1.0 {
 	gvir_config_domain_cpu_feature_set_policy;
 } LIBVIRT_GCONFIG_0.0.9;
 
+LIBVIRT_GCONFIG_0.1.3 {
+  global:
+	gvir_config_domain_get_current_memory;
+	gvir_config_domain_set_current_memory;
+} LIBVIRT_GCONFIG_0.1.0;
+
 # .... define new API here using predicted next version number ....
-- 
1.7.11.4




More information about the libvir-list mailing list