Mailing List Archive

[PATCH 8 of 8] xl: add node-affinity to the output of `xl list`
Node-affinity is now something that is under (some) control of the
user, so show it upon request as part of the output of `xl list'.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>

diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2834,14 +2834,82 @@ out:
}
}

-static void list_domains(int verbose, int context, const libxl_dominfo *info, int nb_domain)
+static void print_bitmap(uint8_t *map, int maplen, FILE *stream, int cpu_node)
+{
+ int i;
+ uint8_t pmap = 0, bitmask = 0;
+ int firstset = 0, state = 0;
+
+ for (i = 0; i < maplen; i++) {
+ if (i % 8 == 0) {
+ pmap = *map++;
+ bitmask = 1;
+ } else bitmask <<= 1;
+
+ switch (state) {
+ case 0:
+ case 2:
+ if ((pmap & bitmask) != 0) {
+ firstset = i;
+ state++;
+ }
+ continue;
+ case 1:
+ case 3:
+ if ((pmap & bitmask) == 0) {
+ fprintf(stream, "%s%d", state > 1 ? "," : "", firstset);
+ if (i - 1 > firstset)
+ fprintf(stream, "-%d", i - 1);
+ state = 2;
+ }
+ continue;
+ }
+ }
+ switch (state) {
+ case 0:
+ fprintf(stream, "none");
+ break;
+ case 2:
+ break;
+ case 1:
+ if (firstset == 0) {
+ fprintf(stream, cpu_node ? "any cpu" : "any node");
+ break;
+ }
+ case 3:
+ fprintf(stream, "%s%d", state > 1 ? "," : "", firstset);
+ if (i - 1 > firstset)
+ fprintf(stream, "-%d", i - 1);
+ break;
+ }
+}
+
+static void list_domains(int verbose, int context, int numa, const libxl_dominfo *info, int nb_domain)
{
int i;
static const char shutdown_reason_letters[]= "-rscw";
+ libxl_bitmap nodemap;
+ libxl_physinfo physinfo;
+
+ libxl_bitmap_init(&nodemap);
+ libxl_physinfo_init(&physinfo);

printf("Name ID Mem VCPUs\tState\tTime(s)");
if (verbose) printf(" UUID Reason-Code\tSecurity Label");
if (context && !verbose) printf(" Security Label");
+ if (numa) {
+ if (libxl_node_bitmap_alloc(ctx, &nodemap, 0)) {
+ fprintf(stderr, "libxl_node_bitmap_alloc_failed.\n");
+ exit(1);
+ }
+ if (libxl_get_physinfo(ctx, &physinfo) != 0) {
+ fprintf(stderr, "libxl_physinfo failed.\n");
+ libxl_bitmap_dispose(&nodemap);
+ exit(1);
+ }
+
+ printf(" NODE Affinity");
+ }
printf("\n");
for (i = 0; i < nb_domain; i++) {
char *domname;
@@ -2875,14 +2943,23 @@ static void list_domains(int verbose, in
rc = libxl_flask_sid_to_context(ctx, info[i].ssidref, &buf,
&size);
if (rc < 0)
- printf(" -");
+ printf(" -");
else {
- printf(" %s", buf);
+ printf(" %16s", buf);
free(buf);
}
}
+ if (numa) {
+ libxl_domain_get_nodeaffinity(ctx, info[i].domid, &nodemap);
+
+ putchar(' ');
+ print_bitmap(nodemap.map, physinfo.nr_nodes, stdout, 0);
+ }
putchar('\n');
}
+
+ libxl_bitmap_dispose(&nodemap);
+ libxl_physinfo_dispose(&physinfo);
}

static void list_vm(void)
@@ -3724,12 +3801,14 @@ int main_list(int argc, char **argv)
int opt, verbose = 0;
int context = 0;
int details = 0;
+ int numa = 0;
int option_index = 0;
static struct option long_options[] = {
{"long", 0, 0, 'l'},
{"help", 0, 0, 'h'},
{"verbose", 0, 0, 'v'},
{"context", 0, 0, 'Z'},
+ {"numa", 0, 0, 'n'},
{0, 0, 0, 0}
};

@@ -3738,7 +3817,7 @@ int main_list(int argc, char **argv)
int nb_domain, rc;

while (1) {
- opt = getopt_long(argc, argv, "lvhZ", long_options, &option_index);
+ opt = getopt_long(argc, argv, "lvhZn", long_options, &option_index);
if (opt == -1)
break;

@@ -3755,6 +3834,9 @@ int main_list(int argc, char **argv)
case 'Z':
context = 1;
break;
+ case 'n':
+ numa = 1;
+ break;
default:
fprintf(stderr, "option `%c' not supported.\n", optopt);
break;
@@ -3790,7 +3872,7 @@ int main_list(int argc, char **argv)
if (details)
list_domains_details(info, nb_domain);
else
- list_domains(verbose, context, info, nb_domain);
+ list_domains(verbose, context, numa, info, nb_domain);

if (info_free)
libxl_dominfo_list_free(info, nb_domain);
@@ -4062,56 +4144,6 @@ int main_button_press(int argc, char **a
return 0;
}

-static void print_bitmap(uint8_t *map, int maplen, FILE *stream)
-{
- int i;
- uint8_t pmap = 0, bitmask = 0;
- int firstset = 0, state = 0;
-
- for (i = 0; i < maplen; i++) {
- if (i % 8 == 0) {
- pmap = *map++;
- bitmask = 1;
- } else bitmask <<= 1;
-
- switch (state) {
- case 0:
- case 2:
- if ((pmap & bitmask) != 0) {
- firstset = i;
- state++;
- }
- continue;
- case 1:
- case 3:
- if ((pmap & bitmask) == 0) {
- fprintf(stream, "%s%d", state > 1 ? "," : "", firstset);
- if (i - 1 > firstset)
- fprintf(stream, "-%d", i - 1);
- state = 2;
- }
- continue;
- }
- }
- switch (state) {
- case 0:
- fprintf(stream, "none");
- break;
- case 2:
- break;
- case 1:
- if (firstset == 0) {
- fprintf(stream, "any cpu");
- break;
- }
- case 3:
- fprintf(stream, "%s%d", state > 1 ? "," : "", firstset);
- if (i - 1 > firstset)
- fprintf(stream, "-%d", i - 1);
- break;
- }
-}
-
static void print_vcpuinfo(uint32_t tdomid,
const libxl_vcpuinfo *vcpuinfo,
uint32_t nr_cpus)
@@ -4135,7 +4167,7 @@ static void print_vcpuinfo(uint32_t tdom
/* TIM */
printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9));
/* CPU AFFINITY */
- print_bitmap(vcpuinfo->cpumap.map, nr_cpus, stdout);
+ print_bitmap(vcpuinfo->cpumap.map, nr_cpus, stdout, 1);
printf("\n");
}

diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -50,7 +50,8 @@ struct cmd_spec cmd_table[] = {
"[options] [Domain]\n",
"-l, --long Output all VM details\n"
"-v, --verbose Prints out UUIDs and security context\n"
- "-Z, --context Prints out security context"
+ "-Z, --context Prints out security context\n"
+ "-n, --numa Prints out NUMA node affinity"
},
{ "destroy",
&main_destroy, 0, 1,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Re: [PATCH 8 of 8] xl: add node-affinity to the output of `xl list` [ In reply to ]
Dario Faggioli writes ("[PATCH 8 of 8] xl: add node-affinity to the output of `xl list`"):
> Node-affinity is now something that is under (some) control of the
> user, so show it upon request as part of the output of `xl list'.
...
> -static void list_domains(int verbose, int context, const libxl_dominfo *info, int nb_domain)
> +static void print_bitmap(uint8_t *map, int maplen, FILE *stream, int cpu_node)
> +{
> + int i;
> + uint8_t pmap = 0, bitmask = 0;
> + int firstset = 0, state = 0;
> +
> + for (i = 0; i < maplen; i++) {
> + if (i % 8 == 0) {
> + pmap = *map++;
> + bitmask = 1;
> + } else bitmask <<= 1;
> +
> + switch (state) {
> + case 0:
> + case 2:
> + if ((pmap & bitmask) != 0) {
> + firstset = i;
> + state++;
> + }
> + continue;
> + case 1:
> + case 3:
> + if ((pmap & bitmask) == 0) {
> + fprintf(stream, "%s%d", state > 1 ? "," : "", firstset);
> + if (i - 1 > firstset)
> + fprintf(stream, "-%d", i - 1);
> + state = 2;
> + }
> + continue;
> + }
> + }

Is this business with a state variable really the least opaque way of
writing this ? Oh I see you're just moving it about. Oh well..

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Re: [PATCH 8 of 8] xl: add node-affinity to the output of `xl list` [ In reply to ]
On Fri, 2012-10-05 at 17:36 +0100, Ian Jackson wrote:
> > +static void print_bitmap(uint8_t *map, int maplen, FILE *stream, int cpu_node)
> > +{
> > + int i;
> > + uint8_t pmap = 0, bitmask = 0;
> > + int firstset = 0, state = 0;
> > +
> > ...
>
> Is this business with a state variable really the least opaque way of
> writing this ? Oh I see you're just moving it about. Oh well..
>
I don't think it's any opaque and, yes, I'm mostly moving that
print_bitmap function up in the file, but the new status variable is
mine (guilty ass charge :-D).

Honestly, despite the fact that the function is called print_bitmap(),
it contains the following code:

case 1:
if (firstset == 0) {
fprintf(stream, "any cpu");
break;
}
case 3:

Which is what made me thinking that opacity was not its first concern in
the first place, and that turning it into being opaque was none of this
change's business. :-)

However, I see your point... Perhaps I can add two functions (something
like print_{cpumap,nodemap}()), both calling the original
print_bitmap(), and deal with the "any {cpu,node}" case within them...

Do you like that better?

Thanks and Regards,
Dario

--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
Re: [PATCH 8 of 8] xl: add node-affinity to the output of `xl list` [ In reply to ]
Dario Faggioli writes ("Re: [Xen-devel] [PATCH 8 of 8] xl: add node-affinity to the output of `xl list`"):
> Honestly, despite the fact that the function is called print_bitmap(),
> it contains the following code:
>
> case 1:
> if (firstset == 0) {
> fprintf(stream, "any cpu");
> break;
> }
> case 3:

Uh, yes, I see what you mean.

> Which is what made me thinking that opacity was not its first concern in
> the first place, and that turning it into being opaque was none of this
> change's business. :-)

You are right that since you're just moving the code, it's not a
problem for this patch.

> However, I see your point... Perhaps I can add two functions (something
> like print_{cpumap,nodemap}()), both calling the original
> print_bitmap(), and deal with the "any {cpu,node}" case within them...
>
> Do you like that better?

That would indeed be an improvement.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Re: [PATCH 8 of 8] xl: add node-affinity to the output of `xl list` [ In reply to ]
On Tue, 2012-10-09 at 16:03 +0100, Ian Jackson wrote:
> > Which is what made me thinking that opacity was not its first concern in
> > the first place, and that turning it into being opaque was none of this
> > change's business. :-)
>
> You are right that since you're just moving the code, it's not a
> problem for this patch.
>
Ok.

> > However, I see your point... Perhaps I can add two functions (something
> > like print_{cpumap,nodemap}()), both calling the original
> > print_bitmap(), and deal with the "any {cpu,node}" case within them...
> >
> > Do you like that better?
>
> That would indeed be an improvement.
>
But I think I'll go for it then. It's a small effort, and I think the
final results would be better too.

Thanks and Regards,
Dario

--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)