[libvirt] [dbus PATCH 01/10] Implement NodeGetCellsFreeMemory method for Connect Interface

Katerina Koukiou posted 10 patches 7 years ago
There is a newer version of this series
[libvirt] [dbus PATCH 01/10] Implement NodeGetCellsFreeMemory method for Connect Interface
Posted by Katerina Koukiou 7 years ago
Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com>
---
 data/org.libvirt.Connect.xml |  7 +++++++
 src/connect.c                | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml
index ee7bfdc..1502849 100644
--- a/data/org.libvirt.Connect.xml
+++ b/data/org.libvirt.Connect.xml
@@ -166,6 +166,13 @@
       <arg name="uuid" type="s" direction="in"/>
       <arg name="network" type="o" direction="out"/>
     </method>
+    <method name="NodeGetCellsFreeMemory">
+      <annotation name="org.gtk.GDBus.DocString"
+          value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetCellsFreeMemory"/>
+      <arg name="startCell" type="i" direction="in"/>
+      <arg name="maxCells" type="i" direction="in"/>
+      <arg name="freeMems" type="at" direction="out"/>
+    </method>
     <signal name="DomainEvent">
       <annotation name="org.gtk.GDBus.DocString"
         value="See https://libvirt.org/html/libvirt-libvirt-domain.html#virConnectDomainEventCallback"/>
diff --git a/src/connect.c b/src/connect.c
index 5e577e4..78b438e 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -842,6 +842,44 @@ virtDBusConnectNetworkLookupByUUID(GVariant *inArgs,
     *outArgs = g_variant_new("(o)", path);
 }
 
+static void
+virtDBusConnectNodeGetCellsFreeMemory(GVariant *inArgs,
+                                      GUnixFDList *inFDs G_GNUC_UNUSED,
+                                      const gchar *objectPath G_GNUC_UNUSED,
+                                      gpointer userData,
+                                      GVariant **outArgs,
+                                      GUnixFDList **outFDs G_GNUC_UNUSED,
+                                      GError **error)
+{
+    virtDBusConnect *connect = userData;
+    gint startCell;
+    gint maxCells;
+    g_autofree guint64 *freeMems = NULL;
+    gint ret;
+    GVariantBuilder builder;
+    GVariant *res;
+
+    g_variant_get(inArgs, "(ii)", &startCell, &maxCells);
+
+    if (!virtDBusConnectOpen(connect, error))
+        return;
+
+    freeMems = g_new0(guint64, maxCells);
+
+    ret = virNodeGetCellsFreeMemory(connect->connection,
+                                    (unsigned long long *)freeMems,
+                                    startCell, maxCells);
+    if (ret < 0)
+        return virtDBusUtilSetLastVirtError(error);
+
+    g_variant_builder_init(&builder, G_VARIANT_TYPE("at"));
+    for (gint i = 0; i < ret; i++)
+        g_variant_builder_add(&builder, "t", freeMems[i]);
+    res = g_variant_builder_end(&builder);
+
+    *outArgs = g_variant_new_tuple(&res, 1);
+}
+
 static virtDBusGDBusPropertyTable virtDBusConnectPropertyTable[] = {
     { "Encrypted", virtDBusConnectGetEncrypted, NULL },
     { "Hostname", virtDBusConnectGetHostname, NULL },
@@ -873,6 +911,7 @@ static virtDBusGDBusMethodTable virtDBusConnectMethodTable[] = {
     { "NetworkDefineXML", virtDBusConnectNetworkDefineXML },
     { "NetworkLookupByName", virtDBusConnectNetworkLookupByName },
     { "NetworkLookupByUUID", virtDBusConnectNetworkLookupByUUID },
+    { "NodeGetCellsFreeMemory", virtDBusConnectNodeGetCellsFreeMemory },
     { 0 }
 };
 
-- 
2.15.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [dbus PATCH 01/10] Implement NodeGetCellsFreeMemory method for Connect Interface
Posted by Pavel Hrdina 7 years ago
On Thu, Apr 26, 2018 at 04:54:08PM +0200, Katerina Koukiou wrote:
> Signed-off-by: Katerina Koukiou <kkoukiou@redhat.com>
> ---
>  data/org.libvirt.Connect.xml |  7 +++++++
>  src/connect.c                | 39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 46 insertions(+)
> 
> diff --git a/data/org.libvirt.Connect.xml b/data/org.libvirt.Connect.xml
> index ee7bfdc..1502849 100644
> --- a/data/org.libvirt.Connect.xml
> +++ b/data/org.libvirt.Connect.xml
> @@ -166,6 +166,13 @@
>        <arg name="uuid" type="s" direction="in"/>
>        <arg name="network" type="o" direction="out"/>
>      </method>
> +    <method name="NodeGetCellsFreeMemory">
> +      <annotation name="org.gtk.GDBus.DocString"
> +          value="See https://libvirt.org/html/libvirt-libvirt-host.html#virNodeGetCellsFreeMemory"/>
> +      <arg name="startCell" type="i" direction="in"/>
> +      <arg name="maxCells" type="i" direction="in"/>
> +      <arg name="freeMems" type="at" direction="out"/>
> +    </method>

Another example of bad design of libvirt API.  We can do a better job in
libvirt-dbus to always return an array of free memory for all NUMA
nodes.

However, there is no other way how to get the number of NUMA nodes
except for parsing XML output of virConnectGetCapabilities() API. That
means that we need to use libxml2 library to parse the XML.

Pavel
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list