forked from xuos/xiuos
				
			Optimize session connection and buddy.
This commit is contained in:
		
							parent
							
								
									fc380de895
								
							
						
					
					
						commit
						213a92330e
					
				|  | @ -60,6 +60,7 @@ Modification: | ||||||
| #define USER_MEM_BASE       (0x00000000) | #define USER_MEM_BASE       (0x00000000) | ||||||
| #define USER_MEM_TOP        DEV_VRTMEM_BASE | #define USER_MEM_TOP        DEV_VRTMEM_BASE | ||||||
| #define USER_IPC_SPACE_BASE (0x70000000) | #define USER_IPC_SPACE_BASE (0x70000000) | ||||||
|  | #define USER_IPC_USE_ALLOCATOR_WATERMARK    (0x70010000) | ||||||
| #define USER_IPC_SPACE_TOP  (USER_MEM_TOP - USER_STACK_SIZE) | #define USER_IPC_SPACE_TOP  (USER_MEM_TOP - USER_STACK_SIZE) | ||||||
| 
 | 
 | ||||||
| /* Deivce memory layout */ | /* Deivce memory layout */ | ||||||
|  |  | ||||||
|  | @ -53,13 +53,14 @@ Modification: | ||||||
| #define NUM_TOPLEVEL_PDE    NUM_LEVEL3_PDE | #define NUM_TOPLEVEL_PDE    NUM_LEVEL3_PDE | ||||||
| 
 | 
 | ||||||
| #define PAGE_SIZE           LEVEL4_PTE_SIZE | #define PAGE_SIZE           LEVEL4_PTE_SIZE | ||||||
| #define MAX_NR_FREE_PAGES   ((PHY_MEM_STOP - PHY_MEM_BASE) >> LEVEL4_PTE_SHIFT) | #define MAX_NR_FREE_PAGES   ((PHY_USER_FREEMEM_BASE - PHY_MEM_BASE) >> LEVEL4_PTE_SHIFT) | ||||||
| 
 | 
 | ||||||
| /* User memory layout */ | /* User memory layout */ | ||||||
| #define USER_STACK_SIZE     PAGE_SIZE | #define USER_STACK_SIZE     PAGE_SIZE | ||||||
| #define USER_MEM_BASE       (0x00000000) | #define USER_MEM_BASE       (0x00000000) | ||||||
| #define USER_MEM_TOP        DEV_VRTMEM_BASE | #define USER_MEM_TOP        DEV_VRTMEM_BASE | ||||||
| #define USER_IPC_SPACE_BASE (0x70000000) | #define USER_IPC_SPACE_BASE (0x70000000) | ||||||
|  | #define USER_IPC_USE_ALLOCATOR_WATERMARK    (0x70010000) | ||||||
| #define USER_IPC_SPACE_TOP  (USER_MEM_TOP - USER_STACK_SIZE) | #define USER_IPC_SPACE_TOP  (USER_MEM_TOP - USER_STACK_SIZE) | ||||||
| 
 | 
 | ||||||
| /* Deivce memory layout */ | /* Deivce memory layout */ | ||||||
|  |  | ||||||
|  | @ -68,7 +68,6 @@ struct KFreeList { | ||||||
|     struct double_list_node list_head; |     struct double_list_node list_head; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define MAX_NR_PAGES MAX_NR_FREE_PAGES |  | ||||||
| struct KBuddy { | struct KBuddy { | ||||||
|     uint32_t n_pages; |     uint32_t n_pages; | ||||||
|     uint32_t use_lock; |     uint32_t use_lock; | ||||||
|  | @ -77,7 +76,7 @@ struct KBuddy { | ||||||
|     struct KPage* first_page; |     struct KPage* first_page; | ||||||
|     uint32_t mem_start; |     uint32_t mem_start; | ||||||
|     uint32_t mem_end; |     uint32_t mem_end; | ||||||
|     struct KPage pages[MAX_NR_PAGES]; |     struct KPage* pages; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*********************************************
 | /*********************************************
 | ||||||
|  | @ -89,6 +88,7 @@ struct KBuddy { | ||||||
|  * @param mem_end  free memory region end |  * @param mem_end  free memory region end | ||||||
|  * @return void |  * @return void | ||||||
|  */ |  */ | ||||||
|  | bool KBuddyInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end); | ||||||
| void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end); | void KBuddySysInit(struct KBuddy* pbuddy, uint32_t mem_start, uint32_t mem_end); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -105,6 +105,8 @@ char* KBuddyAlloc(struct KBuddy* pbuddy, uint32_t size); | ||||||
|  */ |  */ | ||||||
| bool KBuddyFree(struct KBuddy* pbuddy, char* vaddr); | bool KBuddyFree(struct KBuddy* pbuddy, char* vaddr); | ||||||
| 
 | 
 | ||||||
|  | void KBuddyDestory(struct KBuddy* pbuddy); | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Print current free pages for debug. |  * Print current free pages for debug. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ Modification: | ||||||
| 
 | 
 | ||||||
| #include "core.h" | #include "core.h" | ||||||
| 
 | 
 | ||||||
|  | #include "buddy.h" | ||||||
| #include "list.h" | #include "list.h" | ||||||
| #include "object_allocator.h" | #include "object_allocator.h" | ||||||
| #include "pagetable.h" | #include "pagetable.h" | ||||||
|  | @ -80,6 +81,7 @@ struct TaskMicroDescriptor { | ||||||
|     /* task communication resources */ |     /* task communication resources */ | ||||||
|     struct double_list_node cli_sess_listhead; |     struct double_list_node cli_sess_listhead; | ||||||
|     struct double_list_node svr_sess_listhead; |     struct double_list_node svr_sess_listhead; | ||||||
|  |     struct KBuddy* massive_ipc_allocator; | ||||||
|     struct TraceTag server_identifier; |     struct TraceTag server_identifier; | ||||||
| 
 | 
 | ||||||
|     /* task schedule attributes */ |     /* task schedule attributes */ | ||||||
|  | @ -98,6 +100,7 @@ struct SchedulerRightGroup { | ||||||
| struct XiziTaskManager { | struct XiziTaskManager { | ||||||
|     struct double_list_node task_list_head[TASK_MAX_PRIORITY]; /* list of task control blocks that are allocated */ |     struct double_list_node task_list_head[TASK_MAX_PRIORITY]; /* list of task control blocks that are allocated */ | ||||||
|     struct slab_allocator task_allocator; |     struct slab_allocator task_allocator; | ||||||
|  |     struct slab_allocator task_buddy_allocator; | ||||||
|     uint32_t next_pid; |     uint32_t next_pid; | ||||||
| 
 | 
 | ||||||
|     /* init task manager */ |     /* init task manager */ | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ Modification: | ||||||
| *************************************************/ | *************************************************/ | ||||||
| 
 | 
 | ||||||
| #include "buddy.h" | #include "buddy.h" | ||||||
|  | #include "kalloc.h" | ||||||
| #include "log.h" | #include "log.h" | ||||||
| 
 | 
 | ||||||
| static void _buddy_split_page(struct KPage* page, uint32_t low_order, uint32_t high_order, struct KFreeList* list) | 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; |     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; |     uint32_t i = 0; | ||||||
|     struct KPage* page = NULL; |     struct KPage* page = NULL; | ||||||
|     struct KFreeList* free_list = 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); |         doubleListNodeInit(&page->node); | ||||||
|         KBuddyPagesFree(pbuddy, page); |         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) | char* KBuddyAlloc(struct KBuddy* pbuddy, uint32_t size) | ||||||
|  | @ -211,6 +229,13 @@ bool KBuddyFree(struct KBuddy* pbuddy, char* vaddr) | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void KBuddyDestory(struct KBuddy* pbuddy) | ||||||
|  | { | ||||||
|  |     if (pbuddy->pages) { | ||||||
|  |         kfree((void*)pbuddy->pages); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void KFreePagesInfo(struct KBuddy* pbuddy) | void KFreePagesInfo(struct KBuddy* pbuddy) | ||||||
| { | { | ||||||
|     DEBUG("Buddy structure:"); |     DEBUG("Buddy structure:"); | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ bool module_phymem_init() | ||||||
|     uint32_t user_freemem_start = PHY_USER_FREEMEM_BASE; |     uint32_t user_freemem_start = PHY_USER_FREEMEM_BASE; | ||||||
|     uint32_t user_freemem_end = PHY_MEM_STOP; |     uint32_t user_freemem_end = PHY_MEM_STOP; | ||||||
|     KBuddySysInit(&kern_virtmem_buddy, kern_freemem_start, kern_freemem_end); |     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"); |     LOG_PRINTF("Free memory organized done.\n"); | ||||||
|     return true; |     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); |     struct MmuCommonDone* p_mmu_driver = AchieveResource(&right_group.mmu_driver_tag); | ||||||
| 
 | 
 | ||||||
|     // map double vaddr page to support uniform ring buffer r/w
 |     // map double vaddr page to support uniform ring buffer r/w
 | ||||||
|     uintptr_t vaddr = alloc_share_page_addr(task, nr_pages * 2); |     uintptr_t vaddr = (uintptr_t)NULL; | ||||||
|     if (UNLIKELY(vaddr == 0)) { |     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; |         return (uintptr_t)NULL; | ||||||
|     } |     } | ||||||
|     if (!xizi_pager.map_pages(task->pgdir.pd_addr, vaddr, paddr, nr_pages * PAGE_SIZE, false)) { |     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); | ||||||
|     xizi_pager.unmap_pages(task->pgdir.pd_addr, task_vaddr + (nr_pages * PAGE_SIZE), 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) { |     if (task == cur_cpu()->task) { | ||||||
|         p_mmu_driver->TlbFlush(task_vaddr, 2 * nr_pages * PAGE_SIZE); |         p_mmu_driver->TlbFlush(task_vaddr, 2 * nr_pages * PAGE_SIZE); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -49,6 +49,7 @@ static void _task_manager_init() | ||||||
|     } |     } | ||||||
|     // init task (slab) allocator
 |     // init task (slab) allocator
 | ||||||
|     slab_init(&xizi_task_manager.task_allocator, sizeof(struct TaskMicroDescriptor)); |     slab_init(&xizi_task_manager.task_allocator, sizeof(struct TaskMicroDescriptor)); | ||||||
|  |     slab_init(&xizi_task_manager.task_buddy_allocator, sizeof(struct KBuddy)); | ||||||
| 
 | 
 | ||||||
|     // pid pool
 |     // pid pool
 | ||||||
|     xizi_task_manager.next_pid = 0; |     xizi_task_manager.next_pid = 0; | ||||||
|  | @ -95,6 +96,10 @@ static void _dealloc_task_cb(struct TaskMicroDescriptor* task) | ||||||
|     doubleListDel(cur_node); |     doubleListDel(cur_node); | ||||||
| 
 | 
 | ||||||
|     // free task back to allocator
 |     // free task back to allocator
 | ||||||
|  |     if (task->massive_ipc_allocator != NULL) { | ||||||
|  |         KBuddyDestory(task->massive_ipc_allocator); | ||||||
|  |         slab_free(&xizi_task_manager.task_buddy_allocator, (void*)task->massive_ipc_allocator); | ||||||
|  |     } | ||||||
|     slab_free(&xizi_task_manager.task_allocator, (void*)task); |     slab_free(&xizi_task_manager.task_allocator, (void*)task); | ||||||
| 
 | 
 | ||||||
|     // remove priority
 |     // remove priority
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue