Add free_nodes() helper function

Change-Id: I18ae0ac91b05275d7ad9d93175bae06870080844


[ROCm/ROCR-Runtime commit: a80d2f2303]
This commit is contained in:
Harish Kasiviswanathan
2016-02-29 15:59:28 -05:00
parent 682178796f
commit 5fc05ab059
+24 -48
View File
@@ -128,6 +128,16 @@ free_node(node_t *n)
free((n)->link); free((n)->link);
} }
static void free_nodes(node_t *temp_nodes, int size)
{
int i;
if (temp_nodes) {
for (i = 0; i < size; i++)
free_node(&temp_nodes[i]);
free(temp_nodes);
}
}
/* num_subdirs - find the number of sub-directories in the specified path /* num_subdirs - find the number of sub-directories in the specified path
* @dirpath - directory path to find sub-directories underneath * @dirpath - directory path to find sub-directories underneath
* @prefix - only count sub-directory names starting with prefix. * @prefix - only count sub-directory names starting with prefix.
@@ -838,7 +848,7 @@ err1:
HSAKMT_STATUS HSAKMT_STATUS
topology_take_snapshot(void) topology_take_snapshot(void)
{ {
uint32_t gen_start, gen_end, i, j, mem_id, cache_id, link_id; uint32_t gen_start, gen_end, i, mem_id, cache_id, link_id;
HsaSystemProperties sys_props; HsaSystemProperties sys_props;
node_t *temp_nodes = 0; node_t *temp_nodes = 0;
HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS; HSAKMT_STATUS ret = HSAKMT_STATUS_SUCCESS;
@@ -859,26 +869,20 @@ retry:
&temp_nodes[i].node, &temp_nodes[i].node,
&temp_nodes[i].gpu_id); &temp_nodes[i].gpu_id);
if (ret != HSAKMT_STATUS_SUCCESS) { if (ret != HSAKMT_STATUS_SUCCESS) {
for (j=0; j < i; j++) free_nodes(temp_nodes, i);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
if (temp_nodes[i].node.NumMemoryBanks) { if (temp_nodes[i].node.NumMemoryBanks) {
temp_nodes[i].mem = calloc(temp_nodes[i].node.NumMemoryBanks * sizeof(HsaMemoryProperties), 1); temp_nodes[i].mem = calloc(temp_nodes[i].node.NumMemoryBanks * sizeof(HsaMemoryProperties), 1);
if (!temp_nodes[i].mem) { if (!temp_nodes[i].mem) {
ret = HSAKMT_STATUS_NO_MEMORY; ret = HSAKMT_STATUS_NO_MEMORY;
for (j=0; j <= i; j++) free_nodes(temp_nodes, i + 1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
for (mem_id = 0; mem_id < temp_nodes[i].node.NumMemoryBanks; mem_id++) { for (mem_id = 0; mem_id < temp_nodes[i].node.NumMemoryBanks; mem_id++) {
ret = topology_sysfs_get_mem_props(i, mem_id, &temp_nodes[i].mem[mem_id]); ret = topology_sysfs_get_mem_props(i, mem_id, &temp_nodes[i].mem[mem_id]);
if (ret != HSAKMT_STATUS_SUCCESS) { if (ret != HSAKMT_STATUS_SUCCESS) {
for (j=0; j <= i; j++) free_nodes(temp_nodes, i + 1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
} }
@@ -888,17 +892,13 @@ retry:
temp_nodes[i].cache = calloc(temp_nodes[i].node.NumCaches * sizeof(HsaCacheProperties), 1); temp_nodes[i].cache = calloc(temp_nodes[i].node.NumCaches * sizeof(HsaCacheProperties), 1);
if (!temp_nodes[i].cache) { if (!temp_nodes[i].cache) {
ret = HSAKMT_STATUS_NO_MEMORY; ret = HSAKMT_STATUS_NO_MEMORY;
for (j=0; j <= i; j++) free_nodes(temp_nodes, i + 1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
for (cache_id = 0; cache_id < temp_nodes[i].node.NumCaches; cache_id++) { for (cache_id = 0; cache_id < temp_nodes[i].node.NumCaches; cache_id++) {
ret = topology_sysfs_get_cache_props(i, cache_id, &temp_nodes[i].cache[cache_id]); ret = topology_sysfs_get_cache_props(i, cache_id, &temp_nodes[i].cache[cache_id]);
if (ret != HSAKMT_STATUS_SUCCESS) { if (ret != HSAKMT_STATUS_SUCCESS) {
for (j=0; j <= i; j++) free_nodes(temp_nodes, i + 1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
} }
@@ -907,9 +907,7 @@ retry:
/* Get info from /proc/cpuinfo and /sys/devices/system */ /* Get info from /proc/cpuinfo and /sys/devices/system */
ret = topology_get_cpu_cache_props(&temp_nodes[i]); ret = topology_get_cpu_cache_props(&temp_nodes[i]);
if (ret != HSAKMT_STATUS_SUCCESS) { if (ret != HSAKMT_STATUS_SUCCESS) {
for (j=0; j <= i; j++) free_nodes(temp_nodes, i + 1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
} }
@@ -918,17 +916,13 @@ retry:
temp_nodes[i].link = calloc(temp_nodes[i].node.NumIOLinks * sizeof(HsaIoLinkProperties), 1); temp_nodes[i].link = calloc(temp_nodes[i].node.NumIOLinks * sizeof(HsaIoLinkProperties), 1);
if (!temp_nodes[i].link) { if (!temp_nodes[i].link) {
ret = HSAKMT_STATUS_NO_MEMORY; ret = HSAKMT_STATUS_NO_MEMORY;
for (j=0; j <= i; j++) free_nodes(temp_nodes, i + 1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
for (link_id = 0; link_id < temp_nodes[i].node.NumIOLinks; link_id++) { for (link_id = 0; link_id < temp_nodes[i].node.NumIOLinks; link_id++) {
ret = topology_sysfs_get_iolink_props(i, link_id, &temp_nodes[i].link[link_id]); ret = topology_sysfs_get_iolink_props(i, link_id, &temp_nodes[i].link[link_id]);
if (ret != HSAKMT_STATUS_SUCCESS) { if (ret != HSAKMT_STATUS_SUCCESS) {
for (j=0; j <= i; j++) free_nodes(temp_nodes, i+1);
free_node(&temp_nodes[j]);
free(temp_nodes);
goto err; goto err;
} }
} }
@@ -939,32 +933,20 @@ retry:
ret = topology_sysfs_get_generation(&gen_end); ret = topology_sysfs_get_generation(&gen_end);
if (ret != HSAKMT_STATUS_SUCCESS) { if (ret != HSAKMT_STATUS_SUCCESS) {
if (temp_nodes) { free_nodes(temp_nodes, sys_props.NumNodes);
for (j=0; j < sys_props.NumNodes; j++)
free_node(&temp_nodes[j]);
free(temp_nodes);
}
goto err; goto err;
} }
if (gen_start != gen_end) { if (gen_start != gen_end) {
if (temp_nodes) { free_nodes(temp_nodes, sys_props.NumNodes);
for (j=0; j < sys_props.NumNodes; j++) temp_nodes = 0;
free_node(&temp_nodes[j]);
free(temp_nodes);
temp_nodes = 0;
}
goto retry; goto retry;
} }
if (!_system) { if (!_system) {
_system = malloc(sizeof(HsaSystemProperties)); _system = malloc(sizeof(HsaSystemProperties));
if (!_system) { if (!_system) {
if (temp_nodes) { free_nodes(temp_nodes, sys_props.NumNodes);
for (j=0; j < sys_props.NumNodes; j++)
free_node(&temp_nodes[j]);
free(temp_nodes);
}
return HSAKMT_STATUS_NO_MEMORY; return HSAKMT_STATUS_NO_MEMORY;
} }
} }
@@ -994,14 +976,8 @@ topology_drop_snapshot(void)
} }
if (node) { if (node) {
uint64_t nodeid;
/* Remove state */ /* Remove state */
for (nodeid = 0; nodeid < _system->NumNodes; nodeid++) { free_nodes(node, _system->NumNodes);
free_node(&node[nodeid]);
}
free(node);
node = NULL; node = NULL;
} }