forked from xuos/xiuos
Use only whole kernel lock
This commit is contained in:
@@ -75,8 +75,6 @@ static struct KPage* KBuddyPagesAlloc(struct KBuddy* pbuddy, int nPages)
|
||||
struct KFreeList* list = NULL;
|
||||
int i = 0, order = 0;
|
||||
|
||||
spinlock_lock(&pbuddy->lock);
|
||||
|
||||
// find order
|
||||
for (order = 0; (FREE_LIST_INDEX(order)) < nPages; order++)
|
||||
;
|
||||
@@ -99,12 +97,10 @@ static struct KPage* KBuddyPagesAlloc(struct KBuddy* pbuddy, int nPages)
|
||||
// set the pages' order
|
||||
_buddy_set_pages_order(page, order);
|
||||
|
||||
spinlock_unlock(&pbuddy->lock);
|
||||
return page;
|
||||
}
|
||||
|
||||
// there is no enough free page to satisfy the nPages
|
||||
spinlock_unlock(&pbuddy->lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -116,8 +112,6 @@ static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page)
|
||||
uint32_t buddy_idx = 0, new_buddy_idx = 0;
|
||||
uint32_t page_idx = page - pbuddy->pages;
|
||||
|
||||
spinlock_lock(&pbuddy->lock);
|
||||
|
||||
for (; order < MAX_BUDDY_ORDER - 1; order++) {
|
||||
// find and delete buddy to combine
|
||||
buddy_idx = BUDDY_PAGE_INDEX(page_idx, order);
|
||||
@@ -141,7 +135,6 @@ static void KBuddyPagesFree(struct KBuddy* pbuddy, struct KPage* page)
|
||||
doubleListAddOnHead(&page->node, &pbuddy->free_list[order].list_head);
|
||||
pbuddy->free_list[order].n_free_pages++;
|
||||
|
||||
spinlock_unlock(&pbuddy->lock);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -91,23 +91,18 @@ static uintptr_t map_task_share_page(struct TaskMicroDescriptor* task, const uin
|
||||
struct DCacheDone* p_dcache_done = AchieveResource(&right_group.dcache_driver_tag);
|
||||
struct MmuCommonDone* p_mmu_driver = AchieveResource(&right_group.mmu_driver_tag);
|
||||
|
||||
spinlock_lock(&task->lock);
|
||||
// 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)) {
|
||||
spinlock_unlock(&task->lock);
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
if (!xizi_pager.map_pages(task->pgdir.pd_addr, vaddr, paddr, nr_pages * PAGE_SIZE, false)) {
|
||||
spinlock_unlock(&task->lock);
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
if (!xizi_pager.map_pages(task->pgdir.pd_addr, vaddr + (nr_pages * PAGE_SIZE), paddr, nr_pages * PAGE_SIZE, false)) {
|
||||
xizi_pager.unmap_pages(task->pgdir.pd_addr, vaddr, nr_pages * PAGE_SIZE);
|
||||
spinlock_unlock(&task->lock);
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
spinlock_unlock(&task->lock);
|
||||
if (task == cur_cpu()->task) {
|
||||
p_mmu_driver->TlbFlush(vaddr, 2 * nr_pages * PAGE_SIZE);
|
||||
/// @todo clean range rather than all
|
||||
@@ -123,14 +118,12 @@ uintptr_t task_map_pages(struct TaskMicroDescriptor* task, const uintptr_t vaddr
|
||||
struct DCacheDone* p_dcache_done = AchieveResource(&right_group.dcache_driver_tag);
|
||||
struct MmuCommonDone* p_mmu_driver = AchieveResource(&right_group.mmu_driver_tag);
|
||||
|
||||
spinlock_lock(&task->lock);
|
||||
bool ret = false;
|
||||
if (is_dev) {
|
||||
ret = xizi_pager.map_pages(task->pgdir.pd_addr, vaddr, paddr, nr_pages * PAGE_SIZE, true);
|
||||
} else {
|
||||
ret = xizi_pager.map_pages(task->pgdir.pd_addr, vaddr, paddr, nr_pages * PAGE_SIZE, false);
|
||||
}
|
||||
spinlock_unlock(&task->lock);
|
||||
if (!ret) {
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
@@ -150,10 +143,8 @@ void unmap_task_share_pages(struct TaskMicroDescriptor* task, const uintptr_t ta
|
||||
struct DCacheDone* p_dcache_done = AchieveResource(&right_group.dcache_driver_tag);
|
||||
struct MmuCommonDone* p_mmu_driver = AchieveResource(&right_group.mmu_driver_tag);
|
||||
|
||||
spinlock_lock(&task->lock);
|
||||
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);
|
||||
spinlock_unlock(&task->lock);
|
||||
if (task == cur_cpu()->task) {
|
||||
p_mmu_driver->TlbFlush(task_vaddr, 2 * nr_pages * PAGE_SIZE);
|
||||
/// @todo clean range rather than all
|
||||
@@ -200,20 +191,16 @@ struct session_backend* create_share_pages(struct TaskMicroDescriptor* client, s
|
||||
session_backend->client_side.buf_addr = client_vaddr;
|
||||
session_backend->client_side.capacity = true_capacity;
|
||||
session_backend->client_side.closed = false;
|
||||
spinlock_lock(&client->lock);
|
||||
doubleListNodeInit(&session_backend->client_side.node);
|
||||
doubleListAddOnBack(&session_backend->client_side.node, &client->cli_sess_listhead);
|
||||
spinlock_unlock(&client->lock);
|
||||
// init server side session struct
|
||||
session_backend->server_side.buf_addr = server_vaddr;
|
||||
session_backend->server_side.capacity = true_capacity;
|
||||
session_backend->server_side.head = 0;
|
||||
session_backend->server_side.tail = 0;
|
||||
session_backend->server_side.closed = false;
|
||||
spinlock_lock(&server->lock);
|
||||
doubleListNodeInit(&session_backend->server_side.node);
|
||||
doubleListAddOnBack(&session_backend->server_side.node, &server->svr_sess_listhead);
|
||||
spinlock_unlock(&server->lock);
|
||||
|
||||
return session_backend;
|
||||
}
|
||||
@@ -232,15 +219,11 @@ int delete_share_pages(struct session_backend* session_backend)
|
||||
|
||||
/* unmap share pages */
|
||||
if (session_backend->client) {
|
||||
spinlock_lock(&session_backend->client->lock);
|
||||
doubleListDel(&session_backend->client_side.node);
|
||||
spinlock_unlock(&session_backend->client->lock);
|
||||
}
|
||||
|
||||
if (session_backend->server) {
|
||||
spinlock_lock(&session_backend->server->lock);
|
||||
doubleListDel(&session_backend->server_side.node);
|
||||
spinlock_unlock(&session_backend->server->lock);
|
||||
}
|
||||
|
||||
/* free seesion backend */
|
||||
|
||||
Reference in New Issue
Block a user