From 19ddc05e110b547c2406e58045e6fc0b8fe626c7 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 3 Nov 2020 09:46:45 +0100 Subject: [PATCH] lscpu: improve topology calculation Let's make it more robust and readable. The sysinfo file on s390 may contain zeros, so we need to check the values and fallback to data from shared maps if necessary. Signed-off-by: Karel Zak --- sys-utils/lscpu-topology.c | 23 ++++++----------------- sys-utils/lscpu.c | 9 +++++---- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/sys-utils/lscpu-topology.c b/sys-utils/lscpu-topology.c index 5d85aa5bd..2e1a3b987 100644 --- a/sys-utils/lscpu-topology.c +++ b/sys-utils/lscpu-topology.c @@ -102,7 +102,7 @@ static int cputype_read_topology(struct lscpu_cxt *cxt, struct lscpu_cputype *ct DBG(TYPE, ul_debugobj(ct, "reading %s/%s/%s topology", ct->vendor ?: "", ct->model ?: "", ct->modelname ?:"")); - for (i = 0; i < npos; i++) { + for (i = 0; i < cxt->npossibles; i++) { struct lscpu_cpu *cpu = cxt->cpus[i]; cpu_set_t *thread_siblings = NULL, *core_siblings = NULL; cpu_set_t *book_siblings = NULL, *drawer_siblings = NULL; @@ -116,8 +116,6 @@ static int cputype_read_topology(struct lscpu_cxt *cxt, struct lscpu_cputype *ct "cpu%d/topology/thread_siblings", num) != 0) continue; - /*DBG(TYPE, ul_debugobj(ct, " #%d", num));*/ - /* read topology maps */ ul_path_readf_cpuset(sys, &thread_siblings, cxt->maxcpus, "cpu%d/topology/thread_siblings", num); @@ -192,22 +190,13 @@ static int cputype_read_topology(struct lscpu_cxt *cxt, struct lscpu_cputype *ct fclose(fd); } - if (ct->mtid) - ct->nthreads_per_core = atoi(ct->mtid) + 1; - else - ct->nthreads_per_core = nthreads; + ct->nthreads_per_core = ct->mtid ? atoi(ct->mtid) + 1 : nthreads; if (!sw_topo) { - ct->ndrawers_per_system = ct->nbooks_per_drawer = - ct->nsockets_per_book = ct->ncores_per_socket = 0; - if (!ct->ncores_per_socket && ct->nsockets) - ct->ncores_per_socket = ct->ncores / ct->nsockets; - if (!ct->nsockets_per_book && ct->nbooks) - ct->nsockets_per_book = ct->nsockets / ct->nbooks; - if (!ct->nbooks_per_drawer && ct->ndrawers) - ct->nbooks_per_drawer = ct->nbooks / ct->ndrawers; - if (ct->ndrawers_per_system) - ct->ndrawers_per_system = ct->ndrawers; + ct->ncores_per_socket = ct->nsockets ? ct->ncores / ct->nsockets : 0; + ct->nsockets_per_book = ct->nbooks ? ct->nsockets / ct->nbooks : 0; + ct->nbooks_per_drawer = ct->ndrawers ? ct->nbooks / ct->ndrawers : 0; + ct->ndrawers_per_system = ct->ndrawers; } DBG(TYPE, ul_debugobj(ct, " nthreads: %zu (per core)", ct->nthreads_per_core)); diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index 50412b859..dca441df0 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -832,15 +832,16 @@ print_summary_cputype(struct lscpu_cxt *cxt, add_summary_n(tb, sec, _("Thread(s) per core:"), ct->nthreads_per_core); add_summary_n(tb, sec, _("Core(s) per socket:"), ct->ncores_per_socket); + if (ct->nbooks) { add_summary_n(tb, sec, _("Socket(s) per book:"), ct->nsockets_per_book); - if (ct->ndrawers_per_system) { + if (ct->ndrawers_per_system || ct->ndrawers) { add_summary_n(tb, sec, _("Book(s) per drawer:"), ct->nbooks_per_drawer); - add_summary_n(tb, sec, _("Drawer(s):"), ct->ndrawers_per_system); + add_summary_n(tb, sec, _("Drawer(s):"), ct->ndrawers_per_system ?: ct->ndrawers); } else - add_summary_n(tb, sec, _("Book(s):"), ct->nbooks); + add_summary_n(tb, sec, _("Book(s):"), ct->nbooks_per_drawer ?: ct->nbooks); } else - add_summary_n(tb, sec, _("Socket(s):"), ct->nsockets); + add_summary_n(tb, sec, _("Socket(s):"), ct->nsockets_per_book ?: ct->nsockets); if (ct->stepping) add_summary_s(tb, sec, _("Stepping:"), ct->stepping);