On lun, 2013-07-01 at 16:47 -0600, Jim Fehlig wrote:
On 06/28/2013 08:32 AM, Dario Faggioli wrote:
> Starting from Xen 4.2, libxl has all the bits and pieces are in
s/are in/in/
Uups! Will fix, thanks.
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index e170357..2a9bcf0 100644
>
> static virCapsPtr
> libxlMakeCapabilitiesInternal(virArch hostarch,
> libxl_physinfo *phy_info,
> + libxl_numainfo *numa_info, int nr_nodes,
> + libxl_cputopology *cpu_topo, int nr_cpus,
The most prominent pattern in libvirt is one param per line after the first, if
they all don't fit in 80 columns. E.g.
libxlMakeCapabilitiesInternal(virArch hostarch,
libxl_physinfo *phy_info,
libxl_numainfo *numa_info,
int nr_nodes,
libxl_cputopology *cpu_topo,
int nr_cpus,
...)
Ok.
> char *capabilities)
> {
> char *str, *token;
> @@ -173,6 +175,12 @@ libxlMakeCapabilitiesInternal(virArch hostarch,
> int host_pae = 0;
> struct guest_arch guest_archs[32];
> int nr_guest_archs = 0;
> +
> + /* For building NUMA capabilities */
> + virCapsHostNUMACellCPUPtr *cpus = NULL;
> + int *nr_cpus_node = NULL;
> + bool numa_failed = false;
> +
No need for the extra whitespace between these local variables.
Killed.
> virCapsPtr caps = NULL;
>
> memset(guest_archs, 0, sizeof(guest_archs));
> @@ -280,6 +288,100 @@ libxlMakeCapabilitiesInternal(virArch hostarch,
> nr_guest_archs)) == NULL)
> goto no_memory;
>
> + /* What about NUMA? */
What about it? I think the comment should just say "Include NUMA information if
available" or similar :).
Agreed.
> + if (!numa_info || !cpu_topo)
> + return caps;
> +
> + if (VIR_ALLOC_N(cpus, nr_nodes))
> + goto no_memory;
> + memset(cpus, 0, sizeof(cpus) * nr_nodes);
VIR_ALLOC_N will already zero-fill the memory. From its' documentation in
viralloc.h
Right. I even looked it up (or so I remember), but then I wasn't sure it
was doing that. Anyway, thanks, I'll get rid of the explicit
zero-filling part.
> + if (nr_cpus_node[node] == 1) {
> + if (VIR_ALLOC(cpus[node]) < 0) {
> + numa_failed = true;
> + goto cleanup;
> + }
> + }
> + else {
> + if (VIR_REALLOC_N(cpus[node], nr_cpus_node[node]) < 0) {
virReportOOMError() ?
Sounds reasonable. Will do.
> +cleanup:
> + if (numa_failed) {
> + /* Looks like something went wrong. Well, that's bad, but probably
> + * not enough to break the whole driver, so we log and carry on */
> + for (i = 0; i < nr_nodes; i++) {
> + VIR_FREE(cpus[i]);
> + }
> + VIR_WARN("Failed to retrieve and build host NUMA topology
properly,\n"
> + "disabling NUMA capabilities");
> + virCapabilitiesFreeNUMAInfo(caps);
> + }
> +
> + VIR_FREE(cpus);
> + VIR_FREE(nr_cpus_node);
Hmm, I'm beginning to think the numa additions to
libxlMakeCapabilitiesInternal() should be in a helper function, e.g.
libxlMakeNumaCapabilities(), and called when numa_info and cpu_topo are provided.
Yeah, it's a bit long, isn't it. I agree with the above and will make it
an helper for v2.
Thanks and Regards,
Dario