Support multi page task mapping
This commit is contained in:
@@ -53,22 +53,17 @@ int sys_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, int is_dev)
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
int load_len = 0;
|
||||
uintptr_t load_vaddr = *vaddr;
|
||||
while (load_len < true_len) {
|
||||
char* new_paddr = raw_alloc(PAGE_SIZE);
|
||||
CreateResourceTag(NULL, &cur_task->memspace->tag, NULL, TRACER_MEM_FROM_BUDDY_AC_RESOURCE, new_paddr);
|
||||
if (new_paddr == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (xizi_share_page_manager.task_map_pages(cur_task, load_vaddr, (uintptr_t)new_paddr, 1, false) == (uintptr_t)NULL) {
|
||||
raw_free(new_paddr);
|
||||
return -1;
|
||||
}
|
||||
load_vaddr += PAGE_SIZE;
|
||||
load_len += PAGE_SIZE;
|
||||
*paddr = (uintptr_t)new_paddr;
|
||||
char* new_paddr = raw_alloc(true_len);
|
||||
if (new_paddr == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (xizi_share_page_manager.task_map_pages(cur_task, load_vaddr, (uintptr_t)new_paddr, true_len / PAGE_SIZE, false) == (uintptr_t)NULL) {
|
||||
raw_free(new_paddr);
|
||||
return -1;
|
||||
}
|
||||
CreateResourceTag(NULL, &cur_task->memspace->tag, NULL, TRACER_MEM_FROM_BUDDY_AC_RESOURCE, new_paddr);
|
||||
*paddr = (uintptr_t)new_paddr;
|
||||
}
|
||||
|
||||
cur_task->memspace->mem_size += true_len;
|
||||
|
||||
@@ -52,6 +52,7 @@ int sys_poll_session(struct Session* userland_session_arr, int arr_capacity)
|
||||
|
||||
struct double_list_node* cur_node = NULL;
|
||||
struct server_session* server_session = NULL;
|
||||
|
||||
/* update old sessions */
|
||||
for (int i = 0; i < arr_capacity; i++) {
|
||||
if (UNLIKELY(userland_session_arr[i].buf == NULL)) {
|
||||
@@ -111,12 +112,13 @@ int sys_poll_session(struct Session* userland_session_arr, int arr_capacity)
|
||||
};
|
||||
|
||||
struct IpcMsg* msg = IPCSESSION_MSG(&userland_session_arr[session_idx]);
|
||||
if (is_msg_needed(msg)) {
|
||||
if (msg != NULL && is_msg_needed(msg)) {
|
||||
nr_sessions_need_to_handle++;
|
||||
}
|
||||
|
||||
session_idx++;
|
||||
}
|
||||
|
||||
if (session_idx < arr_capacity) {
|
||||
userland_session_arr[session_idx].buf = NULL;
|
||||
if (!has_middle_delete && nr_sessions_need_to_handle == 0) {
|
||||
|
||||
@@ -42,19 +42,20 @@ int sys_yield(task_yield_reason reason)
|
||||
if ((reason & SYS_TASK_YIELD_BLOCK_IPC) != 0) {
|
||||
if (cur_task->advance_unblock) {
|
||||
cur_task->advance_unblock = false;
|
||||
return 0;
|
||||
} else {
|
||||
xizi_task_manager.task_block(&xizi_task_manager.task_blocked_list_head, cur_task);
|
||||
}
|
||||
}
|
||||
|
||||
// wake up all possible server
|
||||
struct client_session* client_session = NULL;
|
||||
DOUBLE_LIST_FOR_EACH_ENTRY(client_session, &cur_task->cli_sess_listhead, node)
|
||||
{
|
||||
assert(client_session != NULL);
|
||||
struct session_backend* session_backend = CLIENT_SESSION_BACKEND(client_session);
|
||||
if (session_backend->server->state == BLOCKED) {
|
||||
xizi_task_manager.task_unblock(session_backend->server);
|
||||
// wake up all possible server
|
||||
struct client_session* client_session = NULL;
|
||||
DOUBLE_LIST_FOR_EACH_ENTRY(client_session, &cur_task->cli_sess_listhead, node)
|
||||
{
|
||||
assert(client_session != NULL);
|
||||
struct session_backend* session_backend = CLIENT_SESSION_BACKEND(client_session);
|
||||
if (session_backend->server->state == BLOCKED) {
|
||||
xizi_task_manager.task_unblock(session_backend->server);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user