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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list