add memory usage

This commit is contained in:
TXuian
2024-10-29 16:17:43 +08:00
parent 968d66e5a9
commit 7b6c93d391
37 changed files with 654 additions and 115 deletions
+30 -11
View File
@@ -41,7 +41,7 @@ Modification:
#define MAX_SUPPORT_PARAMS 32
struct MemSpace* alloc_memspace()
struct MemSpace* alloc_memspace(char* name)
{
struct MemSpace* pmemspace = slab_alloc(&xizi_task_manager.memspace_allocator);
if (pmemspace == NULL) {
@@ -56,7 +56,18 @@ struct MemSpace* alloc_memspace()
pmemspace->mem_size = 0;
pmemspace->pgdir.pd_addr = 0;
pmemspace->thread_to_notify = NULL;
CreateResourceTag(&pmemspace->tag, &xizi_task_manager.tag, NULL, TRACER_OWNER, (void*)pmemspace);
if (!CreateResourceTag(&pmemspace->tag, &xizi_task_manager.tag, name, TRACER_OWNER, (void*)pmemspace)) {
DEBUG("Register MemSpace %s failed\n", name);
slab_free(&xizi_task_manager.memspace_allocator, (void*)pmemspace);
return NULL;
}
pmemspace->mem_usage.mem_block_root = NULL;
if (!CreateResourceTag(&pmemspace->mem_usage.tag, &pmemspace->tag, "MemUsage", TRACER_SYSOBJECT, (void*)&pmemspace->mem_usage)) {
DEBUG("Register MemUsage %s failed\n", name);
slab_free(&xizi_task_manager.memspace_allocator, (void*)pmemspace);
return NULL;
}
return pmemspace;
}
@@ -69,15 +80,23 @@ void free_memspace(struct MemSpace* pmemspace)
xizi_pager.free_user_pgdir(&pmemspace->pgdir);
}
TracerNode* tmp_node = NULL;
DOUBLE_LIST_FOR_EACH_ENTRY(tmp_node, &pmemspace->tag.meta->children_guard, list_node)
{
assert((uintptr_t)tmp_node->p_resource >= PHY_MEM_BASE && (uintptr_t)tmp_node->p_resource < PHY_MEM_STOP);
if ((uintptr_t)tmp_node->p_resource < PHY_USER_FREEMEM_BASE) {
kfree(P2V(tmp_node->p_resource));
} else {
raw_free(tmp_node->p_resource);
}
// TracerNode* tmp_node = NULL;
// DOUBLE_LIST_FOR_EACH_ENTRY(tmp_node, &pmemspace->tag.meta->children_guard, list_node)
// {
// assert((uintptr_t)tmp_node->p_resource >= PHY_MEM_BASE && (uintptr_t)tmp_node->p_resource < PHY_MEM_STOP);
// if ((uintptr_t)tmp_node->p_resource < PHY_USER_FREEMEM_BASE) {
// kfree(P2V(tmp_node->p_resource));
// } else {
// raw_free(tmp_node->p_resource);
// }
// }
// delete space
RbtNode* rbt_node = pmemspace->mem_usage.mem_block_root;
while (rbt_node != NULL) {
assert((uintptr_t)V2P(rbt_node->key) >= PHY_MEM_BASE && (uintptr_t)V2P(rbt_node->key) < PHY_MEM_STOP);
kfree_by_ownership(pmemspace->mem_usage.tag, (void*)rbt_node->key);
rbt_node = pmemspace->mem_usage.mem_block_root;
}
/* free ipc virt address allocator */