forked from xuos/xiuos
add memory usage
This commit is contained in:
@@ -31,6 +31,7 @@ Modification:
|
||||
#include "buddy.h"
|
||||
#include "kalloc.h"
|
||||
#include "log.h"
|
||||
#include "pagetable.h"
|
||||
|
||||
static void _buddy_split_page(struct KPage* page, uintptr_t low_order, uintptr_t high_order, struct KFreeList* list)
|
||||
{
|
||||
@@ -161,7 +162,8 @@ bool KBuddyInit(struct KBuddy* pbuddy, uintptr_t mem_start, uintptr_t mem_end)
|
||||
// total number of free pages
|
||||
pbuddy->n_pages = (pbuddy->mem_end - (uintptr_t)pbuddy->mem_start) >> LEVEL4_PTE_SHIFT;
|
||||
|
||||
memset(pbuddy->pages, 0, pbuddy->n_pages);
|
||||
memset(pbuddy->pages, 0, pbuddy->n_pages * sizeof(struct KPage));
|
||||
// memset(pbuddy->pages, 0, pbuddy->n_pages);
|
||||
|
||||
// init each free page list from 2^0 to 2^8
|
||||
for (; i < MAX_BUDDY_ORDER; i++) {
|
||||
|
||||
@@ -30,6 +30,9 @@ Modification:
|
||||
#include "kalloc.h"
|
||||
#include "assert.h"
|
||||
|
||||
#include "memlayout.h"
|
||||
#include "pagetable.h"
|
||||
|
||||
#include "actracer.h"
|
||||
#include "buddy.h"
|
||||
|
||||
@@ -64,11 +67,35 @@ char* kalloc(uintptr_t size)
|
||||
return mem_alloc;
|
||||
}
|
||||
|
||||
void* kalloc_by_ownership(TraceTag owner, uintptr_t size)
|
||||
{
|
||||
void* new_mem = kalloc(size);
|
||||
if (!new_mem) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
|
||||
usage->mem_block_root = rbt_insert(usage->mem_block_root, (uintptr_t)new_mem, NULL);
|
||||
// DEBUG("%p %p %p %p\n", usage, usage->mem_block_root, usage->tag, new_mem);
|
||||
return new_mem;
|
||||
}
|
||||
|
||||
bool kfree(char* vaddr)
|
||||
{
|
||||
return KBuddyFree(&kern_virtmem_buddy, V2P_WO(vaddr));
|
||||
}
|
||||
|
||||
bool kfree_by_ownership(TraceTag owner, void* vaddr)
|
||||
{
|
||||
struct MemUsage* usage = GetSysObject(struct MemUsage, &owner);
|
||||
// DEBUG("%p %p %p %p\n", usage, usage->mem_block_root, usage->tag, vaddr);
|
||||
RbtNode* node = rbt_search(usage->mem_block_root, (uintptr_t)vaddr);
|
||||
assert(NULL != node);
|
||||
usage->mem_block_root = rbt_delete(usage->mem_block_root, node);
|
||||
|
||||
return kfree(vaddr);
|
||||
}
|
||||
|
||||
bool raw_kfree(char* paddr)
|
||||
{
|
||||
return KBuddyFree(&kern_virtmem_buddy, paddr);
|
||||
|
||||
@@ -32,6 +32,7 @@ Modification:
|
||||
#include "assert.h"
|
||||
#include "kalloc.h"
|
||||
#include "object_allocator.h"
|
||||
#include "pagetable.h"
|
||||
|
||||
#define BITMAP_BITS_EMPTY_FULL ((uint64_t)0)
|
||||
#define BITMAP_FIRST_BIT ((uint64_t)1)
|
||||
|
||||
@@ -160,7 +160,8 @@ static uintptr_t _resize_user_pgdir(struct MemSpace* pmemspace, uintptr_t old_si
|
||||
uintptr_t cur_size = ALIGNUP(old_size, PAGE_SIZE);
|
||||
uintptr_t size_needed = ALIGNUP(new_size, PAGE_SIZE) - cur_size;
|
||||
|
||||
char* new_page = kalloc(size_needed);
|
||||
// char* new_page = kalloc(size_needed);
|
||||
char* new_page = kalloc_by_ownership(pmemspace->mem_usage.tag, size_needed);
|
||||
if (new_page == NULL) {
|
||||
ERROR("No memory\n");
|
||||
return cur_size;
|
||||
@@ -169,7 +170,6 @@ static uintptr_t _resize_user_pgdir(struct MemSpace* pmemspace, uintptr_t old_si
|
||||
if (!xizi_pager.map_pages(pmemspace, cur_size, V2P(new_page), size_needed, false)) {
|
||||
return cur_size;
|
||||
}
|
||||
CreateResourceTag(NULL, &pmemspace->tag, NULL, TRACER_MEM_FROM_BUDDY_AC_RESOURCE, V2P_WO(new_page));
|
||||
|
||||
return new_size;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user