On 12/02/15 19:44, Wei Liu wrote:
> Signed-off-by: Elena Ufimsteva <ufimts...@gmail.com>
> Signed-off-by: Wei Liu <wei.l...@citrix.com>
> Cc: Jan Beulich <jbeul...@suse.com>

Reviewed-by: Andrew Cooper <andrew.coop...@citrix.com>

> ---
> Changes in v5:
> 1. Use read_trylock.
> 2. Use correct array size for strlcpy.
> 3. Coding style fix.
>
> Changes in v4:
> 1. Acquire rwlock before accessing vnuma struct.
> 2. Improve output.
>
> Changes in v3:
> 1. Constify struct vnuma_info.
> 2. Don't print amount of ram of a vmemrange.
> 3. Process softirqs when dumping information.
> 4. Fix format string.
>
> Changes in v2:
> 1. Use unsigned int for loop vars.
> 2. Use strlcpy.
> 3. Properly align output.
> ---
>  xen/arch/x86/numa.c | 71 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 70 insertions(+), 1 deletion(-)
>
> diff --git a/xen/arch/x86/numa.c b/xen/arch/x86/numa.c
> index 628a40a..e500f33 100644
> --- a/xen/arch/x86/numa.c
> +++ b/xen/arch/x86/numa.c
> @@ -16,6 +16,7 @@
>  #include <xen/pfn.h>
>  #include <asm/acpi.h>
>  #include <xen/sched.h>
> +#include <xen/softirq.h>
>  
>  static int numa_setup(char *s);
>  custom_param("numa", numa_setup);
> @@ -363,10 +364,12 @@ EXPORT_SYMBOL(node_data);
>  static void dump_numa(unsigned char key)
>  {
>      s_time_t now = NOW();
> -    int i;
> +    unsigned int i, j;
> +    int err;
>      struct domain *d;
>      struct page_info *page;
>      unsigned int page_num_node[MAX_NUMNODES];
> +    const struct vnuma_info *vnuma;
>  
>      printk("'%c' pressed -> dumping numa info (now-0x%X:%08X)\n", key,
>             (u32)(now>>32), (u32)now);
> @@ -393,6 +396,8 @@ static void dump_numa(unsigned char key)
>      printk("Memory location of each domain:\n");
>      for_each_domain ( d )
>      {
> +        process_pending_softirqs();
> +
>          printk("Domain %u (total: %u):\n", d->domain_id, d->tot_pages);
>  
>          for_each_online_node ( i )
> @@ -408,6 +413,70 @@ static void dump_numa(unsigned char key)
>  
>          for_each_online_node ( i )
>              printk("    Node %u: %u\n", i, page_num_node[i]);
> +
> +        if ( !read_trylock(&d->vnuma_rwlock) )
> +            continue;
> +
> +        if ( !d->vnuma )
> +        {
> +            read_unlock(&d->vnuma_rwlock);
> +            continue;
> +        }
> +
> +        vnuma = d->vnuma;
> +        printk("     %u vnodes, %u vcpus, guest physical layout:\n",
> +               vnuma->nr_vnodes, d->max_vcpus);
> +        for ( i = 0; i < vnuma->nr_vnodes; i++ )r
> +        {
> +            unsigned int start_cpu = ~0U;
> +
> +            err = snprintf(keyhandler_scratch, 12, "%3u",
> +                    vnuma->vnode_to_pnode[i]);
> +            if ( err < 0 || vnuma->vnode_to_pnode[i] == NUMA_NO_NODE )
> +                strlcpy(keyhandler_scratch, "???", 
> sizeof(keyhandler_scratch));
> +
> +            printk("       %3u: pnode %s,", i, keyhandler_scratch);
> +
> +            printk(" vcpus ");
> +
> +            for ( j = 0; j < d->max_vcpus; j++ )
> +            {
> +                if ( !(j & 0x3f) )
> +                    process_pending_softirqs();
> +
> +                if ( vnuma->vcpu_to_vnode[j] == i )
> +                {
> +                    if ( start_cpu == ~0U )
> +                    {
> +                        printk("%d", j);
> +                        start_cpu = j;
> +                    }
> +                }
> +                else if ( start_cpu != ~0U )
> +                {
> +                    if ( j - 1 != start_cpu )
> +                        printk("-%d ", j - 1);
> +                    else
> +                        printk(" ");
> +                    start_cpu = ~0U;
> +                }
> +            }
> +
> +            if ( start_cpu != ~0U  && start_cpu != j - 1 )
> +                printk("-%d", j - 1);
> +
> +            printk("\n");
> +
> +            for ( j = 0; j < vnuma->nr_vmemranges; j++ )
> +            {
> +                if ( vnuma->vmemrange[j].nid == i )
> +                    printk("           %016"PRIx64" - %016"PRIx64"\n",
> +                           vnuma->vmemrange[j].start,
> +                           vnuma->vmemrange[j].end);
> +            }
> +        }
> +
> +        read_unlock(&d->vnuma_rwlock);
>      }
>  
>      rcu_read_unlock(&domlist_read_lock);



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to