lscpu: read Sparc caches files

Fixes: https://github.com/karelzak/util-linux/issues/1296
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2021-05-03 16:27:35 +02:00
parent fcbcb0cdaa
commit 57fee04c14
1 changed files with 73 additions and 1 deletions

View File

@ -292,7 +292,8 @@ static int mk_cache_id(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu, char *type,
if (ca->level != level || strcmp(ca->type, type) != 0)
continue;
if (CPU_ISSET_S(cpu->logical_id, cxt->setsize, ca->sharedmap))
if (ca->sharedmap &&
CPU_ISSET_S(cpu->logical_id, cxt->setsize, ca->sharedmap))
return idx;
idx++;
}
@ -300,6 +301,73 @@ static int mk_cache_id(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu, char *type,
return idx;
}
static int read_sparc_onecache(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu,
int level, char *typestr, int type)
{
struct lscpu_cache *ca;
struct path_cxt *sys = cxt->syscpu;
int num = cpu->logical_id;
uint32_t size;
int rc, id;
char buf[32];
if (type)
snprintf(buf, sizeof(buf), "l%d_%c", level, type);
else
snprintf(buf, sizeof(buf), "l%d_", level);
rc = ul_path_readf_u32(sys, &size,
"cpu%d/%scache_size", num, buf);
if (rc != 0)
return rc;
DBG(CPU, ul_debugobj(cpu, "#%d reading sparc %s cache", num, buf));
id = mk_cache_id(cxt, cpu, typestr, level);
ca = get_cache(cxt, typestr, level, id);
if (!ca)
ca = add_cache(cxt, typestr, level, id);
if (!ca->name) {
ul_path_readf_u32(sys, &ca->coherency_line_size,
"cpu%d/%scache_line_size", num, buf);
assert(ca->type);
if (type)
snprintf(buf, sizeof(buf), "L%d%c", ca->level, type);
else
snprintf(buf, sizeof(buf), "L%d", ca->level);
ca->name = xstrdup(buf);
ca->size = size;
}
/* There is no sharedmap of the cache in /sys, we assume that caches are
* not shared. Send a patch if your /sys provides another information.
*/
if (!ca->sharedmap) {
size_t setsize = 0;
ca->sharedmap = cpuset_alloc(cxt->maxcpus, &setsize, NULL);
CPU_ZERO_S(setsize, ca->sharedmap);
CPU_SET_S(num, setsize, ca->sharedmap);
}
return 0;
}
static int read_sparc_caches(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu)
{
int i;
for (i = 1; i <= 3; i++) {
read_sparc_onecache(cxt, cpu, i, "Instruction", 'i');
read_sparc_onecache(cxt, cpu, i, "Data", 'd');
read_sparc_onecache(cxt, cpu, i, "Unified", 0);
}
return 0;
}
static int read_caches(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu)
{
char buf[256];
@ -312,6 +380,10 @@ static int read_caches(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu)
num, ncaches) == 0)
ncaches++;
if (ncaches == 0 && ul_path_accessf(sys, F_OK,
"cpu%d/l1_icache_size", num) == 0)
return read_sparc_caches(cxt, cpu);
DBG(CPU, ul_debugobj(cpu, "#%d reading %zd caches", num, ncaches));
for (i = 0; i < ncaches; i++) {