[libvirt] [libvirt-glib 4/4] config: Add gvir_config_domain_[gs]et_current_memory
Daniel P. Berrange
berrange at redhat.com
Fri Sep 7 12:28:03 UTC 2012
On Tue, Sep 04, 2012 at 02:44:48PM +0200, Christophe Fergeau wrote:
> 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 ....
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list