Workaround cpuid issue under Valgrind

Topology uses cpuid to get CPU cache information. However when running
under Valgrind, data returned from cpuid are not from the processor we set
affinity to. Instead they are all from one specific processor. For a quick
workaround so other teams can continue their work, this patch will report
CPU cache from that specific processor and ignore others.

Change-Id: I5cfac2329dac277f3dbde1be92fa26e085465401
Signed-off-by: Amber Lin <Amber.Lin@amd.com>


[ROCm/ROCR-Runtime commit: e46743b1dd]
This commit is contained in:
Amber Lin
2017-07-19 16:04:42 -04:00
committed by Felix Kuehling
vanhempi 4a241a9d5f
commit 391d9ee403
+27 -1
Näytä tiedosto
@@ -58,6 +58,7 @@ typedef struct {
static HsaSystemProperties *_system = NULL;
static node_t *node = NULL;
static int is_valgrind;
static int processor_vendor;
/* Supported System Vendors */
@@ -407,6 +408,12 @@ static void find_cpu_cache_siblings(cpu_cacheinfo_t *cpu_ci_list)
cpu_cacheinfo_t *this_cpu, *cpu2;
uint32_t index;
/* FixMe: cpuid under Valgrind doesn't return data from the processor we set
* affinity to. We can't use that data to calculate siblings.
*/
if (is_valgrind)
return;
for (n = 0; n < cpu_ci_list->len; n++) {
this_cpu = cpu_ci_list + n;
for (index = 0; index < this_cpu->num_caches; index++) {
@@ -1036,8 +1043,10 @@ err:
/* restore affinity to original */
sched_setaffinity(0, sizeof(cpu_set_t), &orig_cpuset);
exit:
if (ret != HSAKMT_STATUS_SUCCESS)
if (ret != HSAKMT_STATUS_SUCCESS) {
pr_warn("Topology fails to create cpu cache list\n");
topology_destroy_temp_cpu_cache_list(*temp_cpu_ci_list);
}
return ret;
}
@@ -1074,6 +1083,16 @@ static HSAKMT_STATUS topology_get_cpu_cache_props(node_t *tbl,
this_cpu->num_caches - this_cpu->num_duplicated_caches;
}
/* FixMe: cpuid under Valgrind doesn't return data from the processor we set
* affinity to. All the data come from one specific processor. We'll report
* this one processor's cache and ignore others.
*/
if (is_valgrind) {
this_cpu = cpu_ci_list;
tbl->node.NumCaches = this_cpu->num_caches;
apicid_low = apicid_max = this_cpu->apicid;
}
tbl->cache = calloc(
sizeof(HsaCacheProperties) * tbl->node.NumCaches, 1);
if (!tbl->cache) {
@@ -1481,8 +1500,15 @@ HSAKMT_STATUS topology_take_snapshot(void)
void *cpu_ci_list = NULL;
HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS;
struct pci_access *pacc;
char *envvar;
topology_set_processor_vendor();
envvar = getenv("HSA_RUNNING_UNDER_VALGRIND");
if (envvar && !strcmp(envvar, "1"))
is_valgrind = 1;
else
is_valgrind = 0;
retry:
ret = topology_sysfs_get_generation(&gen_start);
if (ret != HSAKMT_STATUS_SUCCESS)