/* This enables us to keep track of the memory removed from each node. */ struct memtrace_entry { void *mem;
u64 start;
u64 size;
u32 nid; struct dentry *dir; char name[16];
};
staticint memtrace_init_debugfs(void)
{ int ret = 0; int i;
for (i = 0; i < memtrace_array_nr; i++) { struct dentry *dir; struct memtrace_entry *ent = &memtrace_array[i];
ent->mem = ioremap(ent->start, ent->size); /* Warn but continue on */ if (!ent->mem) {
pr_err("Failed to map trace memory at 0x%llx\n",
ent->start);
ret = -1; continue;
}
snprintf(ent->name, 16, "%08x", ent->nid);
dir = debugfs_create_dir(ent->name, memtrace_debugfs_dir);
/* *Iteratethroughthechunksofmemoryweallocatedandattempttoexpose *thembacktothekernel.
*/ staticint memtrace_free_regions(void)
{ int i, ret = 0; struct memtrace_entry *ent;
for (i = memtrace_array_nr - 1; i >= 0; i--) {
ent = &memtrace_array[i];
/* We have freed this chunk previously */ if (ent->nid == NUMA_NO_NODE) continue;
/* Remove from io mappings */ if (ent->mem) {
iounmap(ent->mem);
ent->mem = 0;
}
if (memtrace_free(ent->nid, ent->start, ent->size)) {
pr_err("Failed to free trace memory on node %d\n",
ent->nid);
ret += 1; continue;
}
/* *Memorywasfreedsuccessfullysocleanupreferencestoit *soonreentrywecantellthatthischunkwasfreed.
*/
debugfs_remove_recursive(ent->dir);
pr_info("Freed trace memory back on node %d\n", ent->nid);
ent->size = ent->start = ent->nid = NUMA_NO_NODE;
} if (ret) return ret;
/* If all chunks of memory were freed successfully, reset globals */
kfree(memtrace_array);
memtrace_array = NULL;
memtrace_size = 0;
memtrace_array_nr = 0; return0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.