lscpu: report also number of cache instances

Caches (sum of all):
  L1d:                   128 KiB (4 instances)
  L1i:                   128 KiB (4 instances)
  L2:                    1 MiB (4 instances)
  L3:                    8 MiB (1 instance)

Suggested-by: John Henning <john.henning@oracle.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2021-04-01 12:27:05 +02:00
parent 8bb50864c1
commit 9dadd3e60c
3 changed files with 24 additions and 11 deletions

View File

@ -209,13 +209,19 @@ static int cputype_read_topology(struct lscpu_cxt *cxt, struct lscpu_cputype *ct
}
/* count size of all instancess of the "name" */
size_t lscpu_get_cache_full_size(struct lscpu_cxt *cxt, const char *name)
size_t lscpu_get_cache_full_size(struct lscpu_cxt *cxt, const char *name, int *instances)
{
size_t i, sz = 0;
if (instances)
*instances = 0;
for (i = 0; i < cxt->ncaches; i++) {
if (strcmp(cxt->caches[i].name, name) == 0)
if (strcmp(cxt->caches[i].name, name) == 0) {
sz += cxt->caches[i].size;
if (instances)
(*instances)++;
}
}
return sz;
@ -539,10 +545,10 @@ int lscpu_read_topology(struct lscpu_cxt *cxt)
}
lscpu_sort_caches(cxt->caches, cxt->ncaches);
DBG(GATHER, ul_debugobj(cxt, " L1d: %zu", lscpu_get_cache_full_size(cxt, "L1d")));
DBG(GATHER, ul_debugobj(cxt, " L1i: %zu", lscpu_get_cache_full_size(cxt, "L1i")));
DBG(GATHER, ul_debugobj(cxt, " L2: %zu", lscpu_get_cache_full_size(cxt, "L2")));
DBG(GATHER, ul_debugobj(cxt, " L3: %zu", lscpu_get_cache_full_size(cxt, "L3")));
DBG(GATHER, ul_debugobj(cxt, " L1d: %zu", lscpu_get_cache_full_size(cxt, "L1d", NULL)));
DBG(GATHER, ul_debugobj(cxt, " L1i: %zu", lscpu_get_cache_full_size(cxt, "L1i", NULL)));
DBG(GATHER, ul_debugobj(cxt, " L2: %zu", lscpu_get_cache_full_size(cxt, "L2", NULL)));
DBG(GATHER, ul_debugobj(cxt, " L3: %zu", lscpu_get_cache_full_size(cxt, "L3", NULL)));
return rc;
}

View File

@ -511,7 +511,7 @@ static void caches_add_line(struct lscpu_cxt *cxt,
{
uint64_t sz = 0;
if (ca->name)
sz = lscpu_get_cache_full_size(cxt, ca->name);
sz = lscpu_get_cache_full_size(cxt, ca->name, NULL);
if (!sz)
break;
if (cxt->bytes)
@ -1045,21 +1045,28 @@ static void print_summary(struct lscpu_cxt *cxt)
for (i = 0; i < cxt->ncaches; i++) {
const char *name = cxt->caches[i].name;
uint64_t sz;
int n = 0;
if (last && strcmp(last, name) == 0)
continue;
sz = lscpu_get_cache_full_size(cxt, name);
sz = lscpu_get_cache_full_size(cxt, name, &n);
if (!sz)
continue;
snprintf(field, sizeof(field), is_term ? _("%s:") : _("%s cache:"), name);
if (cxt->bytes)
add_summary_x(tb, sec, field, "%" PRIu64, sz);
add_summary_sprint(tb, sec, field,
P_("%" PRIu64 " (%d instance)",
"%" PRIu64 " (%d instances)", n),
sz, n);
else {
char *tmp = size_to_human_string(
SIZE_SUFFIX_3LETTER |
SIZE_SUFFIX_SPACE,
sz);
add_summary_s(tb, sec, field, tmp);
add_summary_sprint(tb, sec, field,
P_("%s (%d instance)",
"%s (%d instances)", n),
tmp, n);
free(tmp);
}
last = name;

View File

@ -271,7 +271,7 @@ int lscpu_read_numas(struct lscpu_cxt *cxt);
void lscpu_free_caches(struct lscpu_cache *caches, size_t n);
void lscpu_sort_caches(struct lscpu_cache *caches, size_t n);
size_t lscpu_get_cache_full_size(struct lscpu_cxt *cxt, const char *name);
size_t lscpu_get_cache_full_size(struct lscpu_cxt *cxt, const char *name, int *instances);
struct lscpu_cache *lscpu_cpu_get_cache(struct lscpu_cxt *cxt,
struct lscpu_cpu *cpu, const char *name);