[libvirt] [PATCH 2/4] libxl: implement per NUMA node free memory reporting

Jim Fehlig jfehlig at suse.com
Mon Jul 1 23:27:17 UTC 2013


On 06/28/2013 08:32 AM, Dario Faggioli wrote:
> By providing the implementation of nodeGetCellsFreeMemory for
> the driver. This is all just a matter of properly formatting, in
> a way that libvirt like, what Xen provides via libxl_get_numainfo().
>
> [raistlin at Zhaman ~]$ sudo virsh --connect xen:/// freecell --all
>      0:      25004 KiB
>      1:     105848 KiB
> --------------------
> Total:     130852 KiB

Yeah, rather straight forward patch, which looks good on my non-NUMA machine as well

# virsh freecell --all
     0:    7287216 KiB
--------------------
Total:    7287216 KiB

# virsh freecell --cellno 0
0: 7287216 KiB

ACK and pushed.

Regards,
Jim

>
> Signed-off-by: Dario Faggioli <dario.faggioli at citrix.com>
> ---
>   src/libxl/libxl_driver.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 46 insertions(+)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 9f52394..a3a9171 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -4098,6 +4098,51 @@ libxlNodeGetFreeMemory(virConnectPtr conn)
>   }
>   
>   static int
> +libxlNodeGetCellsFreeMemory(virConnectPtr conn,
> +                            unsigned long long *freeMems,
> +                            int startCell,
> +                            int maxCells)
> +{
> +    int n, lastCell, numCells;
> +    int ret = -1, nr_nodes = 0;
> +    libxl_numainfo *numa_info = NULL;
> +    libxlDriverPrivatePtr driver = conn->privateData;
> +
> +    if (virNodeGetCellsFreeMemoryEnsureACL(conn) < 0)
> +        return -1;
> +
> +    /* Early failure is probably worth just a warning */
> +    numa_info = libxl_get_numainfo(driver->ctx, &nr_nodes);
> +    if (numa_info == NULL || nr_nodes == 0) {
> +        VIR_WARN("libxl_get_numainfo failed to retrieve NUMA data");
> +        return 0;
> +    }
> +
> +    /* Check/sanitize the cell range */
> +    if (startCell > nr_nodes) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("start cell %d out of range (0-%d)"),
> +                       startCell, nr_nodes);
> +        goto cleanup;
> +    }
> +    lastCell = startCell + maxCells - 1;
> +    if (lastCell > nr_nodes)
> +        lastCell = nr_nodes;
> +
> +    for (numCells = 0, n = startCell; n <= lastCell; n++) {
> +        if (numa_info[n].size == LIBXL_NUMAINFO_INVALID_ENTRY)
> +            freeMems[numCells++] = 0;
> +        else
> +            freeMems[numCells++] = numa_info[n].free;
> +    }
> +    ret = numCells;
> +
> +cleanup:
> +    libxl_numainfo_list_free(numa_info, nr_nodes);
> +    return ret;
> +}
> +
> +static int
>   libxlConnectDomainEventRegister(virConnectPtr conn,
>                                   virConnectDomainEventCallback callback, void *opaque,
>                                   virFreeCallback freecb)
> @@ -4683,6 +4728,7 @@ static virDriver libxlDriver = {
>       .domainSetSchedulerParameters = libxlDomainSetSchedulerParameters, /* 0.9.0 */
>       .domainSetSchedulerParametersFlags = libxlDomainSetSchedulerParametersFlags, /* 0.9.2 */
>       .nodeGetFreeMemory = libxlNodeGetFreeMemory, /* 0.9.0 */
> +    .nodeGetCellsFreeMemory = libxlNodeGetCellsFreeMemory, /* 1.1.1 */
>       .connectDomainEventRegister = libxlConnectDomainEventRegister, /* 0.9.0 */
>       .connectDomainEventDeregister = libxlConnectDomainEventDeregister, /* 0.9.0 */
>       .domainManagedSave = libxlDomainManagedSave, /* 0.9.2 */
>
>
>
>
>
>




More information about the libvir-list mailing list