Skip to content

Commit

Permalink
lstopo/memattrs: abstract-out a function to display a single memattr
Browse files Browse the repository at this point in the history
Signed-off-by: Brice Goglin <Brice.Goglin@inria.fr>
  • Loading branch information
bgoglin committed Feb 16, 2022
1 parent 8677613 commit 3817675
Showing 1 changed file with 67 additions and 61 deletions.
128 changes: 67 additions & 61 deletions utils/lstopo/lstopo-text.c
@@ -1,6 +1,6 @@
/*
* Copyright © 2009 CNRS
* Copyright © 2009-2021 Inria. All rights reserved.
* Copyright © 2009-2022 Inria. All rights reserved.
* Copyright © 2009-2012 Université Bordeaux
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
Expand Down Expand Up @@ -310,85 +310,91 @@ static void output_memattr_initiator(struct lstopo_output *loutput,

}

static void output_memattrs(struct lstopo_output *loutput)
static int output_memattr(struct lstopo_output *loutput, unsigned id)
{
hwloc_topology_t topology = loutput->topology;
int verbose_mode = loutput->verbose_mode;
int show_all = (loutput->show_memattrs_only || (verbose_mode >= 3));
unsigned id;

for(id=0; ; id++) {
const char *name;
unsigned long flags;
unsigned nr_targets;
hwloc_obj_t *targets;
unsigned i;
int err;

if (!show_all
&& (id == HWLOC_MEMATTR_ID_CAPACITY || id == HWLOC_MEMATTR_ID_LOCALITY))
continue;
const char *name;
unsigned long flags;
unsigned nr_targets;
hwloc_obj_t *targets;
unsigned i;
int err;

if (!show_all
&& (id == HWLOC_MEMATTR_ID_CAPACITY || id == HWLOC_MEMATTR_ID_LOCALITY))
return 0;

err = hwloc_memattr_get_name(topology, id, &name);
if (err < 0)
break;
err = hwloc_memattr_get_flags(topology, id, &flags);
assert(!err);
err = hwloc_memattr_get_name(topology, id, &name);
if (err < 0)
return -1;
err = hwloc_memattr_get_flags(topology, id, &flags);
assert(!err);

nr_targets = 0;
err = hwloc_memattr_get_targets(topology, id, NULL, 0, &nr_targets, NULL, NULL);
assert(!err);
nr_targets = 0;
err = hwloc_memattr_get_targets(topology, id, NULL, 0, &nr_targets, NULL, NULL);
assert(!err);

if (!show_all && !nr_targets)
continue;
if (!show_all && !nr_targets)
return 0;

printf("Memory attribute #%u name `%s' flags %lu\n", id, name, flags);
printf("Memory attribute #%u name `%s' flags %lu\n", id, name, flags);

targets = malloc(nr_targets * sizeof(*targets));
if (!targets)
continue;
targets = malloc(nr_targets * sizeof(*targets));
if (!targets)
return 0;

err = hwloc_memattr_get_targets(topology, id, NULL, 0, &nr_targets, targets, NULL);
assert(!err);
err = hwloc_memattr_get_targets(topology, id, NULL, 0, &nr_targets, targets, NULL);
assert(!err);

for(i=0; i<nr_targets; i++) {
for(i=0; i<nr_targets; i++) {

if (!(flags & HWLOC_MEMATTR_FLAG_NEED_INITIATOR)) {
hwloc_uint64_t value;
err = hwloc_memattr_get_value(topology, id, targets[i], NULL, 0, &value);
if (!err) {
printf(" ");
output_memattr_obj(loutput, targets[i]);
printf(" = %llu\n", (unsigned long long) value);
}
if (!(flags & HWLOC_MEMATTR_FLAG_NEED_INITIATOR)) {
hwloc_uint64_t value;
err = hwloc_memattr_get_value(topology, id, targets[i], NULL, 0, &value);
if (!err) {
printf(" ");
output_memattr_obj(loutput, targets[i]);
printf(" = %llu\n", (unsigned long long) value);
}

} else {
unsigned nr_initiators = 0;
err = hwloc_memattr_get_initiators(topology, id, targets[i], 0, &nr_initiators, NULL, NULL);
if (!err) {
struct hwloc_location *initiators = malloc(nr_initiators * sizeof(*initiators));
hwloc_uint64_t *values = malloc(nr_initiators * sizeof(*values));
if (initiators && values) {
err = hwloc_memattr_get_initiators(topology, id, targets[i], 0, &nr_initiators, initiators, values);
if (!err) {
unsigned j;
for(j=0; j<nr_initiators; j++) {
printf(" ");
output_memattr_obj(loutput, targets[i]);
printf(" = %llu",
(unsigned long long) values[j]);
output_memattr_initiator(loutput, &initiators[j]);
printf("\n");
}
} else {
unsigned nr_initiators = 0;
err = hwloc_memattr_get_initiators(topology, id, targets[i], 0, &nr_initiators, NULL, NULL);
if (!err) {
struct hwloc_location *initiators = malloc(nr_initiators * sizeof(*initiators));
hwloc_uint64_t *values = malloc(nr_initiators * sizeof(*values));
if (initiators && values) {
err = hwloc_memattr_get_initiators(topology, id, targets[i], 0, &nr_initiators, initiators, values);
if (!err) {
unsigned j;
for(j=0; j<nr_initiators; j++) {
printf(" ");
output_memattr_obj(loutput, targets[i]);
printf(" = %llu",
(unsigned long long) values[j]);
output_memattr_initiator(loutput, &initiators[j]);
printf("\n");
}
}
free(initiators);
free(values);
}
free(initiators);
free(values);
}
}
free(targets);
}
free(targets);

return 0;
}

static void output_memattrs(struct lstopo_output *loutput)
{
unsigned id;
for(id=0; ; id++)
if (output_memattr(loutput, id) < 0)
break;
}


Expand Down

0 comments on commit 3817675

Please sign in to comment.