[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 for Xen 4.6 2/6] tools/libxl: fix socket display error for CMT
When displaying the CMT information for all the sockets, we assume socket number is continuous. This is not true in the hotplug case. For instance, when the 3rd socket is plugged out on a 4-socket system, the available sockets numbers are 1,2,4 but current we will display the CMT information for socket 1,2,3. The fix is getting the socket bitmap for all the sockets on the system first and then displaying CMT information for_each_set_bit in that bitmap. Signed-off-by: Chao Peng <chao.p.peng@xxxxxxxxxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- v2: * add libxl_bitmap_init(). --- tools/libxl/xl_cmdimpl.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 2706759..f01d245 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -8192,7 +8192,7 @@ static int psr_cmt_get_mem_bandwidth(uint32_t domid, static void psr_cmt_print_domain_info(libxl_dominfo *dominfo, libxl_psr_cmt_type type, - uint32_t nr_sockets) + libxl_bitmap *socketmap) { char *domain_name; uint32_t socketid; @@ -8205,7 +8205,7 @@ static void psr_cmt_print_domain_info(libxl_dominfo *dominfo, printf("%-40s %5d", domain_name, dominfo->domid); free(domain_name); - for (socketid = 0; socketid < nr_sockets; socketid++) { + libxl_for_each_set_bit(socketid, *socketmap) { switch (type) { case LIBXL_PSR_CMT_TYPE_CACHE_OCCUPANCY: if (!libxl_psr_cmt_get_sample(ctx, dominfo->domid, type, socketid, @@ -8228,9 +8228,9 @@ static void psr_cmt_print_domain_info(libxl_dominfo *dominfo, static int psr_cmt_show(libxl_psr_cmt_type type, uint32_t domid) { - uint32_t i, socketid, nr_sockets, total_rmid; + uint32_t i, socketid, total_rmid; uint32_t l3_cache_size; - libxl_physinfo info; + libxl_bitmap socketmap; int rc, nr_domains; if (!libxl_psr_cmt_enabled(ctx)) { @@ -8244,41 +8244,39 @@ static int psr_cmt_show(libxl_psr_cmt_type type, uint32_t domid) return -1; } - libxl_physinfo_init(&info); - rc = libxl_get_physinfo(ctx, &info); + libxl_bitmap_init(&socketmap); + libxl_socket_bitmap_alloc(ctx, &socketmap, 0); + rc = libxl_get_online_socketmap(ctx, &socketmap); if (rc < 0) { - fprintf(stderr, "Failed getting physinfo, rc: %d\n", rc); - libxl_physinfo_dispose(&info); - return -1; + fprintf(stderr, "Failed getting available sockets, rc: %d\n", rc); + goto out; } - nr_sockets = info.nr_cpus / info.threads_per_core / info.cores_per_socket; - libxl_physinfo_dispose(&info); rc = libxl_psr_cmt_get_total_rmid(ctx, &total_rmid); if (rc < 0) { fprintf(stderr, "Failed to get max RMID value\n"); - return -1; + goto out; } printf("Total RMID: %d\n", total_rmid); /* Header */ printf("%-40s %5s", "Name", "ID"); - for (socketid = 0; socketid < nr_sockets; socketid++) + libxl_for_each_set_bit(socketid, socketmap) printf("%14s %d", "Socket", socketid); printf("\n"); if (type == LIBXL_PSR_CMT_TYPE_CACHE_OCCUPANCY) { /* Total L3 cache size */ printf("%-46s", "Total L3 Cache Size"); - for (socketid = 0; socketid < nr_sockets; socketid++) { + libxl_for_each_set_bit(socketid, socketmap) { rc = libxl_psr_cmt_get_l3_cache_size(ctx, socketid, &l3_cache_size); if (rc < 0) { fprintf(stderr, "Failed to get system l3 cache size for socket:%d\n", socketid); - return -1; + goto out; } printf("%13u KB", l3_cache_size); } @@ -8292,9 +8290,10 @@ static int psr_cmt_show(libxl_psr_cmt_type type, uint32_t domid) libxl_dominfo_init(&dominfo); if (libxl_domain_info(ctx, &dominfo, domid)) { fprintf(stderr, "Failed to get domain info for %d\n", domid); - return -1; + rc = -1; + goto out; } - psr_cmt_print_domain_info(&dominfo, type, nr_sockets); + psr_cmt_print_domain_info(&dominfo, type, &socketmap); libxl_dominfo_dispose(&dominfo); } else @@ -8302,13 +8301,17 @@ static int psr_cmt_show(libxl_psr_cmt_type type, uint32_t domid) libxl_dominfo *list; if (!(list = libxl_list_domain(ctx, &nr_domains))) { fprintf(stderr, "Failed to get domain info for domain list.\n"); - return -1; + rc = -1; + goto out; } for (i = 0; i < nr_domains; i++) - psr_cmt_print_domain_info(list + i, type, nr_sockets); + psr_cmt_print_domain_info(list + i, type, &socketmap); libxl_dominfo_list_free(list, nr_domains); } - return 0; + +out: + libxl_bitmap_dispose(&socketmap); + return rc; } int main_psr_cmt_attach(int argc, char **argv) -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |