All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Add CPU topology info (thread/core/socket) in xenpm
@ 2009-03-13  9:00 Yu, Ke
  2009-03-13  9:46 ` Akio Takebe
  0 siblings, 1 reply; 4+ messages in thread
From: Yu, Ke @ 2009-03-13  9:00 UTC (permalink / raw)
  To: Keir Fraser
  Cc: Liu, Jinsong, Tian, Kevin, xen-devel@lists.xensource.com,
	Wei, Gang

[-- Attachment #1: Type: text/plain, Size: 9461 bytes --]

Add CPU topology info (thread/core/socket) in xenpm

CPU topology info is necessary for power management analysis. For example, to analysis the effect of Px state coordination, Cx package/core coordination,  the thread/core/socket topology information is needed.

This patch add new command "get-cpu-topology" in xenpm to print the CPU topology info:

e.g. in a 2 sockets, 4 cores per socket machine, the output is as follow:
# xenpm get-cpu-topology
CPU     core    socket
CPU0     0       0
CPU1     0       1
CPU2     1       0
CPU3     1       1
CPU4     2       0
CPU5     2       1
CPU6     3       0
CPU7     3       1

indicating socket 0 has CPU 0,2,4,6, and socket 1 has CPU 1,3,5,7

Signed-off-by: Yu Ke <ke.yu@intel.com>

diff -r 4fd39881f9f1 tools/libxc/xc_pm.c
--- a/tools/libxc/xc_pm.c
+++ b/tools/libxc/xc_pm.c
@@ -306,3 +306,24 @@ int xc_set_cpufreq_para(int xc_handle, i
 
     return xc_sysctl(xc_handle, &sysctl);
 }
+
+int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info)
+{
+    int rc;
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_pm_op;
+    sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_get_cputopo;
+    sysctl.u.pm_op.cpuid = 0;
+    set_xen_guest_handle( sysctl.u.pm_op.get_topo.cpu_to_core,
+                         info->cpu_to_core );
+    set_xen_guest_handle( sysctl.u.pm_op.get_topo.cpu_to_socket,
+                         info->cpu_to_socket );
+    sysctl.u.pm_op.get_topo.max_cpus = info->max_cpus;
+
+    rc = do_sysctl(xc_handle, &sysctl);
+    info->nr_cpus = sysctl.u.pm_op.get_topo.nr_cpus;
+
+    return rc;
+}
+
diff -r 4fd39881f9f1 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -1242,4 +1242,21 @@ int xc_set_cpufreq_gov(int xc_handle, in
 int xc_set_cpufreq_gov(int xc_handle, int cpuid, char *govname);
 int xc_set_cpufreq_para(int xc_handle, int cpuid,
                         int ctrl_type, int ctrl_value);
+
+struct xc_get_cputopo {
+     /* IN: maximum addressable entry in
+      * the caller-provided cpu_to_core/socket.
+      */
+    uint32_t max_cpus;
+    uint32_t *cpu_to_core;
+    uint32_t *cpu_to_socket;
+
+    /* OUT: number of cpus returned
+     * If OUT is greater than IN then the cpu_to_core/socket is truncated!
+     */
+    uint32_t nr_cpus;
+};
+
+int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info);
+
 #endif /* XENCTRL_H */
diff -r 4fd39881f9f1 tools/misc/xenpm.c
--- a/tools/misc/xenpm.c
+++ b/tools/misc/xenpm.c
@@ -58,6 +58,7 @@ void show_help(void)
             "                                     it is used in ondemand governor.\n"
             " set-up-threshold      [cpuid] <num> set up threshold on CPU <cpuid> or all\n"
             "                                     it is used in ondemand governor.\n"
+            " get-cpu-topology                    get thread/core/socket topology info\n"
             " start                               start collect Cx/Px statistics,\n"
             "                                     output after CTRL-C or SIGINT.\n"
             );
@@ -750,6 +751,40 @@ out:
     fprintf(stderr, "failed to set governor name\n");
 }
 
+#define MAX_NR_CPU 512
+
+void cpu_topology_func(int argc, char *argv[])
+{
+    uint32_t cpu_to_core[MAX_NR_CPU];
+    uint32_t cpu_to_socket[MAX_NR_CPU];
+    struct xc_get_cputopo info;
+    int i, ret;
+
+    info.cpu_to_core = cpu_to_core;
+    info.cpu_to_socket = cpu_to_socket;
+    info.max_cpus = MAX_NR_CPU;
+    ret = xc_get_cputopo(xc_fd, &info);
+    if (!ret)
+    {
+        printf("CPU\tcore\tsocket\n");
+        for (i=0; i<info.nr_cpus; i++)
+        {
+            if ( info.cpu_to_core[i] != INVALID_TOPOLOGY_ID &&
+                    info.cpu_to_socket[i] != INVALID_TOPOLOGY_ID )
+            {
+            printf("CPU%d\t %d\t %d\n", i, info.cpu_to_core[i],
+                    info.cpu_to_socket[i]);
+            }
+        }
+    }
+    else
+    {
+        printf("Can not get Xen CPU topology!\n");
+    }
+
+    return ;
+}
+
 struct {
     const char *name;
     void (*function)(int argc, char *argv[]);
@@ -765,6 +800,7 @@ struct {
     { "set-scaling-speed", scaling_speed_func },
     { "set-sampling-rate", scaling_sampling_rate_func },
     { "set-up-threshold", scaling_up_threshold_func },
+    { "get-cpu-topology", cpu_topology_func},
 };
 
 int main(int argc, char *argv[])
diff -r 4fd39881f9f1 xen/common/sysctl.c
--- a/xen/common/sysctl.c
+++ b/xen/common/sysctl.c
@@ -224,12 +224,11 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
         if ( ret && (ret != -EAGAIN) )
             break;
 
-        if ( op->u.pm_op.cmd == GET_CPUFREQ_PARA )
-            if ( copy_to_guest(u_sysctl, op, 1) )
-            {
-                ret = -EFAULT;
-                break;
-            }
+        if ( copy_to_guest(u_sysctl, op, 1) )
+        {
+            ret = -EFAULT;
+            break;
+        }
     }
     break;
 
diff -r 4fd39881f9f1 xen/drivers/acpi/pmstat.c
--- a/xen/drivers/acpi/pmstat.c
+++ b/xen/drivers/acpi/pmstat.c
@@ -416,6 +416,52 @@ static int set_cpufreq_para(struct xen_s
     return ret;
 }
 
+static int get_cputopo (struct xen_sysctl_pm_op *op)
+{
+    uint32_t i, nr_cpus;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_core_arr;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_socket_arr;
+    int arr_size, ret=0;
+
+    cpu_to_core_arr = op->get_topo.cpu_to_core;
+    cpu_to_socket_arr = op->get_topo.cpu_to_socket;
+    arr_size= min_t(uint32_t, op->get_topo.max_cpus, NR_CPUS);
+
+    if ( guest_handle_is_null( cpu_to_core_arr ) ||
+            guest_handle_is_null(  cpu_to_socket_arr) )
+    {
+        ret = -EINVAL;
+        goto out;
+    }
+
+    nr_cpus = 0;
+    for ( i = 0; i < arr_size; i++ )
+    {
+        uint32_t core, socket;
+        if ( cpu_online(i) )
+        {
+            core = cpu_to_core(i);
+            socket = cpu_to_socket(i);
+            nr_cpus = i;
+        }
+        else
+        {
+            core = socket = INVALID_TOPOLOGY_ID;
+        }
+
+        if ( copy_to_guest_offset(cpu_to_core_arr, i, &core, 1) ||
+                copy_to_guest_offset(cpu_to_socket_arr, i, &socket, 1))
+        {
+            ret = -EFAULT;
+            goto out;
+        }
+    }
+
+    op->get_topo.nr_cpus = nr_cpus + 1;
+out:
+    return ret;
+}
+
 int do_pm_op(struct xen_sysctl_pm_op *op)
 {
     int ret = 0;
@@ -433,8 +479,6 @@ int do_pm_op(struct xen_sysctl_pm_op *op
         if ( !pmpt || !(pmpt->perf.init & XEN_PX_INIT) )
             return -EINVAL;
         break;
-    default:
-        return -ENODEV;
     }
 
     switch ( op->cmd )
@@ -457,6 +501,12 @@ int do_pm_op(struct xen_sysctl_pm_op *op
         break;
     }
 
+    case XEN_SYSCTL_pm_op_get_cputopo:
+    {
+        ret = get_cputopo(op);
+        break;
+    }
+
     default:
         printk("not defined sub-hypercall @ do_pm_op\n");
         ret = -ENOSYS;
diff -r 4fd39881f9f1 xen/include/asm-ia64/linux-xen/asm/processor.h
--- a/xen/include/asm-ia64/linux-xen/asm/processor.h
+++ b/xen/include/asm-ia64/linux-xen/asm/processor.h
@@ -197,6 +197,14 @@ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu
  */
 #define local_cpu_data		(&__ia64_per_cpu_var(cpu_info))
 #define cpu_data(cpu)		(&per_cpu(cpu_info, cpu))
+
+#ifdef CONFIG_SMP
+#define cpu_to_core(cpu)    (cpu_data(cpu)->core_id)
+#define cpu_to_socket(cpu)  (cpu_data(cpu)->socket_id)
+#else
+#define cpu_to_core(cpu)    0
+#define cpu_to_socket(cpu)  0
+#endif
 
 extern void identify_cpu (struct cpuinfo_ia64 *);
 extern void print_cpu_info (struct cpuinfo_ia64 *);
diff -r 4fd39881f9f1 xen/include/asm-x86/processor.h
--- a/xen/include/asm-x86/processor.h
+++ b/xen/include/asm-x86/processor.h
@@ -203,6 +203,9 @@ extern void detect_ht(struct cpuinfo_x86
 #else
 static always_inline void detect_ht(struct cpuinfo_x86 *c) {}
 #endif
+
+#define cpu_to_core(_cpu)   (cpu_core_id[_cpu])
+#define cpu_to_socket(_cpu) (phys_proc_id[_cpu])
 
 /*
  * Generic CPUID function
diff -r 4fd39881f9f1 xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -339,6 +339,24 @@ struct xen_set_cpufreq_para {
 
     uint32_t ctrl_type;
     uint32_t ctrl_value;
+}
+;
+/* Get physical CPU topology information. */
+
+
+#define INVALID_TOPOLOGY_ID  (~0U)
+struct xen_get_cputopo {
+     /* IN: maximum addressable entry in
+      * the caller-provided cpu_to_core/socket.
+      */
+    uint32_t max_cpus;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_core;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_socket;
+
+    /* OUT: number of cpus returned
+     * If OUT is greater than IN then the cpu_to_core/socket is truncated!
+     */
+    uint32_t nr_cpus;
 };
 
 struct xen_sysctl_pm_op {
@@ -350,12 +368,16 @@ struct xen_sysctl_pm_op {
     #define SET_CPUFREQ_GOV            (CPUFREQ_PARA | 0x02)
     #define SET_CPUFREQ_PARA           (CPUFREQ_PARA | 0x03)
 
+    /* get CPU topology */
+    #define XEN_SYSCTL_pm_op_get_cputopo  0x20
+
     uint32_t cmd;
     uint32_t cpuid;
     union {
         struct xen_get_cpufreq_para get_para;
         struct xen_set_cpufreq_gov  set_gov;
         struct xen_set_cpufreq_para set_para;
+        struct xen_get_cputopo      get_topo;
     };
 };

[-- Attachment #2: cpu-topology.patch --]
[-- Type: application/octet-stream, Size: 9155 bytes --]

Add CPU topology info (thread/core/socket) in xenpm

CPU topology info is necessary for power management analysis. For example, to analysis the effect of Px state coordination, Cx package/core coordination,  the thread/core/socket topology information is needed.

This patch add new command "get-cpu-topology" in xenpm to print the CPU topology info:

e.g in a two sockets, 4 cores per socket machine, the output is as follow:
# xenpm get-cpu-topology
CPU     core    socket
CPU0     0       0
CPU1     0       1
CPU2     1       0
CPU3     1       1
CPU4     2       0
CPU5     2       1
CPU6     3       0
CPU7     3       1

indicating socket 0 has CPU 0,2,4,6, and socket 1 has CPU 1,3,5,7

Signed-off-by: Yu Ke <ke.yu@intel.com>

diff -r 4fd39881f9f1 tools/libxc/xc_pm.c
--- a/tools/libxc/xc_pm.c
+++ b/tools/libxc/xc_pm.c
@@ -306,3 +306,24 @@ int xc_set_cpufreq_para(int xc_handle, i
 
     return xc_sysctl(xc_handle, &sysctl);
 }
+
+int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info)
+{
+    int rc;
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_pm_op;
+    sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_get_cputopo;
+    sysctl.u.pm_op.cpuid = 0;
+    set_xen_guest_handle( sysctl.u.pm_op.get_topo.cpu_to_core,
+                         info->cpu_to_core );
+    set_xen_guest_handle( sysctl.u.pm_op.get_topo.cpu_to_socket,
+                         info->cpu_to_socket );
+    sysctl.u.pm_op.get_topo.max_cpus = info->max_cpus;
+
+    rc = do_sysctl(xc_handle, &sysctl);
+    info->nr_cpus = sysctl.u.pm_op.get_topo.nr_cpus;
+
+    return rc;
+}
+
diff -r 4fd39881f9f1 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -1242,4 +1242,21 @@ int xc_set_cpufreq_gov(int xc_handle, in
 int xc_set_cpufreq_gov(int xc_handle, int cpuid, char *govname);
 int xc_set_cpufreq_para(int xc_handle, int cpuid,
                         int ctrl_type, int ctrl_value);
+
+struct xc_get_cputopo {
+     /* IN: maximum addressable entry in
+      * the caller-provided cpu_to_core/socket.
+      */
+    uint32_t max_cpus;
+    uint32_t *cpu_to_core;
+    uint32_t *cpu_to_socket;
+
+    /* OUT: number of cpus returned
+     * If OUT is greater than IN then the cpu_to_core/socket is truncated!
+     */
+    uint32_t nr_cpus;
+};
+
+int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info);
+
 #endif /* XENCTRL_H */
diff -r 4fd39881f9f1 tools/misc/xenpm.c
--- a/tools/misc/xenpm.c
+++ b/tools/misc/xenpm.c
@@ -58,6 +58,7 @@ void show_help(void)
             "                                     it is used in ondemand governor.\n"
             " set-up-threshold      [cpuid] <num> set up threshold on CPU <cpuid> or all\n"
             "                                     it is used in ondemand governor.\n"
+            " get-cpu-topology                    get thread/core/socket topology info\n"
             " start                               start collect Cx/Px statistics,\n"
             "                                     output after CTRL-C or SIGINT.\n"
             );
@@ -750,6 +751,40 @@ out:
     fprintf(stderr, "failed to set governor name\n");
 }
 
+#define MAX_NR_CPU 512
+
+void cpu_topology_func(int argc, char *argv[])
+{
+    uint32_t cpu_to_core[MAX_NR_CPU];
+    uint32_t cpu_to_socket[MAX_NR_CPU];
+    struct xc_get_cputopo info;
+    int i, ret;
+
+    info.cpu_to_core = cpu_to_core;
+    info.cpu_to_socket = cpu_to_socket;
+    info.max_cpus = MAX_NR_CPU;
+    ret = xc_get_cputopo(xc_fd, &info);
+    if (!ret)
+    {
+        printf("CPU\tcore\tsocket\n");
+        for (i=0; i<info.nr_cpus; i++)
+        {
+            if ( info.cpu_to_core[i] != INVALID_TOPOLOGY_ID &&
+                    info.cpu_to_socket[i] != INVALID_TOPOLOGY_ID )
+            {
+            printf("CPU%d\t %d\t %d\n", i, info.cpu_to_core[i],
+                    info.cpu_to_socket[i]);
+            }
+        }
+    }
+    else
+    {
+        printf("Can not get Xen CPU topology!\n");
+    }
+
+    return ;
+}
+
 struct {
     const char *name;
     void (*function)(int argc, char *argv[]);
@@ -765,6 +800,7 @@ struct {
     { "set-scaling-speed", scaling_speed_func },
     { "set-sampling-rate", scaling_sampling_rate_func },
     { "set-up-threshold", scaling_up_threshold_func },
+    { "get-cpu-topology", cpu_topology_func},
 };
 
 int main(int argc, char *argv[])
diff -r 4fd39881f9f1 xen/common/sysctl.c
--- a/xen/common/sysctl.c
+++ b/xen/common/sysctl.c
@@ -224,12 +224,11 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
         if ( ret && (ret != -EAGAIN) )
             break;
 
-        if ( op->u.pm_op.cmd == GET_CPUFREQ_PARA )
-            if ( copy_to_guest(u_sysctl, op, 1) )
-            {
-                ret = -EFAULT;
-                break;
-            }
+        if ( copy_to_guest(u_sysctl, op, 1) )
+        {
+            ret = -EFAULT;
+            break;
+        }
     }
     break;
 
diff -r 4fd39881f9f1 xen/drivers/acpi/pmstat.c
--- a/xen/drivers/acpi/pmstat.c
+++ b/xen/drivers/acpi/pmstat.c
@@ -416,6 +416,52 @@ static int set_cpufreq_para(struct xen_s
     return ret;
 }
 
+static int get_cputopo (struct xen_sysctl_pm_op *op)
+{
+    uint32_t i, nr_cpus;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_core_arr;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_socket_arr;
+    int arr_size, ret=0;
+
+    cpu_to_core_arr = op->get_topo.cpu_to_core;
+    cpu_to_socket_arr = op->get_topo.cpu_to_socket;
+    arr_size= min_t(uint32_t, op->get_topo.max_cpus, NR_CPUS);
+
+    if ( guest_handle_is_null( cpu_to_core_arr ) ||
+            guest_handle_is_null(  cpu_to_socket_arr) )
+    {
+        ret = -EINVAL;
+        goto out;
+    }
+
+    nr_cpus = 0;
+    for ( i = 0; i < arr_size; i++ )
+    {
+        uint32_t core, socket;
+        if ( cpu_online(i) )
+        {
+            core = cpu_to_core(i);
+            socket = cpu_to_socket(i);
+            nr_cpus = i;
+        }
+        else
+        {
+            core = socket = INVALID_TOPOLOGY_ID;
+        }
+
+        if ( copy_to_guest_offset(cpu_to_core_arr, i, &core, 1) ||
+                copy_to_guest_offset(cpu_to_socket_arr, i, &socket, 1))
+        {
+            ret = -EFAULT;
+            goto out;
+        }
+    }
+
+    op->get_topo.nr_cpus = nr_cpus + 1;
+out:
+    return ret;
+}
+
 int do_pm_op(struct xen_sysctl_pm_op *op)
 {
     int ret = 0;
@@ -433,8 +479,6 @@ int do_pm_op(struct xen_sysctl_pm_op *op
         if ( !pmpt || !(pmpt->perf.init & XEN_PX_INIT) )
             return -EINVAL;
         break;
-    default:
-        return -ENODEV;
     }
 
     switch ( op->cmd )
@@ -457,6 +501,12 @@ int do_pm_op(struct xen_sysctl_pm_op *op
         break;
     }
 
+    case XEN_SYSCTL_pm_op_get_cputopo:
+    {
+        ret = get_cputopo(op);
+        break;
+    }
+
     default:
         printk("not defined sub-hypercall @ do_pm_op\n");
         ret = -ENOSYS;
diff -r 4fd39881f9f1 xen/include/asm-ia64/linux-xen/asm/processor.h
--- a/xen/include/asm-ia64/linux-xen/asm/processor.h
+++ b/xen/include/asm-ia64/linux-xen/asm/processor.h
@@ -197,6 +197,14 @@ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu
  */
 #define local_cpu_data		(&__ia64_per_cpu_var(cpu_info))
 #define cpu_data(cpu)		(&per_cpu(cpu_info, cpu))
+
+#ifdef CONFIG_SMP
+#define cpu_to_core(cpu)    (cpu_data(cpu)->core_id)
+#define cpu_to_socket(cpu)  (cpu_data(cpu)->socket_id)
+#else
+#define cpu_to_core(cpu)    0
+#define cpu_to_socket(cpu)  0
+#endif
 
 extern void identify_cpu (struct cpuinfo_ia64 *);
 extern void print_cpu_info (struct cpuinfo_ia64 *);
diff -r 4fd39881f9f1 xen/include/asm-x86/processor.h
--- a/xen/include/asm-x86/processor.h
+++ b/xen/include/asm-x86/processor.h
@@ -203,6 +203,9 @@ extern void detect_ht(struct cpuinfo_x86
 #else
 static always_inline void detect_ht(struct cpuinfo_x86 *c) {}
 #endif
+
+#define cpu_to_core(_cpu)   (cpu_core_id[_cpu])
+#define cpu_to_socket(_cpu) (phys_proc_id[_cpu])
 
 /*
  * Generic CPUID function
diff -r 4fd39881f9f1 xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -339,6 +339,24 @@ struct xen_set_cpufreq_para {
 
     uint32_t ctrl_type;
     uint32_t ctrl_value;
+}
+;
+/* Get physical CPU topology information. */
+
+
+#define INVALID_TOPOLOGY_ID  (~0U)
+struct xen_get_cputopo {
+     /* IN: maximum addressable entry in
+      * the caller-provided cpu_to_core/socket.
+      */
+    uint32_t max_cpus;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_core;
+    XEN_GUEST_HANDLE_64(uint32) cpu_to_socket;
+
+    /* OUT: number of cpus returned
+     * If OUT is greater than IN then the cpu_to_core/socket is truncated!
+     */
+    uint32_t nr_cpus;
 };
 
 struct xen_sysctl_pm_op {
@@ -350,12 +368,16 @@ struct xen_sysctl_pm_op {
     #define SET_CPUFREQ_GOV            (CPUFREQ_PARA | 0x02)
     #define SET_CPUFREQ_PARA           (CPUFREQ_PARA | 0x03)
 
+    /* get CPU topology */
+    #define XEN_SYSCTL_pm_op_get_cputopo  0x20
+
     uint32_t cmd;
     uint32_t cpuid;
     union {
         struct xen_get_cpufreq_para get_para;
         struct xen_set_cpufreq_gov  set_gov;
         struct xen_set_cpufreq_para set_para;
+        struct xen_get_cputopo      get_topo;
     };
 };
 

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add CPU topology info (thread/core/socket) in xenpm
  2009-03-13  9:00 [PATCH] Add CPU topology info (thread/core/socket) in xenpm Yu, Ke
@ 2009-03-13  9:46 ` Akio Takebe
  2009-03-13 10:46   ` Akio Takebe
  0 siblings, 1 reply; 4+ messages in thread
From: Akio Takebe @ 2009-03-13  9:46 UTC (permalink / raw)
  To: Yu, Ke
  Cc: Liu, Jinsong, Tian, Kevin, xen-devel@lists.xensource.com,
	Keir Fraser, Wei, Gang

Hi, Yu

Good patch! We wanted this feature.

> Add CPU topology info (thread/core/socket) in xenpm
Can this patch show thread?

> +#define MAX_NR_CPU 512
> +
> +void cpu_topology_func(int argc, char *argv[])
> +{
> +    uint32_t cpu_to_core[MAX_NR_CPU];
> +    uint32_t cpu_to_socket[MAX_NR_CPU];
> +    struct xc_get_cputopo info;
> +    int i, ret;
> +
> +    info.cpu_to_core = cpu_to_core;
> +    info.cpu_to_socket = cpu_to_socket;
> +    info.max_cpus = MAX_NR_CPU;
> +    ret = xc_get_cputopo(xc_fd, &info);
> +    if (!ret)
> +    {
> +        printf("CPU\tcore\tsocket\n");
> +        for (i=0; i<info.nr_cpus; i++)
> +        {
> +            if ( info.cpu_to_core[i] != INVALID_TOPOLOGY_ID &&
> +                    info.cpu_to_socket[i] != INVALID_TOPOLOGY_ID )
> +            {
> +            printf("CPU%d\t %d\t %d\n", i, info.cpu_to_core[i],
> +                    info.cpu_to_socket[i]);
> +            }
> +        }
> +    }
> +    else
> +    {
> +        printf("Can not get Xen CPU topology!\n");
> +    }
> +
> +    return ;
> +}
The function looks like only show core/socket.

Best Regards,

Akio Takebe

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add CPU topology info (thread/core/socket) in xenpm
  2009-03-13  9:46 ` Akio Takebe
@ 2009-03-13 10:46   ` Akio Takebe
  2009-03-13 12:45     ` Yu Ke
  0 siblings, 1 reply; 4+ messages in thread
From: Akio Takebe @ 2009-03-13 10:46 UTC (permalink / raw)
  To: Yu, Ke
  Cc: Liu, Jinsong, Tian, Kevin, xen-devel@lists.xensource.com,
	Keir Fraser, Wei, Gang

Hi,

Akio Takebe wrote:
> Hi, Yu
> 
> Good patch! We wanted this feature.
> 
>> Add CPU topology info (thread/core/socket) in xenpm
> Can this patch show thread?
> 
>> +#define MAX_NR_CPU 512
>> +
>> +void cpu_topology_func(int argc, char *argv[])
>> +{
>> +    uint32_t cpu_to_core[MAX_NR_CPU];
>> +    uint32_t cpu_to_socket[MAX_NR_CPU];
>> +    struct xc_get_cputopo info;
>> +    int i, ret;
>> +
>> +    info.cpu_to_core = cpu_to_core;
>> +    info.cpu_to_socket = cpu_to_socket;
>> +    info.max_cpus = MAX_NR_CPU;
>> +    ret = xc_get_cputopo(xc_fd, &info);
>> +    if (!ret)
>> +    {
>> +        printf("CPU\tcore\tsocket\n");
>> +        for (i=0; i<info.nr_cpus; i++)
>> +        {
>> +            if ( info.cpu_to_core[i] != INVALID_TOPOLOGY_ID &&
>> +                    info.cpu_to_socket[i] != INVALID_TOPOLOGY_ID )
>> +            {
>> +            printf("CPU%d\t %d\t %d\n", i, info.cpu_to_core[i],
>> +                    info.cpu_to_socket[i]);
>> +            }
>> +        }
>> +    }
>> +    else
>> +    {
>> +        printf("Can not get Xen CPU topology!\n");
>> +    }
>> +
>> +    return ;
>> +}
> The function looks like only show core/socket.
> 
Is the CPU%d means thread?

Best Regards,

Akio Takebe

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Add CPU topology info (thread/core/socket) in xenpm
  2009-03-13 10:46   ` Akio Takebe
@ 2009-03-13 12:45     ` Yu Ke
  0 siblings, 0 replies; 4+ messages in thread
From: Yu Ke @ 2009-03-13 12:45 UTC (permalink / raw)
  To: Akio Takebe
  Cc: Liu, Jinsong, Tian, Kevin, xen-devel@lists.xensource.com,
	Keir Fraser, Yu, Ke, Wei, Gang

2009/3/13 Akio Takebe <takebe_akio@jp.fujitsu.com>:
> Hi,
>
> Akio Takebe wrote:
>> Hi, Yu
>>
>> Good patch! We wanted this feature.
>>
>>> Add CPU topology info (thread/core/socket) in xenpm
>> Can this patch show thread?
>>
>>> +#define MAX_NR_CPU 512
>>> +
>>> +void cpu_topology_func(int argc, char *argv[])
>>> +{
>>> +    uint32_t cpu_to_core[MAX_NR_CPU];
>>> +    uint32_t cpu_to_socket[MAX_NR_CPU];
>>> +    struct xc_get_cputopo info;
>>> +    int i, ret;
>>> +
>>> +    info.cpu_to_core = cpu_to_core;
>>> +    info.cpu_to_socket = cpu_to_socket;
>>> +    info.max_cpus = MAX_NR_CPU;
>>> +    ret = xc_get_cputopo(xc_fd, &info);
>>> +    if (!ret)
>>> +    {
>>> +        printf("CPU\tcore\tsocket\n");
>>> +        for (i=0; i<info.nr_cpus; i++)
>>> +        {
>>> +            if ( info.cpu_to_core[i] != INVALID_TOPOLOGY_ID &&
>>> +                    info.cpu_to_socket[i] != INVALID_TOPOLOGY_ID )
>>> +            {
>>> +            printf("CPU%d\t %d\t %d\n", i, info.cpu_to_core[i],
>>> +                    info.cpu_to_socket[i]);
>>> +            }
>>> +        }
>>> +    }
>>> +    else
>>> +    {
>>> +        printf("Can not get Xen CPU topology!\n");
>>> +    }
>>> +
>>> +    return ;
>>> +}
>> The function looks like only show core/socket.
>>
> Is the CPU%d means thread?
>
> Best Regards,
>
> Akio Takebe

Yes, you are right :)  thread is the smallest unit, so here just use
CPU for thread.

A thread related example is, in a 2 sockets system, where 4 cores per
socket and 2 threads per core, here is a possible output

# xenpm get-cpu-topology
CPU     core    socket
CPU0     0       0
CPU1     0       1
CPU2     1       0
CPU3     1       1
CPU4     2       0
CPU5     2       1
CPU6     3       0
CPU7     3       1
CPU8     0       0
CPU9     0       1
CPU10    1       0
CPU11    1       1
CPU12    2       0
CPU13    2       1
CPU14    3       0
CPU15    3       1

Indicating the following topology
socket 0:
      core 0: CPU0 CPU8
      core 1: CPU2 CPU10
      core 2: CPU4 CPU12
      core 3: CPU6 CPU14
socket 1:
      core 0: CPU1 CPU9
      core 1: CPU3 CPU11
      core 2: CPU5 CPU13
      core 3: CPU7 CPU15

Probably later I can add one option to make xenpm output the above
more human-readable format.

Best Regards
Ke

Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-03-13 12:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-13  9:00 [PATCH] Add CPU topology info (thread/core/socket) in xenpm Yu, Ke
2009-03-13  9:46 ` Akio Takebe
2009-03-13 10:46   ` Akio Takebe
2009-03-13 12:45     ` Yu Ke

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.