+Fri Sep 28 16:17:41 CEST 2007 Daniel Veillard <veillard@redhat.com>
+
+ * include/libvirt/libvirt.h[.in] src/driver.h src/openvz_driver.c
+ src/qemu_driver.c src/remote_internal.c src/test.c
+ src/xen_internal.[ch] src/xen_unified.c src/xend_internal.[ch]
+ src/libvirt.c src/libvirt_sym.version: adding NUMA support patches
+ from Beth Kon adding new virNodeGetCellsFreeMemory entry point
+ and extending the virConnectGetCapabilities one. Fix a couple of
+ issues in the patch and add to exported symbols from shared lib.
+ * docs/virsh.pod docs/virsh.1 src/virsh.c: added new command
+ freecell to get the available memory on the node or in a NUMA cell.
+ * docs/*: updated and regenerated the documentation
+
Fri Sep 28 11:20:00 BST 2007 Richard W.M. Jones <rjones@redhat.com>
* docs/libvir.html: Clarified configuration required for
</dd><dt>Linux</dt><dd><a href="html/libvirt-libvirt.html#virDomainCreateLinux">virDomainCreateLinux</a><br />
</dd></dl><h2>Letter M:</h2><dl><dt>Macro</dt><dd><a href="html/libvirt-libvirt.html#LIBVIR_VERSION_NUMBER">LIBVIR_VERSION_NUMBER</a><br />
<a href="html/libvirt-libvirt.html#VIR_DOMAIN_SCHED_FIELD_LENGTH">VIR_DOMAIN_SCHED_FIELD_LENGTH</a><br />
+</dd><dt>Maximum</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>Mbps</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd><dt>Migrate</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd></dl><h2>Letter N:</h2><dl><dt>NUMA</dt><dd><a href="html/libvirt-libvirt.html#_virNodeInfo">_virNodeInfo</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>Normally</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetURI">virConnectGetURI</a><br />
</dd><dt>Note</dt><dd><a href="html/libvirt-libvirt.html#virDomainCoreDump">virDomainCoreDump</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetInfo">virDomainGetInfo</a><br />
<a href="html/libvirt-libvirt.html#virConnectNumOfNetworks">virConnectNumOfNetworks</a><br />
<a href="html/libvirt-libvirt.html#virDomainSuspend">virDomainSuspend</a><br />
</dd><dt>add</dt><dd><a href="html/libvirt-libvirt.html#virDomainShutdown">virDomainShutdown</a><br />
+</dd><dt>additional</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>address</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd><dt>after</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetCapabilities">virConnectGetCapabilities</a><br />
<a href="html/libvirt-libvirt.html#virDomainReboot">virDomainReboot</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSuspend">virDomainSuspend</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-libvirt.html#virNodeGetInfo">virNodeGetInfo</a><br />
</dd><dt>allowed</dt><dd><a href="html/libvirt-libvirt.html#_virDomainInfo">_virDomainInfo</a><br />
</dd><dt>already</dt><dd><a href="html/libvirt-libvirt.html#virDomainDestroy">virDomainDestroy</a><br />
</dd><dt>amount</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetMaxMemory">virDomainGetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>analysis</dt><dd><a href="html/libvirt-libvirt.html#virDomainCoreDump">virDomainCoreDump</a><br />
</dd><dt>anymore</dt><dd><a href="html/libvirt-libvirt.html#virDomainSave">virDomainSave</a><br />
</dd><dt>application</dt><dd><a href="html/libvirt-libvirt.html#virConnectClose">virConnectClose</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetUUID">virNetworkGetUUID</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetUUIDString">virNetworkGetUUIDString</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>associated</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetConnect">virDomainGetConnect</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetConnect">virNetworkGetConnect</a><br />
</dd><dt>assumed</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
<a href="html/libvirt-libvirt.html#virNetworkCreate">virNetworkCreate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkDestroy">virNetworkDestroy</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetConnect">virNetworkGetConnect</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>callback</dt><dd><a href="html/libvirt-virterror.html#virConnSetErrorFunc">virConnSetErrorFunc</a><br />
<a href="html/libvirt-virterror.html#virErrorFunc">virErrorFunc</a><br />
<a href="html/libvirt-virterror.html#virSetErrorFunc">virSetErrorFunc</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetXMLDesc">virDomainGetXMLDesc</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetBridgeName">virNetworkGetBridgeName</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>calling</dt><dd><a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainResume">virDomainResume</a><br />
</dd><dt>calloc</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetInfo">virDomainGetInfo</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virDomainPinVcpu">virDomainPinVcpu</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>cannot</dt><dd><a href="html/libvirt-libvirt.html#virDomainLookupByID">virDomainLookupByID</a><br />
<a href="html/libvirt-libvirt.html#virDomainLookupByName">virDomainLookupByName</a><br />
<a href="html/libvirt-libvirt.html#virDomainLookupByUUID">virDomainLookupByUUID</a><br />
<a href="html/libvirt-virterror.html#virResetLastError">virResetLastError</a><br />
<a href="html/libvirt-virterror.html#virSetErrorFunc">virSetErrorFunc</a><br />
</dd><dt>cell</dt><dd><a href="html/libvirt-libvirt.html#_virNodeInfo">_virNodeInfo</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
+</dd><dt>cells</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>change</dt><dd><a href="html/libvirt-libvirt.html#virDomainPinVcpu">virDomainPinVcpu</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainInterfaceStats">virDomainInterfaceStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virDomainPinVcpu">virDomainPinVcpu</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
+</dd><dt>either</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>element</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetMaxVcpus">virConnectGetMaxVcpus</a><br />
</dd><dt>else</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd><dt>encoded</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetXMLDesc">virDomainGetXMLDesc</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
+</dd><dt>entries</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>especially</dt><dd><a href="html/libvirt-libvirt.html#virConnectClose">virConnectClose</a><br />
</dd><dt>etc</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd><dt>even</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virDomainSave">virDomainSave</a><br />
</dd><dt>filled</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetSchedulerParameters">virDomainGetSchedulerParameters</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>find</dt><dd><a href="html/libvirt-libvirt.html#virDomainLookupByID">virDomainLookupByID</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd><dt>finding</dt><dd><a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
</dd><dt>first</dt><dd><a href="html/libvirt-libvirt.html#virConnectOpen">virConnectOpen</a><br />
<a href="html/libvirt-libvirt.html#virConnectOpenReadOnly">virConnectOpenReadOnly</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>flags</dt><dd><a href="html/libvirt-libvirt.html#virDomainCoreDump">virDomainCoreDump</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetXMLDesc">virDomainGetXMLDesc</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetXMLDesc">virDomainGetXMLDesc</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetBridgeName">virNetworkGetBridgeName</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
+</dd><dt>freeMems</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>freed</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetHostname">virConnectGetHostname</a><br />
<a href="html/libvirt-libvirt.html#virConnectGetURI">virConnectGetURI</a><br />
<a href="html/libvirt-libvirt.html#virDomainDestroy">virDomainDestroy</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetMaxVcpus">virDomainGetMaxVcpus</a><br />
</dd><dt>increased</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetConnect">virDomainGetConnect</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetConnect">virNetworkGetConnect</a><br />
+</dd><dt>index</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>indicates</dt><dd><a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainInterfaceStats">virDomainInterfaceStats</a><br />
</dd><dt>indicating</dt><dd><a href="html/libvirt-libvirt.html#_virNodeInfo">_virNodeInfo</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetAutostart">virDomainGetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetAutostart">virNetworkGetAutostart</a><br />
</dd><dt>info</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>information</dt><dd><a href="html/libvirt-virterror.html#_virError">_virError</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetInfo">virDomainGetInfo</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetUUIDString">virDomainGetUUIDString</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
<a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetUUIDString">virNetworkGetUUIDString</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-libvirt.html#virNodeGetInfo">virNodeGetInfo</a><br />
</dd><dt>informative</dt><dd><a href="html/libvirt-virterror.html#_virError">_virError</a><br />
</dd><dt>initializing</dt><dd><a href="html/libvirt-libvirt.html#virInitialize">virInitialize</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetMaxMemory">virDomainGetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>knowing</dt><dd><a href="html/libvirt-libvirt.html#virDomainShutdown">virDomainShutdown</a><br />
</dd></dl><h2>Letter l:</h2><dl><dt>lack</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetVersion">virConnectGetVersion</a><br />
</dd><dt>languages</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetConnect">virDomainGetConnect</a><br />
</dd><dt>listed</dt><dd><a href="html/libvirt-libvirt.html#virDomainSave">virDomainSave</a><br />
</dd><dt>little-endian</dt><dd><a href="html/libvirt-libvirt.html#virDomainPinVcpu">virDomainPinVcpu</a><br />
</dd><dt>live</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
+</dd><dt>long</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>looked</dt><dd><a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
</dd><dt>lookup</dt><dd><a href="html/libvirt-libvirt.html#virDomainLookupByName">virDomainLookupByName</a><br />
<a href="html/libvirt-libvirt.html#virDomainLookupByUUID">virDomainLookupByUUID</a><br />
</dd><dt>maplen</dt><dd><a href="">cpumap</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
<a href="html/libvirt-libvirt.html#virDomainPinVcpu">virDomainPinVcpu</a><br />
+</dd><dt>maxCells</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>maximum</dt><dd><a href="html/libvirt-libvirt.html#_virDomainInfo">_virDomainInfo</a><br />
<a href="html/libvirt-libvirt.html#virConnectGetMaxVcpus">virConnectGetMaxVcpus</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetMaxMemory">virDomainGetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSuspend">virDomainSuspend</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>message</dt><dd><a href="html/libvirt-virterror.html#_virError">_virError</a><br />
</dd><dt>method</dt><dd><a href="html/libvirt-libvirt.html#virDomainCoreDump">virDomainCoreDump</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virDomainInterfaceStats">virDomainInterfaceStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetUUIDString">virNetworkGetUUIDString</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>moves</dt><dd><a href="html/libvirt-libvirt.html#virDomainCreate">virDomainCreate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkCreate">virNetworkCreate</a><br />
</dd><dt>msg00096</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetType">virConnectGetType</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetBridgeName">virNetworkGetBridgeName</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>mysterious</dt><dd><a href="html/libvirt-libvirt.html#_virDomainBlockStats">_virDomainBlockStats</a><br />
</dd></dl><h2 align="center"><a href="APIchunk0.html">A-V</a>
<a href="APIchunk1.html">W-c</a>
<a href="html/libvirt-libvirt.html#virNetworkLookupByUUID">virNetworkLookupByUUID</a><br />
<a href="html/libvirt-libvirt.html#virNetworkLookupByUUIDString">virNetworkLookupByUUIDString</a><br />
</dd><dt>node</dt><dd><a href="html/libvirt-libvirt.html#_virNodeInfo">_virNodeInfo</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-libvirt.html#virNodeGetInfo">virNodeGetInfo</a><br />
</dd><dt>non</dt><dd><a href="html/libvirt-libvirt.html#VIR_CPU_USABLE">VIR_CPU_USABLE</a><br />
</dd><dt>non-NULL</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetURI">virConnectGetURI</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetVcpus">virDomainGetVcpus</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkCreateXML">virNetworkCreateXML</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>only</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetVersion">virConnectGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virDomainGetInfo">virDomainGetInfo</a><br />
</dd><dt>oo_req</dt><dd><a href="html/libvirt-libvirt.html#_virDomainBlockStats">_virDomainBlockStats</a><br />
</dd><dt>reporting</dt><dd><a href="html/libvirt-virterror.html#virDefaultErrorFunc">virDefaultErrorFunc</a><br />
</dd><dt>request</dt><dd><a href="html/libvirt-libvirt.html#virDomainReboot">virDomainReboot</a><br />
<a href="html/libvirt-libvirt.html#virDomainShutdown">virDomainShutdown</a><br />
+</dd><dt>requested</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>required</dt><dd><a href="html/libvirt-libvirt.html#VIR_CPU_MAPLEN">VIR_CPU_MAPLEN</a><br />
<a href="html/libvirt-libvirt.html#VIR_UUID_BUFLEN">VIR_UUID_BUFLEN</a><br />
<a href="html/libvirt-libvirt.html#VIR_UUID_STRING_BUFLEN">VIR_UUID_STRING_BUFLEN</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virNetworkDestroy">virNetworkDestroy</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>returned</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetCapabilities">virConnectGetCapabilities</a><br />
<a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainCreateLinux">virDomainCreateLinux</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetAutostart">virNetworkGetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetBridgeName">virNetworkGetBridgeName</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>returns</dt><dd><a href="html/libvirt-libvirt.html#VIR_CPU_MAPLEN">VIR_CPU_MAPLEN</a><br />
<a href="html/libvirt-libvirt.html#VIR_CPU_USABLE">VIR_CPU_USABLE</a><br />
<a href="html/libvirt-libvirt.html#VIR_GET_CPUMAP">VIR_GET_CPUMAP</a><br />
<a href="html/libvirt-libvirt.html#virConnectGetVersion">virConnectGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainInterfaceStats">virDomainInterfaceStats</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>reused</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetXMLDesc">virDomainGetXMLDesc</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
</dd><dt>routine</dt><dd><a href="html/libvirt-virterror.html#virDefaultErrorFunc">virDefaultErrorFunc</a><br />
<a href="html/libvirt-libvirt.html#virDomainPinVcpu">virDomainPinVcpu</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
+</dd><dt>smaller</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>socket</dt><dd><a href="html/libvirt-libvirt.html#_virNodeInfo">_virNodeInfo</a><br />
</dd><dt>software</dt><dd><a href="html/libvirt-libvirt.html#virConnectGetType">virConnectGetType</a><br />
</dd><dt>source</dt><dd><a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
</dd><dt>start</dt><dd><a href="html/libvirt-libvirt.html#virDomainDefineXML">virDomainDefineXML</a><br />
<a href="html/libvirt-libvirt.html#virNetworkCreate">virNetworkCreate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkCreateXML">virNetworkCreateXML</a><br />
+</dd><dt>startCell</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>started</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetAutostart">virDomainGetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetAutostart">virDomainSetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetAutostart">virNetworkGetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virNetworkSetAutostart">virNetworkSetAutostart</a><br />
+</dd><dt>starting</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>startup</dt><dd><a href="html/libvirt-libvirt.html#virInitialize">virInitialize</a><br />
</dd><dt>state</dt><dd><a href="html/libvirt-libvirt.html#_virDomainInfo">_virDomainInfo</a><br />
<a href="html/libvirt-libvirt.html#virDomainResume">virDomainResume</a><br />
</dd><dt>uniform</dt><dd><a href="html/libvirt-libvirt.html#_virNodeInfo">_virNodeInfo</a><br />
</dd><dt>unknown</dt><dd><a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
</dd><dt>unsigned</dt><dd><a href="html/libvirt-libvirt.html#virDomainGetID">virDomainGetID</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>unused</dt><dd><a href="html/libvirt-libvirt.html#virDomainCoreDump">virDomainCoreDump</a><br />
</dd><dt>uri</dt><dd><a href="html/libvirt-libvirt.html#virConnectOpen">virConnectOpen</a><br />
<a href="html/libvirt-libvirt.html#virConnectOpenReadOnly">virConnectOpenReadOnly</a><br />
<a href="html/libvirt-virterror.html#virGetLastError">virGetLastError</a><br />
<a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetBridgeName">virNetworkGetBridgeName</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-virterror.html#virSetErrorFunc">virSetErrorFunc</a><br />
+</dd><dt>whichever</dt><dd><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>while</dt><dd><a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
</dd><dt>will</dt><dd><a href="html/libvirt-virterror.html#virConnCopyLastError">virConnCopyLastError</a><br />
<a href="html/libvirt-virterror.html#virConnSetErrorFunc">virConnSetErrorFunc</a><br />
<a href="html/libvirt-libvirt.html#virDomainSuspend">virDomainSuspend</a><br />
<a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetName">virNetworkGetName</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-virterror.html#virSetErrorFunc">virSetErrorFunc</a><br />
</dd><dt>with</dt><dd><a href="html/libvirt-libvirt.html#VIR_COPY_CPUMAP">VIR_COPY_CPUMAP</a><br />
<a href="html/libvirt-libvirt.html#VIR_CPU_MAPLEN">VIR_CPU_MAPLEN</a><br />
<a href="html/libvirt-libvirt.html#virDomainMigrate">virDomainMigrate</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetConnect">virNetworkGetConnect</a><br />
<a href="html/libvirt-libvirt.html#virNetworkGetXMLDesc">virNetworkGetXMLDesc</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</dd><dt>within</dt><dd><a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
<a href="html/libvirt-libvirt.html#virDomainInterfaceStats">virDomainInterfaceStats</a><br />
</dd><dt>without</dt><dd><a href="html/libvirt-libvirt.html#virDomainSuspend">virDomainSuspend</a><br />
<a href="html/libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a><br />
<a href="html/libvirt-libvirt.html#virNetworkSetAutostart">virNetworkSetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virNetworkUndefine">virNetworkUndefine</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-libvirt.html#virNodeGetInfo">virNodeGetInfo</a><br />
<a href="html/libvirt-libvirt.html#virNodeInfo">virNodeInfo</a><br />
<a href="html/libvirt-libvirt.html#virNodeInfoPtr">virNodeInfoPtr</a><br />
<a href="html/libvirt-libvirt.html#virDomainSetMemory">virDomainSetMemory</a><br />
</p><h2>Type unsigned long *:</h2><p><a href="html/libvirt-libvirt.html#virConnectGetVersion">virConnectGetVersion</a><br />
<a href="html/libvirt-libvirt.html#virGetVersion">virGetVersion</a><br />
+</p><h2>Type unsigned long long *:</h2><p><a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
</p><h2>Type virConnectPtr:</h2><p><a href="html/libvirt-virterror.html#virConnCopyLastError">virConnCopyLastError</a><br />
<a href="html/libvirt-virterror.html#virConnGetLastError">virConnGetLastError</a><br />
<a href="html/libvirt-virterror.html#virConnResetLastError">virConnResetLastError</a><br />
<a href="html/libvirt-libvirt.html#virNetworkLookupByName">virNetworkLookupByName</a><br />
<a href="html/libvirt-libvirt.html#virNetworkLookupByUUID">virNetworkLookupByUUID</a><br />
<a href="html/libvirt-libvirt.html#virNetworkLookupByUUIDString">virNetworkLookupByUUIDString</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-libvirt.html#virNodeGetInfo">virNodeGetInfo</a><br />
</p><h2>Type virDomainBlockStatsPtr:</h2><p><a href="html/libvirt-libvirt.html#virDomainBlockStats">virDomainBlockStats</a><br />
</p><h2>Type virDomainInfoPtr:</h2><p><a href="html/libvirt-libvirt.html#virDomainGetInfo">virDomainGetInfo</a><br />
<a href="html/libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a><br />
<a href="html/libvirt-libvirt.html#virNetworkSetAutostart">virNetworkSetAutostart</a><br />
<a href="html/libvirt-libvirt.html#virNetworkUndefine">virNetworkUndefine</a><br />
+<a href="html/libvirt-libvirt.html#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a><br />
<a href="html/libvirt-libvirt.html#virNodeGetInfo">virNodeGetInfo</a><br />
<a href="html/libvirt-libvirt.html#virNodeInfo">virNodeInfo</a><br />
<a href="html/libvirt-libvirt.html#virNodeInfoPtr">virNodeInfoPtr</a><br />
<a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> <a href="#virNetworkDefineXML">virNetworkDefineXML</a> (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br/> const char * xml);
int <a href="#virNetworkCreate">virNetworkCreate</a> (<a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> network);
int <a href="#virDomainSetSchedulerParameters">virDomainSetSchedulerParameters</a> (<a href="libvirt-libvirt.html#virDomainPtr">virDomainPtr</a> domain, <br/> <a href="libvirt-libvirt.html#virSchedParameterPtr">virSchedParameterPtr</a> params, <br/> int nparams);
+int <a href="#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a> (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br/> unsigned long long * freeMems, <br/> int startCell, <br/> int maxCells);
int <a href="#virConnectClose">virConnectClose</a> (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn);
int <a href="#virDomainReboot">virDomainReboot</a> (<a href="libvirt-libvirt.html#virDomainPtr">virDomainPtr</a> domain, <br/> unsigned int flags);
int <a href="#virDomainBlockStats">virDomainBlockStats</a> (<a href="libvirt-libvirt.html#virDomainPtr">virDomainPtr</a> dom, <br/> const char * path, <br/> <a href="libvirt-libvirt.html#virDomainBlockStatsPtr">virDomainBlockStatsPtr</a> stats, <br/> size_t size);
<div class="refsect2" lang="en"><h3><a name="virNetworkUndefine"/>virNetworkUndefine ()</h3><pre class="programlisting">int virNetworkUndefine (<a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> network)<br/>
</pre><p>Undefine a network but does not stop it if it is running</p>
<div class="variablelist"><table border="0"><col align="left"/><tbody><tr><td><span class="term"><i><tt>network</tt></i>:</span></td><td>pointer to a defined network</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>0 in case of success, -1 in case of error</td></tr></tbody></table></div></div>
+ <hr/>
+ <div class="refsect2" lang="en"><h3><a name="virNodeGetCellsFreeMemory"/>virNodeGetCellsFreeMemory ()</h3><pre class="programlisting">int virNodeGetCellsFreeMemory (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br/> unsigned long long * freeMems, <br/> int startCell, <br/> int maxCells)<br/>
+</pre><p>This call returns the amount of free memory in one or more NUMA cells. The @freeMems array must be allocated by the caller and will be filled with the amount of free memory in kilobytes for each cell requested, starting with startCell (in freeMems[0]), up to either (startCell + maxCells), or the number of additional cells in the node, whichever is smaller.</p>
+<div class="variablelist"><table border="0"><col align="left"/><tbody><tr><td><span class="term"><i><tt>conn</tt></i>:</span></td><td>pointer to the hypervisor connection</td></tr><tr><td><span class="term"><i><tt>freeMems</tt></i>:</span></td><td>pointer to the array of unsigned long long</td></tr><tr><td><span class="term"><i><tt>startCell</tt></i>:</span></td><td>index of first cell to return freeMems info on.</td></tr><tr><td><span class="term"><i><tt>maxCells</tt></i>:</span></td><td>Maximum number of cells for which freeMems information can be returned.</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of entries filled in freeMems, or -1 in case of error.</td></tr></tbody></table></div></div>
<hr/>
<div class="refsect2" lang="en"><h3><a name="virNodeGetInfo"/>virNodeGetInfo ()</h3><pre class="programlisting">int virNodeGetInfo (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br/> <a href="libvirt-libvirt.html#virNodeInfoPtr">virNodeInfoPtr</a> info)<br/>
</pre><p>Extract hardware information about the node.</p>
<pre class="programlisting"><a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> <a href="#virNetworkLookupByUUIDString">virNetworkLookupByUUIDString</a> (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br /> const char * uuidstr)</pre>
<pre class="programlisting">int <a href="#virNetworkSetAutostart">virNetworkSetAutostart</a> (<a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> network, <br /> int autostart)</pre>
<pre class="programlisting">int <a href="#virNetworkUndefine">virNetworkUndefine</a> (<a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> network)</pre>
+<pre class="programlisting">int <a href="#virNodeGetCellsFreeMemory">virNodeGetCellsFreeMemory</a> (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br /> unsigned long long * freeMems, <br /> int startCell, <br /> int maxCells)</pre>
<pre class="programlisting">int <a href="#virNodeGetInfo">virNodeGetInfo</a> (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br /> <a href="libvirt-libvirt.html#virNodeInfoPtr">virNodeInfoPtr</a> info)</pre>
<h2>Description</h2>
<h3><a name="LIBVIR_VERSION_NUMBER" id="LIBVIR_VERSION_NUMBER"></a>Macro: LIBVIR_VERSION_NUMBER</h3><pre>#define LIBVIR_VERSION_NUMBER</pre><p>Macro providing the version of the library as version * 1,000,000 + minor * 1000 + micro</p>
</pre><p>Configure the network to be automatically started when the host machine boots.</p>
<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>network</tt></i>:</span></td><td>a network object</td></tr><tr><td><span class="term"><i><tt>autostart</tt></i>:</span></td><td>whether the network should be automatically started 0 or 1</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>-1 in case of error, 0 in case of success</td></tr></tbody></table></div><h3><a name="virNetworkUndefine" id="virNetworkUndefine"></a>Function: virNetworkUndefine</h3><pre class="programlisting">int virNetworkUndefine (<a href="libvirt-libvirt.html#virNetworkPtr">virNetworkPtr</a> network)<br />
</pre><p>Undefine a network but does not stop it if it is running</p>
-<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>network</tt></i>:</span></td><td>pointer to a defined network</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>0 in case of success, -1 in case of error</td></tr></tbody></table></div><h3><a name="virNodeGetInfo" id="virNodeGetInfo"></a>Function: virNodeGetInfo</h3><pre class="programlisting">int virNodeGetInfo (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br /> <a href="libvirt-libvirt.html#virNodeInfoPtr">virNodeInfoPtr</a> info)<br />
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>network</tt></i>:</span></td><td>pointer to a defined network</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>0 in case of success, -1 in case of error</td></tr></tbody></table></div><h3><a name="virNodeGetCellsFreeMemory" id="virNodeGetCellsFreeMemory"></a>Function: virNodeGetCellsFreeMemory</h3><pre class="programlisting">int virNodeGetCellsFreeMemory (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br /> unsigned long long * freeMems, <br /> int startCell, <br /> int maxCells)<br />
+</pre><p>This call returns the amount of free memory in one or more NUMA cells. The @freeMems array must be allocated by the caller and will be filled with the amount of free memory in kilobytes for each cell requested, starting with startCell (in freeMems[0]), up to either (startCell + maxCells), or the number of additional cells in the node, whichever is smaller.</p>
+<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>conn</tt></i>:</span></td><td>pointer to the hypervisor connection</td></tr><tr><td><span class="term"><i><tt>freeMems</tt></i>:</span></td><td>pointer to the array of unsigned long long</td></tr><tr><td><span class="term"><i><tt>startCell</tt></i>:</span></td><td>index of first cell to return freeMems info on.</td></tr><tr><td><span class="term"><i><tt>maxCells</tt></i>:</span></td><td>Maximum number of cells for which freeMems information can be returned.</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>the number of entries filled in freeMems, or -1 in case of error.</td></tr></tbody></table></div><h3><a name="virNodeGetInfo" id="virNodeGetInfo"></a>Function: virNodeGetInfo</h3><pre class="programlisting">int virNodeGetInfo (<a href="libvirt-libvirt.html#virConnectPtr">virConnectPtr</a> conn, <br /> <a href="libvirt-libvirt.html#virNodeInfoPtr">virNodeInfoPtr</a> info)<br />
</pre><p>Extract hardware information about the node.</p>
<div class="variablelist"><table border="0"><col align="left" /><tbody><tr><td><span class="term"><i><tt>conn</tt></i>:</span></td><td>pointer to the hypervisor connection</td></tr><tr><td><span class="term"><i><tt>info</tt></i>:</span></td><td>pointer to a <a href="libvirt-libvirt.html#virNodeInfo">virNodeInfo</a> structure allocated by the user</td></tr><tr><td><span class="term"><i><tt>Returns</tt></i>:</span></td><td>0 in case of success and -1 in case of failure.</td></tr></tbody></table></div></div></div><div class="linkList2"><div class="llinks2"><h3 class="links2"><span>main menu</span></h3><ul><li><a href="../index.html">Home</a></li><li><a href="../html/index.html">API Menu</a></li><li><a href="../examples/index.html">C code examples</a></li><li><a href="../ChangeLog.html">Recent Changes</a></li></ul></div><div class="llinks2"><h3 class="links2"><span>related links</span></h3><ul><li><a href="https://www.redhat.com/archives/libvir-list/">Mail archive</a></li><li><a href="https://bugzilla.redhat.com/bugzilla/buglist.cgi?product=Fedora+Core&component=libvirt&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=MODIFIED&short_desc_type=allwordssubstr&short_desc=&long_desc_type=allwordssubstr">Open bugs</a></li><li><a href="http://virt-manager.et.redhat.com/">virt-manager</a></li><li><a href="http://search.cpan.org/~danberr/Sys-Virt-0.1.0/">Perl bindings</a></li><li><a href="http://et.redhat.com/~rjones/ocaml-libvirt/">OCaml bindings</a></li><li><a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html">Xen project</a></li><li><form action="../search.php" enctype="application/x-www-form-urlencoded" method="get"><input name="query" type="text" size="12" value="Search..." /><input name="submit" type="submit" value="Go" /></form></li><li><a href="http://xmlsoft.org/"><img src="../Libxml2-Logo-90x34.gif" alt="Made with Libxml2 Logo" /></a></li></ul><p class="credits">Graphics and design by <a href="mail:dfong@redhat.com">Diana Fong</a></p></div></div><div id="bottom"><p class="p1"></p></div></div></body></html>
<td> ≥ 0.2.0 </td>
<td> ≥ 0.2.0 </td>
<td> ≥ 0.3.0 </td>
+</tr><tr><td> virNodeGetCellsFreeMemory </td>
+ <td> 0.3.3 </td>
+ <td> ≥ 0.3.3 </td>
+ <td></td>
+ <td></td>
+ <td></td>
</tr></table><h3>Network functions</h3><p>
Network functions are not hypervisor-specific. For historical
reasons they require the QEMU daemon to be running (this
<td> ≥ 0.2.0 </td>
<td> ≥ 0.3.0 </td>
</tr>
+<tr>
+ <td> virNodeGetCellsFreeMemory </td>
+ <td> 0.3.3 </td>
+ <td> ≥ 0.3.3 </td>
+ <td></td>
+ <td></td>
+ <td></td>
+</tr>
</table>
<h3>Network functions</h3>
<exports symbol='virNetworkDefineXML' type='function'/>
<exports symbol='virNetworkCreate' type='function'/>
<exports symbol='virDomainSetSchedulerParameters' type='function'/>
+ <exports symbol='virNodeGetCellsFreeMemory' type='function'/>
<exports symbol='virConnectClose' type='function'/>
<exports symbol='virDomainReboot' type='function'/>
<exports symbol='virDomainBlockStats' type='function'/>
<return type='int' info='0 in case of success, -1 in case of error'/>
<arg name='network' type='virNetworkPtr' info='pointer to a defined network'/>
</function>
+ <function name='virNodeGetCellsFreeMemory' file='libvirt' module='libvirt'>
+ <info>This call returns the amount of free memory in one or more NUMA cells. The @freeMems array must be allocated by the caller and will be filled with the amount of free memory in kilobytes for each cell requested, starting with startCell (in freeMems[0]), up to either (startCell + maxCells), or the number of additional cells in the node, whichever is smaller.</info>
+ <return type='int' info='the number of entries filled in freeMems, or -1 in case of error.'/>
+ <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+ <arg name='freeMems' type='unsigned long long *' info='pointer to the array of unsigned long long'/>
+ <arg name='startCell' type='int' info='index of first cell to return freeMems info on.'/>
+ <arg name='maxCells' type='int' info='Maximum number of cells for which freeMems information can be returned.'/>
+ </function>
<function name='virNodeGetInfo' file='libvirt' module='libvirt'>
<info>Extract hardware information about the node.</info>
<return type='int' info='0 in case of success and -1 in case of failure.'/>
<reference name='virNetworkPtr' href='html/libvirt-libvirt.html#virNetworkPtr'/>
<reference name='virNetworkSetAutostart' href='html/libvirt-libvirt.html#virNetworkSetAutostart'/>
<reference name='virNetworkUndefine' href='html/libvirt-libvirt.html#virNetworkUndefine'/>
+ <reference name='virNodeGetCellsFreeMemory' href='html/libvirt-libvirt.html#virNodeGetCellsFreeMemory'/>
<reference name='virNodeGetInfo' href='html/libvirt-libvirt.html#virNodeGetInfo'/>
<reference name='virNodeInfo' href='html/libvirt-libvirt.html#virNodeInfo'/>
<reference name='virNodeInfoPtr' href='html/libvirt-libvirt.html#virNodeInfoPtr'/>
<ref name='virNetworkPtr'/>
<ref name='virNetworkSetAutostart'/>
<ref name='virNetworkUndefine'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virNodeGetInfo'/>
<ref name='virNodeInfo'/>
<ref name='virNodeInfoPtr'/>
<ref name='virConnectGetVersion'/>
<ref name='virGetVersion'/>
</type>
+ <type name='unsigned long long *'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </type>
<type name='virConnectPtr'>
<ref name='virConnCopyLastError'/>
<ref name='virConnGetLastError'/>
<ref name='virNetworkLookupByName'/>
<ref name='virNetworkLookupByUUID'/>
<ref name='virNetworkLookupByUUIDString'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virNodeGetInfo'/>
</type>
<type name='virDomainBlockStatsPtr'>
<ref name='virNetworkPtr'/>
<ref name='virNetworkSetAutostart'/>
<ref name='virNetworkUndefine'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virNodeGetInfo'/>
<ref name='virNodeInfo'/>
<ref name='virNodeInfoPtr'/>
<ref name='LIBVIR_VERSION_NUMBER'/>
<ref name='VIR_DOMAIN_SCHED_FIELD_LENGTH'/>
</word>
+ <word name='Maximum'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='Mbps'>
<ref name='virDomainMigrate'/>
</word>
<letter name='N'>
<word name='NUMA'>
<ref name='_virNodeInfo'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='Normally'>
<ref name='virConnectGetURI'/>
<word name='add'>
<ref name='virDomainShutdown'/>
</word>
+ <word name='additional'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='address'>
<ref name='virDomainMigrate'/>
</word>
<ref name='virDomainSetMaxMemory'/>
<ref name='virDomainSetMemory'/>
<ref name='virDomainSuspend'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virNodeGetInfo'/>
</word>
<word name='allowed'>
<ref name='virDomainGetMaxMemory'/>
<ref name='virDomainSetMaxMemory'/>
<ref name='virDomainSetMemory'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='analysis'>
<ref name='virDomainCoreDump'/>
<ref name='virDomainGetVcpus'/>
<ref name='virNetworkGetUUID'/>
<ref name='virNetworkGetUUIDString'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='associated'>
<ref name='virDomainGetConnect'/>
<ref name='virNetworkCreate'/>
<ref name='virNetworkDestroy'/>
<ref name='virNetworkGetConnect'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='callback'>
<ref name='virConnSetErrorFunc'/>
<ref name='virDomainGetXMLDesc'/>
<ref name='virNetworkGetBridgeName'/>
<ref name='virNetworkGetXMLDesc'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='calling'>
<ref name='virDomainBlockStats'/>
<ref name='virDomainGetInfo'/>
<ref name='virDomainMigrate'/>
<ref name='virDomainPinVcpu'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='cannot'>
<ref name='virDomainLookupByID'/>
</word>
<word name='cell'>
<ref name='_virNodeInfo'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
+ <word name='cells'>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='change'>
<ref name='virDomainPinVcpu'/>
<ref name='virDomainInterfaceStats'/>
<ref name='virDomainMigrate'/>
<ref name='virDomainPinVcpu'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
+ <word name='either'>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='element'>
<ref name='virConnectGetMaxVcpus'/>
<ref name='virDomainGetXMLDesc'/>
<ref name='virNetworkGetXMLDesc'/>
</word>
+ <word name='entries'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='especially'>
<ref name='virConnectClose'/>
</word>
<word name='filled'>
<ref name='virDomainGetSchedulerParameters'/>
<ref name='virDomainGetVcpus'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='find'>
<ref name='virDomainLookupByID'/>
<word name='first'>
<ref name='virConnectOpen'/>
<ref name='virConnectOpenReadOnly'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='flags'>
<ref name='virDomainCoreDump'/>
<ref name='virDomainGetXMLDesc'/>
<ref name='virNetworkGetBridgeName'/>
<ref name='virNetworkGetXMLDesc'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
+ <word name='freeMems'>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='freed'>
<ref name='virConnectGetHostname'/>
<ref name='virDomainGetConnect'/>
<ref name='virNetworkGetConnect'/>
</word>
+ <word name='index'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='indicates'>
<ref name='virDomainBlockStats'/>
<ref name='virDomainInterfaceStats'/>
</word>
<word name='info'>
<ref name='virDomainGetVcpus'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='information'>
<ref name='_virError'/>
<ref name='virDomainGetVcpus'/>
<ref name='virGetVersion'/>
<ref name='virNetworkGetUUIDString'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virNodeGetInfo'/>
</word>
<word name='informative'>
<ref name='virDomainGetMaxMemory'/>
<ref name='virDomainSetMaxMemory'/>
<ref name='virDomainSetMemory'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='knowing'>
<ref name='virDomainShutdown'/>
<word name='live'>
<ref name='virDomainMigrate'/>
</word>
+ <word name='long'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='looked'>
<ref name='virGetVersion'/>
</word>
<ref name='virDomainGetVcpus'/>
<ref name='virDomainPinVcpu'/>
</word>
+ <word name='maxCells'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='maximum'>
<ref name='_virDomainInfo'/>
<ref name='virConnectGetMaxVcpus'/>
<ref name='virDomainSetMaxMemory'/>
<ref name='virDomainSetMemory'/>
<ref name='virDomainSuspend'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='message'>
<ref name='_virError'/>
<ref name='virDomainInterfaceStats'/>
<ref name='virDomainMigrate'/>
<ref name='virNetworkGetUUIDString'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='moves'>
<ref name='virDomainCreate'/>
<ref name='virDomainMigrate'/>
<ref name='virNetworkGetBridgeName'/>
<ref name='virNetworkGetXMLDesc'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='mysterious'>
<ref name='_virDomainBlockStats'/>
</word>
<word name='node'>
<ref name='_virNodeInfo'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virNodeGetInfo'/>
</word>
<word name='non'>
<ref name='virDomainGetVcpus'/>
<ref name='virDomainMigrate'/>
<ref name='virNetworkCreateXML'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='only'>
<ref name='virConnectGetVersion'/>
<ref name='virDomainReboot'/>
<ref name='virDomainShutdown'/>
</word>
+ <word name='requested'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='required'>
<ref name='VIR_CPU_MAPLEN'/>
<ref name='VIR_UUID_BUFLEN'/>
<ref name='virDomainMigrate'/>
<ref name='virGetVersion'/>
<ref name='virNetworkDestroy'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='returned'>
<ref name='virConnectGetCapabilities'/>
<ref name='virNetworkGetAutostart'/>
<ref name='virNetworkGetBridgeName'/>
<ref name='virNetworkGetXMLDesc'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='returns'>
<ref name='VIR_CPU_MAPLEN'/>
<ref name='virConnectGetVersion'/>
<ref name='virDomainBlockStats'/>
<ref name='virDomainInterfaceStats'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='reused'>
<ref name='virDomainGetXMLDesc'/>
<ref name='virDomainSetMaxMemory'/>
<ref name='virDomainSetMemory'/>
</word>
+ <word name='smaller'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='socket'>
<ref name='_virNodeInfo'/>
</word>
<ref name='virNetworkCreate'/>
<ref name='virNetworkCreateXML'/>
</word>
+ <word name='startCell'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='started'>
<ref name='virDomainGetAutostart'/>
<ref name='virDomainSetAutostart'/>
<ref name='virNetworkGetAutostart'/>
<ref name='virNetworkSetAutostart'/>
</word>
+ <word name='starting'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='startup'>
<ref name='virInitialize'/>
</word>
</word>
<word name='unsigned'>
<ref name='virDomainGetID'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='unused'>
<ref name='virDomainCoreDump'/>
<ref name='virGetLastError'/>
<ref name='virGetVersion'/>
<ref name='virNetworkGetBridgeName'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virSetErrorFunc'/>
</word>
+ <word name='whichever'>
+ <ref name='virNodeGetCellsFreeMemory'/>
+ </word>
<word name='while'>
<ref name='virGetVersion'/>
</word>
<ref name='virDomainSuspend'/>
<ref name='virGetVersion'/>
<ref name='virNetworkGetName'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
<ref name='virSetErrorFunc'/>
</word>
<word name='with'>
<ref name='virDomainMigrate'/>
<ref name='virNetworkGetConnect'/>
<ref name='virNetworkGetXMLDesc'/>
+ <ref name='virNodeGetCellsFreeMemory'/>
</word>
<word name='within'>
<ref name='virDomainBlockStats'/>
<a href="http://www.openssh.com/" title="OpenSSH homepage">ssh
(secure shell)</a> connection.
Requires <a href="http://netcat.sourceforge.net/">Netcat (nc)</a>
- installed on the remote machine, and the remote libvirtd should
- be listening on the unix transport. You should use some sort of
+ installed and libvirtd should be running
+ on the remote machine. You should use some sort of
ssh key management (eg.
<a href="http://mah.everybody.org/docs/ssh" title="Using ssh-agent with ssh">ssh-agent</a>)
otherwise programs which use
for each kind of guest which can be virtualized. For a more complete
description see:
L<http://libvirt.org/format.html#Capa1>
+The XML also show the NUMA topology informations if available.
=item B<list>
Name is the name of the domain. ID the domain numeric id.
State is the run state (see below).
+=item B<freecell> optional I<cellno>
+
+Prints the available amount of memory on the machine or within a
+NUMA cell if I<cellno> is provided.
+
=over 4
B<STATES>
int virDomainAttachDevice(virDomainPtr domain, char *xml);
int virDomainDetachDevice(virDomainPtr domain, char *xml);
+/*
+ * NUMA support
+ */
+
+int virNodeGetCellsFreeMemory(virConnectPtr conn,
+ unsigned long long *freeMems,
+ int startCell,
+ int maxCells);
+
/*
* Virtual Networks API
*/
int virDomainAttachDevice(virDomainPtr domain, char *xml);
int virDomainDetachDevice(virDomainPtr domain, char *xml);
+/*
+ * NUMA support
+ */
+
+int virNodeGetCellsFreeMemory(virConnectPtr conn,
+ unsigned long long *freeMems,
+ int startCell,
+ int maxCells);
+
/*
* Virtual Networks API
*/
typedef struct _virDriver virDriver;
typedef virDriver *virDriverPtr;
+typedef int
+ (*virDrvNodeGetCellsFreeMemory)
+ (virConnectPtr conn,
+ unsigned long long *freeMems,
+ int startCell,
+ int maxCells);
+
/**
* _virDriver:
*
virDrvDomainMigrateFinish domainMigrateFinish;
virDrvDomainBlockStats domainBlockStats;
virDrvDomainInterfaceStats domainInterfaceStats;
+ virDrvNodeGetCellsFreeMemory nodeGetCellsFreeMemory;
};
typedef int
return -1;
}
+/**
+ * virNodeGetCellsFreeMemory:
+ * @conn: pointer to the hypervisor connection
+ * @freeMems: pointer to the array of unsigned long long
+ * @startCell: index of first cell to return freeMems info on.
+ * @maxCells: Maximum number of cells for which freeMems information can
+ * be returned.
+ *
+ * This call returns the amount of free memory in one or more NUMA cells.
+ * The @freeMems array must be allocated by the caller and will be filled
+ * with the amount of free memory in kilobytes for each cell requested,
+ * starting with startCell (in freeMems[0]), up to either
+ * (startCell + maxCells), or the number of additional cells in the node,
+ * whichever is smaller.
+ *
+ * Returns the number of entries filled in freeMems, or -1 in case of error.
+ */
+
+int
+virNodeGetCellsFreeMemory(virConnectPtr conn, unsigned long long *freeMems,
+ int startCell, int maxCells)
+{
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ return (-1);
+ }
+
+ if ((freeMems == NULL) || (maxCells <= 0)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (-1);
+ }
+
+ if (conn->driver->nodeGetCellsFreeMemory)
+ return conn->driver->nodeGetCellsFreeMemory (conn, freeMems, startCell, maxCells);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
/**
* virNetworkGetConnect:
* @net: pointer to a network
virDomainGetUUID;
virDomainGetUUIDString;
virDomainGetInfo;
+ virNodeGetCellsFreeMemory;
virDomainGetMaxMemory;
virDomainGetName;
virDomainGetOSType;
virDefaultErrorFunc;
virNodeGetInfo;
virConnectGetCapabilities;
+ virNodeGetCellsFreeMemory;
virDomainSetVcpus;
virDomainPinVcpu;
NULL, /* domainMigrateFinish */
NULL, /* domainBlockStats */
NULL, /* domainInterfaceStats */
+ NULL, /* nodeGetCellsFreeMemory */
};
static virNetworkDriver openvzNetworkDriver = {
NULL, /* domainMigrateFinish */
NULL, /* domainBlockStats */
NULL, /* domainInterfaceStats */
+ NULL, /* nodeGetCellsFreeMemory */
};
static virNetworkDriver qemuNetworkDriver = {
.domainMigrateFinish = remoteDomainMigrateFinish,
.domainBlockStats = remoteDomainBlockStats,
.domainInterfaceStats = remoteDomainInterfaceStats,
+ .nodeGetCellsFreeMemory = NULL,
};
static virNetworkDriver network_driver = {
NULL, /* domainMigrateFinish */
NULL, /* domainBlockStats */
NULL, /* domainInterfaceStats */
+ NULL, /* nodeGetCellsFreeMemory */
};
static virNetworkDriver testNetworkDriver = {
return ret;
}
+/*
+ * "freecell" command
+ */
+static vshCmdInfo info_freecell[] = {
+ {"syntax", "freecell [<cellno>]"},
+ {"help", gettext_noop("NUMA free memory")},
+ {"desc", gettext_noop("display available free memory for the NUMA cell.")},
+ {NULL, NULL}
+};
+
+static vshCmdOptDef opts_freecell[] = {
+ {"cellno", VSH_OT_DATA, 0, gettext_noop("NUMA cell number")},
+ {NULL, 0, 0, NULL}
+};
+
+static int
+cmdFreecell(vshControl * ctl, vshCmd * cmd)
+{
+ int ret;
+ int cell, cell_given;
+ unsigned long long memory;
+
+ if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
+ return FALSE;
+
+ cell = vshCommandOptInt(cmd, "cellno", &cell_given);
+ if (!cell_given) {
+ cell = -1;
+ }
+
+ ret = virNodeGetCellsFreeMemory(ctl->conn, &memory, cell, 1);
+ if (ret != 1)
+ return FALSE;
+
+ if (cell == -1)
+ vshPrint(ctl, "%s: %llu kB\n", _("Total"), memory);
+ else
+ vshPrint(ctl, "%d: %llu kB\n", cell, memory);
+
+ return TRUE;
+}
+
/*
* "vcpuinfo" command
*/
{"domblkstat", cmdDomblkstat, opts_domblkstat, info_domblkstat},
{"domifstat", cmdDomIfstat, opts_domifstat, info_domifstat},
{"dumpxml", cmdDumpXML, opts_dumpxml, info_dumpxml},
+ {"freecell", cmdFreecell, opts_freecell, info_freecell},
{"hostname", cmdHostname, NULL, info_hostname},
{"list", cmdList, opts_list, info_list},
{"migrate", cmdMigrate, opts_migrate, info_migrate},
#include <errno.h>
#include <sys/utsname.h>
#include "xs_internal.h"
+#include "xend_internal.h"
/* required for dom0_getdomaininfo_t */
#include <xen/dom0_ops.h>
};
typedef union xen_getschedulerid xen_getschedulerid;
+struct xen_v2s4_availheap {
+ uint32_t min_bitwidth; /* Smallest address width (zero if don't care). */
+ uint32_t max_bitwidth; /* Largest address width (zero if don't care). */
+ int32_t node; /* NUMA node (-1 for sum across all nodes). */
+ uint64_t avail_bytes; /* Bytes available in the specified region. */
+};
+
+typedef struct xen_v2s4_availheap xen_v2s4_availheap;
+
#define XEN_GETDOMAININFOLIST_ALLOC(domlist, size) \
(hypervisor_version < 2 ? \
*/
#define XEN_V2_OP_GETSCHEDULERID 4
+/*
+ * from V2 we get the available heap information
+ */
+#define XEN_V2_OP_GETAVAILHEAP 9
+
/*
* from V2 we get the scheduler parameter
*/
xen_v2_getdomaininfolistop getdomaininfolist;
xen_v2s3_getdomaininfolistop getdomaininfolists3;
xen_v2_getschedulerid getschedulerid;
+ xen_v2s4_availheap availheap;
uint8_t padding[128];
} u;
};
#endif
return(-1);
}
- /* Currently consider RHEL5.0 Fedora7 and xen-unstable */
+ /* Currently consider RHEL5.0 Fedora7, xen-3.1, and xen-unstable */
sys_interface_version = 2; /* XEN_SYSCTL_INTERFACE_VERSION */
if (virXen_getdomaininfo(fd, 0, &info) == 1) {
/* RHEL 5.0 */
sys_interface_version = 3; /* XEN_SYSCTL_INTERFACE_VERSION */
if (virXen_getdomaininfo(fd, 0, &info) == 1) {
- /* xen-unstable */
+ /* xen-3.1 */
dom_interface_version = 5; /* XEN_DOMCTL_INTERFACE_VERSION */
if (virXen_getvcpusinfo(fd, 0, 0, ipt, NULL, 0) == 0){
#ifdef DEBUG
}
}
+ sys_interface_version = 4; /* XEN_SYSCTL_INTERFACE_VERSION */
+ if (virXen_getdomaininfo(fd, 0, &info) == 1) {
+ /* xen-unstable */
+ dom_interface_version = 5; /* XEN_DOMCTL_INTERFACE_VERSION */
+ if (virXen_getvcpusinfo(fd, 0, 0, ipt, NULL, 0) == 0){
+#ifdef DEBUG
+ fprintf(stderr, "Using hypervisor call v2, sys ver4 dom ver5\n");
+#endif
+ goto done;
+ }
+ }
+
hypervisor_version = 1;
sys_interface_version = -1;
if (virXen_getdomaininfo(fd, 0, &info) == 1) {
char line[1024], *str, *token;
regmatch_t subs[4];
char *saveptr = NULL;
- int i, r;
+ int i, r, topology;
char hvm_type[4] = ""; /* "vmx" or "svm" (or "" if not in CPU). */
int host_pae = 0;
</host>\n", -1);
if (r == -1) goto vir_buffer_failed;
+ if (sys_interface_version >= 4) {
+ topology = xenDaemonNodeGetTopology(conn, xml);
+ if (topology != 0)
+ goto topology_failed;
+ }
+
for (i = 0; i < nr_guest_archs; ++i) {
r = virBufferVSprintf (xml,
"\
</guest>\n", -1);
if (r == -1) goto vir_buffer_failed;
}
+
r = virBufferAdd (xml,
"\
</capabilities>\n", -1);
vir_buffer_failed:
virXenError(VIR_ERR_NO_MEMORY, __FUNCTION__, 0);
+ topology_failed:
virBufferFree (xml);
return NULL;
}
}
#ifndef PROXY
+/**
+ * xenHypervisorNodeGetCellsFreeMemory:
+ * @conn: pointer to the hypervisor connection
+ * @freeMems: pointer to the array of unsigned long long
+ * @startCell: index of first cell to return freeMems info on.
+ * @maxCells: Maximum number of cells for which freeMems information can
+ * be returned.
+ *
+ * This call returns the amount of free memory in one or more NUMA cells.
+ * The @freeMems array must be allocated by the caller and will be filled
+ * with the amount of free memory in kilobytes for each cell requested,
+ * starting with startCell (in freeMems[0]), up to either
+ * (startCell + maxCells), or the number of additional cells in the node,
+ * whichever is smaller.
+ *
+ * Returns the number of entries filled in freeMems, or -1 in case of error.
+ */
+int
+xenHypervisorNodeGetCellsFreeMemory(virConnectPtr conn, unsigned long long *freeMems,
+ int startCell, int maxCells)
+{
+ xen_op_v2_sys op_sys;
+ int i, j, ret;
+ xenUnifiedPrivatePtr priv;
+ static int nbNodeCells = -1;
+ virNodeInfo nodeInfo;
+
+
+ if (nbNodeCells == -1) {
+ if (xenDaemonNodeGetInfo(conn, &nodeInfo)) {
+ virXenErrorFunc (VIR_ERR_XEN_CALL, __FUNCTION__,
+ "cannot determine actual number of cells",0);
+ return -1;
+ }
+ nbNodeCells = nodeInfo.nodes;
+ }
+
+ if ((conn == NULL) || (maxCells < 1) || (startCell >= nbNodeCells)) {
+ virXenErrorFunc (VIR_ERR_INVALID_ARG, __FUNCTION__,
+ "invalid argument", 0);
+ return -1;
+ }
+ /*
+ * Support only sys_interface_version >=4
+ */
+ if (sys_interface_version < 4) {
+ virXenErrorFunc (VIR_ERR_XEN_CALL, __FUNCTION__,
+ "unsupported in sys interface < 4", 0);
+ return -1;
+ }
+
+ priv = (xenUnifiedPrivatePtr) conn->privateData;
+ if (priv->handle < 0) {
+ virXenErrorFunc (VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
+ "priv->handle invalid", 0);
+ return -1;
+ }
+
+ memset(&op_sys, 0, sizeof(op_sys));
+ op_sys.cmd = XEN_V2_OP_GETAVAILHEAP;
+
+ for (i = startCell, j = 0;(i < nbNodeCells) && (j < maxCells);i++,j++) {
+ op_sys.u.availheap.node = i;
+ ret = xenHypervisorDoV2Sys(priv->handle, &op_sys);
+ if (ret < 0) {
+ return(-1);
+ }
+ freeMems[j] = op_sys.u.availheap.avail_bytes;
+ }
+ return (j);
+}
+
+
/**
* xenHypervisorPauseDomain:
* @domain: pointer to the domain block
const char *path,
struct _virDomainInterfaceStats *stats);
+int xenHypervisorNodeGetCellsFreeMemory(virConnectPtr conn,
+ unsigned long long *freeMems,
+ int startCell,
+ int maxCells);
#ifdef __cplusplus
}
#endif
return -1;
}
+static int
+xenUnifiedNodeGetCellsFreeMemory (virConnectPtr conn, unsigned long long *freeMems,
+ int startCell, int maxCells)
+{
+ GET_PRIVATE (conn);
+
+ if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET])
+ return xenHypervisorNodeGetCellsFreeMemory (conn, freeMems,
+ startCell, maxCells);
+
+ xenUnifiedError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
/*----- Register with libvirt.c, and initialise Xen drivers. -----*/
#define VERSION ((DOM0_INTERFACE_VERSION >> 24) * 1000000 + \
.domainMigrateFinish = xenUnifiedDomainMigrateFinish,
.domainBlockStats = xenUnifiedDomainBlockStats,
.domainInterfaceStats = xenUnifiedDomainInterfaceStats,
+ .nodeGetCellsFreeMemory = xenUnifiedNodeGetCellsFreeMemory,
};
/**
#include <arpa/inet.h>
#include <netdb.h>
#include <libxml/uri.h>
+#include <ctype.h>
#include <errno.h>
#include "libvirt/libvirt.h"
return (0);
}
+/**
+ * getNumber:
+ * @pointer: pointer to string beginning with numerical characters
+ * @result: pointer to integer for storing the numerical result
+ *
+ * Internal routine extracting a number from the beginning of a string
+ *
+ * Returns the number of characters that were extracted as digits
+ * or -1 if no digits were found.
+ */
+static int
+getNumber (const char * pointer, int * result) {
+ int len = 0;
+ while (isdigit(*(pointer + len)))
+ len++;
+ if (len == 0)
+ return -1;
+ *(result) = atoi(pointer);
+ return (len);
+}
+
+/**
+ * sexpr_to_xend_topology_xml:
+ * @root: an S-Expression describing a node
+ *
+ * Internal routine creating an XML string with the values from
+ * the node root provided.
+ *
+ * Returns 0 in case of success, -1 in case of error
+ */
+static int
+sexpr_to_xend_topology_xml(virConnectPtr conn, struct sexpr *root, virBufferPtr xml)
+{
+ const char *nodeToCpu;
+ const char *offset;
+ int cellNum;
+ int numCells = 0;
+ int numCpus;
+ int cellCpuCount = 0;
+ int nodeCpuCount = 0;
+ int start;
+ int finish;
+ int r;
+ int i;
+ int len;
+ int cpuNum;
+ int *cpuIdsPtr = NULL;
+ int *iCpuIdsPtr = NULL;
+ char next;
+
+ nodeToCpu = sexpr_node(root, "node/node_to_cpu");
+ if (nodeToCpu == NULL) {
+ virXendError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("failed to parse topology information"));
+ goto error;
+ }
+
+ numCells = sexpr_int(root, "node/nr_nodes");
+ numCpus = sexpr_int(root, "node/nr_cpus");
+
+ /* array for holding all cpu numbers associated with a single cell.
+ * Should never need more than numCpus (which is total number of
+ * cpus for the node)
+ */
+ cpuIdsPtr = iCpuIdsPtr = malloc(numCpus * sizeof(int));
+ if (cpuIdsPtr == NULL) {
+ goto vir_buffer_failed;
+ }
+
+ /* start filling in xml */
+ r = virBufferVSprintf (xml,
+ "\
+ <topology>\n\
+ <cells num='%d'>\n",
+ numCells);
+ if (r == -1) goto vir_buffer_failed;
+
+ offset = nodeToCpu;
+ /* now iterate through all cells and find associated cpu ids */
+ /* example of string being parsed: "node0:0-3,7,9-10\n node1:11-14\n" */
+ while ((offset = strstr(offset, "node")) != NULL) {
+ cpuIdsPtr = iCpuIdsPtr;
+ cellCpuCount = 0;
+ offset +=4;
+ if ((len = getNumber(offset, &cellNum)) < 0) {
+ virXendError(conn, VIR_ERR_XEN_CALL, " topology string syntax error");
+ goto error;
+ }
+ offset += len;
+ if (*(offset) != ':') {
+ virXendError(conn, VIR_ERR_XEN_CALL, " topology string syntax error");
+ goto error;
+ }
+ offset++;
+ /* get list of cpus associated w/ single cell */
+ while (1) {
+ if ((len = getNumber(offset, &cpuNum)) < 0) {
+ virXendError(conn, VIR_ERR_XEN_CALL, " topology string syntax error");
+ goto error;
+ }
+ offset += len;
+ next = *(offset);
+ if (next == '-') {
+ offset++;
+ start = cpuNum;
+ if ((len = getNumber(offset, &finish)) < 0) {
+ virXendError(conn, VIR_ERR_XEN_CALL, " topology string syntax error");
+ goto error;
+ }
+ if (start > finish) {
+ virXendError(conn, VIR_ERR_XEN_CALL, " topology string syntax error");
+ goto error;
+
+ }
+ for (i=start; i<=finish && nodeCpuCount<numCpus; i++) {
+ *(cpuIdsPtr++) = i;
+ cellCpuCount++;
+ nodeCpuCount++;
+ }
+ if (nodeCpuCount > numCpus) {
+ virXendError(conn, VIR_ERR_XEN_CALL,
+ "conflicting cpu counts");
+ goto error;
+ }
+ offset += len;
+ next = *(offset);
+ offset++;
+ if (next == ',') {
+ continue;
+ } else if ((next == '\\') || (next =='\0')) {
+ break;
+ } else {
+ virXendError(conn, VIR_ERR_XEN_CALL,
+ " topology string syntax error");
+ goto error;
+ }
+ } else {
+ /* add the single number */
+ if (nodeCpuCount >= numCpus) {
+ virXendError(conn, VIR_ERR_XEN_CALL,
+ "conflicting cpu counts");
+ goto error;
+ }
+ *(cpuIdsPtr++) = cpuNum;
+ cellCpuCount++;
+ nodeCpuCount++;
+ if (next == ',') {
+ offset++;
+ continue;
+ } else if ((next == '\\') || (next =='\0')) {
+ break;
+ } else {
+ virXendError(conn, VIR_ERR_XEN_CALL,
+ " topology string syntax error");
+ goto error;
+ }
+ }
+ }
+
+ /* add xml for all cpus associated with one cell */
+ r = virBufferVSprintf (xml, "\
+ <cell id='%d'>\n\
+ <cpus num='%d'>\n", cellNum, cellCpuCount);
+ if (r == -1) goto vir_buffer_failed;
+
+ for (i = 0; i < cellCpuCount; i++) {
+ r = virBufferVSprintf (xml, "\
+ <cpu id='%d'/>\n", *(iCpuIdsPtr + i));
+ if (r == -1) goto vir_buffer_failed;
+ }
+ r = virBufferAdd (xml, "\
+ </cpus>\n\
+ </cell>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+ }
+ r = virBufferAdd (xml, "\
+ </cells>\n\
+ </topology>\n", -1);
+ if (r == -1) goto vir_buffer_failed;
+ free(iCpuIdsPtr);
+ return (0);
+
+
+vir_buffer_failed:
+ virXendError(conn, VIR_ERR_NO_MEMORY, _("allocate new buffer"));
+
+error:
+ if (iCpuIdsPtr)
+ free(iCpuIdsPtr);
+ return (-1);
+}
+
#ifndef PROXY
/**
* sexpr_to_domain:
{
xmlURIPtr uri = NULL;
int ret;
-
+
/* If the name is just "xen" (it might originally have been NULL,
* see xenUnifiedOpen) or any URI beginning with "xen:///" then
* try default paths and methods to get to the xend socket.
return (ret);
}
+/**
+ * xenDaemonNodeGetTopology:
+ * @conn: pointer to the Xen Daemon block
+ *
+ * This method retrieves a node's topology information.
+ *
+ * Returns -1 in case of error, 0 otherwise.
+ */
+int
+xenDaemonNodeGetTopology(virConnectPtr conn, virBufferPtr xml) {
+ int ret = -1;
+ struct sexpr *root;
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virXendError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ return (-1);
+ }
+
+ if (xml == NULL) {
+ virXendError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (-1);
+ }
+
+ root = sexpr_get(conn, "/xend/node/");
+ if (root == NULL) {
+ return (-1);
+ }
+
+ ret = sexpr_to_xend_topology_xml(conn, root, xml);
+ sexpr_free(root);
+ return (ret);
+}
+
#ifndef PROXY
/**
* xenDaemonGetType:
#include <stdbool.h>
#include "libvirt/libvirt.h"
+#include "buf.h"
#ifdef __cplusplus
extern "C" {
int xenDaemonClose(virConnectPtr conn);
int xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer);
int xenDaemonNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
+int xenDaemonNodeGetTopology(virConnectPtr conn, virBufferPtr xml);
int xenDaemonDomainSuspend(virDomainPtr domain);
int xenDaemonDomainResume(virDomainPtr domain);
int xenDaemonDomainShutdown(virDomainPtr domain);
.\" ========================================================================
.\"
.IX Title "VIRSH 1"
-.TH VIRSH 1 "2007-08-14" "perl v5.8.8" "Virtualization Support"
+.TH VIRSH 1 "2007-09-28" "perl v5.8.8" "Virtualization Support"
.SH "NAME"
virsh \- management user interface
.SH "SYNOPSIS"
for each kind of guest which can be virtualized. For a more complete
description see:
<http://libvirt.org/format.html#Capa1>
+The \s-1XML\s0 also show the \s-1NUMA\s0 topology informations if available.
.IP "\fBlist\fR" 4
.IX Item "list"
Prints information about one or more domains. If no domains are
.Sp
Name is the name of the domain. \s-1ID\s0 the domain numeric id.
State is the run state (see below).
+.IP "\fBfreecell\fR optional \fIcellno\fR" 4
+.IX Item "freecell optional cellno"
+Prints the available amount of memory on the machine or within a
+\&\s-1NUMA\s0 cell if \fIcellno\fR is provided.
.RS 4
.Sp
.RS 4