Optimize session connection and buddy.
This commit is contained in:
@@ -29,6 +29,7 @@ Modification:
|
||||
*************************************************/
|
||||
|
||||
#include "buddy.h"
|
||||
#include "kalloc.h"
|
||||
#include "log.h"
|
||||
|
||||
static void _buddy_split_page(struct KPage* page, uint32_t low_order, uint32_t high_order, struct KFreeList* list)
|
||||
@@ -138,8 +139,15 @@ static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page)
|
||||
return;
|
||||
}
|
||||
|
||||
void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
|
||||
bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
|
||||
{
|
||||
if (pbuddy->pages == NULL) {
|
||||
if ((pbuddy->pages = (struct KPage*)kalloc(((mem_end - mem_start) >> LEVEL4_PTE_SHIFT) * sizeof(struct KPage))) == NULL) {
|
||||
ERROR("Not space to init a buddy object.\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t i = 0;
|
||||
struct KPage* page = NULL;
|
||||
struct KFreeList* free_list = NULL;
|
||||
@@ -173,6 +181,16 @@ void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
|
||||
doubleListNodeInit(&page->node);
|
||||
KBuddyPagesFree(pbuddy, page);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end)
|
||||
{
|
||||
#define MAX_NR_PAGES MAX_NR_FREE_PAGES
|
||||
static struct KPage kern_free_pages[MAX_NR_PAGES];
|
||||
pbuddy->pages = kern_free_pages;
|
||||
KBuddyInit(pbuddy, mem_start, mem_end);
|
||||
}
|
||||
|
||||
char* KBuddyAlloc(struct KBuddy* pbuddy, uint32_t size)
|
||||
@@ -211,6 +229,13 @@ bool KBuddyFree(struct KBuddy* pbuddy, char* vaddr)
|
||||
return true;
|
||||
}
|
||||
|
||||
void KBuddyDestory(struct KBuddy* pbuddy)
|
||||
{
|
||||
if (pbuddy->pages) {
|
||||
kfree((void*)pbuddy->pages);
|
||||
}
|
||||
}
|
||||
|
||||
void KFreePagesInfo(struct KBuddy* pbuddy)
|
||||
{
|
||||
DEBUG("Buddy structure:");
|
||||
|
||||
@@ -45,7 +45,7 @@ bool module_phymem_init()
|
||||
uint32_t user_freemem_start = PHY_USER_FREEMEM_BASE;
|
||||
uint32_t user_freemem_end = PHY_MEM_STOP;
|
||||
KBuddySysInit(&kern_virtmem_buddy, kern_freemem_start, kern_freemem_end);
|
||||
KBuddySysInit(&user_phy_freemem_buddy, user_freemem_start, user_freemem_end);
|
||||
KBuddyInit(&user_phy_freemem_buddy, user_freemem_start, user_freemem_end);
|
||||
LOG_PRINTF("Free memory organized done.\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -92,8 +92,23 @@ static uintptr_t map_task_share_page(struct TaskMicroDescriptor* task, const uin
|
||||
struct MmuCommonDone* p_mmu_driver = AchieveResource(&right_group.mmu_driver_tag);
|
||||
|
||||
// map double vaddr page to support uniform ring buffer r/w
|
||||
uintptr_t vaddr = alloc_share_page_addr(task, nr_pages * 2);
|
||||
if (UNLIKELY(vaddr == 0)) {
|
||||
uintptr_t vaddr = (uintptr_t)NULL;
|
||||
if (task->massive_ipc_allocator != NULL) {
|
||||
vaddr = (uintptr_t)KBuddyAlloc(task->massive_ipc_allocator, PAGE_SIZE * nr_pages * 2);
|
||||
} else {
|
||||
vaddr = alloc_share_page_addr(task, nr_pages * 2);
|
||||
if (vaddr >= USER_IPC_USE_ALLOCATOR_WATERMARK) {
|
||||
task->massive_ipc_allocator = (struct KBuddy*)slab_alloc(&xizi_task_manager.task_buddy_allocator);
|
||||
KBuddyInit(task->massive_ipc_allocator, USER_IPC_USE_ALLOCATOR_WATERMARK, USER_IPC_SPACE_TOP);
|
||||
if (!task->massive_ipc_allocator) {
|
||||
ERROR("Alloc task buddy failed.\n");
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
vaddr = (uintptr_t)KBuddyAlloc(task->massive_ipc_allocator, nr_pages * 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (UNLIKELY(vaddr == (uintptr_t)NULL)) {
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
if (!xizi_pager.map_pages(task->pgdir.pd_addr, vaddr, paddr, nr_pages * PAGE_SIZE, false)) {
|
||||
@@ -149,6 +164,9 @@ void unmap_task_share_pages(struct TaskMicroDescriptor* task, const uintptr_t ta
|
||||
|
||||
xizi_pager.unmap_pages(task->pgdir.pd_addr, task_vaddr, nr_pages * PAGE_SIZE);
|
||||
xizi_pager.unmap_pages(task->pgdir.pd_addr, task_vaddr + (nr_pages * PAGE_SIZE), nr_pages * PAGE_SIZE);
|
||||
if (task_vaddr >= USER_IPC_USE_ALLOCATOR_WATERMARK) {
|
||||
KBuddyFree(task->massive_ipc_allocator, (void*)task_vaddr);
|
||||
}
|
||||
if (task == cur_cpu()->task) {
|
||||
p_mmu_driver->TlbFlush(task_vaddr, 2 * nr_pages * PAGE_SIZE);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user