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:
parent
fcbcb0cdaa
commit
57fee04c14
|
@ -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)
|
if (ca->level != level || strcmp(ca->type, type) != 0)
|
||||||
continue;
|
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;
|
return idx;
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
@ -300,6 +301,73 @@ static int mk_cache_id(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu, char *type,
|
||||||
return idx;
|
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)
|
static int read_caches(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu)
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
@ -312,6 +380,10 @@ static int read_caches(struct lscpu_cxt *cxt, struct lscpu_cpu *cpu)
|
||||||
num, ncaches) == 0)
|
num, ncaches) == 0)
|
||||||
ncaches++;
|
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));
|
DBG(CPU, ul_debugobj(cpu, "#%d reading %zd caches", num, ncaches));
|
||||||
|
|
||||||
for (i = 0; i < ncaches; i++) {
|
for (i = 0; i < ncaches; i++) {
|
||||||
|
|
Loading…
Reference in New Issue