All of lore.kernel.org
 help / color / mirror / Atom feed
From: George Dunlap <george.dunlap@eu.citrix.com>
To: Dario Faggioli <dario.faggioli@citrix.com>
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Xen-Devel <xen-devel@lists.xen.org>
Subject: Re: [PATCH 10 of 11 v4] xl: add node-affinity to the output of `xl list`
Date: Mon, 18 Mar 2013 14:06:57 +0000	[thread overview]
Message-ID: <51471F81.7060506@eu.citrix.com> (raw)
In-Reply-To: <0197084457098065914d.1363314652@hit-nxdomain.opendns.com>

On 15/03/13 02:30, Dario Faggioli wrote:
> 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'
> by the `-n' option.
>
> Re the patch, the print_bitmap() related hunk is _mostly_ code motion,
> although there is a very minor change in the code, basically to allow
> using the function for printing both cpu and node bitmaps (as, in case
> all bits are sets, it used to print "any cpu", which doesn't fit the
> nodemap case).
>
> Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
> Acked-by: Juergen Gross <juergen.gross@ts.fujitsu.com>

Can we get a tools maintainer comment (either ack / recommendation for 
improvement) sometime in the next few days, so that the next time Dario 
submits this series it can be taken wholesale?

  -George

> ---
> Changes from v3:
>   * removed the pastebin.com link from the changelog. Will reply to this
>     same mail with another one with the output of various invocations
>     of `xl list' with different options to show how it looks like.
>
> Changes from v1:
>   * print_{cpu,node}map() functions added instead of 'state variable'-izing
>     print_bitmap().
>
> 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
> @@ -3030,14 +3030,95 @@ out:
>       }
>   }
>   
> -static void list_domains(int verbose, int context, const libxl_dominfo *info, int nb_domain)
> +/* If map is not full, prints it and returns 0. Returns 1 otherwise. */
> +static int 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)
> +                return 1;
> +        case 3:
> +            fprintf(stream, "%s%d", state > 1 ? "," : "", firstset);
> +            if (i - 1 > firstset)
> +                fprintf(stream, "-%d", i - 1);
> +            break;
> +    }
> +
> +    return 0;
> +}
> +
> +static void print_cpumap(uint8_t *map, int maplen, FILE *stream)
> +{
> +    if (print_bitmap(map, maplen, stream))
> +        fprintf(stream, "any cpu");
> +}
> +
> +static void print_nodemap(uint8_t *map, int maplen, FILE *stream)
> +{
> +    if (print_bitmap(map, maplen, stream))
> +        fprintf(stream, "any node");
> +}
> +
> +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;
> @@ -3071,14 +3152,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_nodemap(nodemap.map, physinfo.nr_nodes, stdout);
> +        }
>           putchar('\n');
>       }
> +
> +    libxl_bitmap_dispose(&nodemap);
> +    libxl_physinfo_dispose(&physinfo);
>   }
>   
>   static void list_vm(void)
> @@ -3945,10 +4035,12 @@ int main_list(int argc, char **argv)
>       int opt, verbose = 0;
>       int context = 0;
>       int details = 0;
> +    int numa = 0;
>       static struct option opts[] = {
>           {"long", 0, 0, 'l'},
>           {"verbose", 0, 0, 'v'},
>           {"context", 0, 0, 'Z'},
> +        {"numa", 0, 0, 'n'},
>           COMMON_LONG_OPTS,
>           {0, 0, 0, 0}
>       };
> @@ -3957,7 +4049,7 @@ int main_list(int argc, char **argv)
>       libxl_dominfo *info, *info_free=0;
>       int nb_domain, rc;
>   
> -    SWITCH_FOREACH_OPT(opt, "lvhZ", opts, "list", 0) {
> +    SWITCH_FOREACH_OPT(opt, "lvhZn", opts, "list", 0) {
>       case 'l':
>           details = 1;
>           break;
> @@ -3967,6 +4059,9 @@ int main_list(int argc, char **argv)
>       case 'Z':
>           context = 1;
>           break;
> +    case 'n':
> +        numa = 1;
> +        break;
>       }
>   
>       if (optind >= argc) {
> @@ -3998,7 +4093,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);
> @@ -4247,56 +4342,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)
> @@ -4320,7 +4365,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_cpumap(vcpuinfo->cpumap.map, nr_cpus, stdout);
>       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,

  parent reply	other threads:[~2013-03-18 14:06 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-15  2:30 [PATCH 00 of 11 v4] NUMA aware credit scheduling Dario Faggioli
2013-03-15  2:30 ` [PATCH 01 of 11 v4] xen, libxc: rename xenctl_cpumap to xenctl_bitmap Dario Faggioli
2013-03-15  2:30 ` [PATCH 02 of 11 v4] xen, libxc: introduce xc_nodemap_t Dario Faggioli
2013-03-15  2:30 ` [PATCH 03 of 11 v4] xen: sched_credit: when picking, make sure we get an idle one, if any Dario Faggioli
2013-03-15  8:14   ` Jan Beulich
2013-03-15 10:37     ` Dario Faggioli
2013-03-15 10:55       ` Jan Beulich
2013-03-18 14:02         ` George Dunlap
2013-03-18 14:23           ` Dario Faggioli
2013-03-15  2:30 ` [PATCH 04 of 11 v4] xen: sched_credit: let the scheduler know about node-affinity Dario Faggioli
2013-03-18 13:58   ` George Dunlap
2013-03-15  2:30 ` [PATCH 05 of 11 v4] xen: allow for explicitly specifying node-affinity Dario Faggioli
2013-03-15  8:17   ` Jan Beulich
2013-03-15 14:20   ` Daniel De Graaf
2013-03-16  7:11     ` Dario Faggioli
2013-03-15  2:30 ` [PATCH 06 of 11 v4] libxc: " Dario Faggioli
2013-03-15  2:30 ` [PATCH 07 of 11 v4] libxl: " Dario Faggioli
2013-03-18 14:33   ` Ian Campbell
2013-03-18 14:35     ` Dario Faggioli
2013-03-15  2:30 ` [PATCH 08 of 11 v4] libxl: optimize the calculation of how many VCPUs can run on a candidate Dario Faggioli
2013-03-18 14:34   ` Ian Campbell
2013-03-15  2:30 ` [PATCH 09 of 11 v4] libxl: automatic placement deals with node-affinity Dario Faggioli
2013-03-18 14:36   ` Ian Campbell
2013-03-15  2:30 ` [PATCH 10 of 11 v4] xl: add node-affinity to the output of `xl list` Dario Faggioli
2013-03-15  3:03   ` Dario Faggioli
2013-03-18 14:06   ` George Dunlap [this message]
2013-03-18 14:21     ` Dario Faggioli
2013-03-18 14:13   ` Ian Campbell
2013-03-18 14:22     ` Dario Faggioli
2013-03-15  2:30 ` [PATCH 11 of 11 v4] docs: rearrange and update NUMA placement documentation Dario Faggioli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51471F81.7060506@eu.citrix.com \
    --to=george.dunlap@eu.citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=dario.faggioli@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.