[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 3/3] kernel2: Taskwechsel beim RPC
* kernel2: Beim erfolgreichen Senden eines RPC wird sofort zum
aufgerufenen Task gewechselt
* kernel2: Bei der Rueckkehr von einem RPC wird zum Aufrufer
zurueckgewechselt
* kernel2: Wenn ein RPC ausgefuehrt werden soll, der aufzurufende Task
aber blockiert ist (EAGAIN), wird der naechste Task geschedult
Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
src/kernel2/src/syscalls/rpc.c | 30 ++++++++++++++++--------------
1 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/src/kernel2/src/syscalls/rpc.c b/src/kernel2/src/syscalls/rpc.c
index e6ffd1a..7fc887f 100644
--- a/src/kernel2/src/syscalls/rpc.c
+++ b/src/kernel2/src/syscalls/rpc.c
@@ -200,7 +200,7 @@ static int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
((callee->process->blocked_by_pid) ||
!pm_block_rpc(callee->process, syscall_pm_get_pid())))
{
- return -EAGAIN;
+ goto fail_retry;
}
// Interrupt Stack Frame des aufgerufenen Tasks mappen
@@ -292,17 +292,19 @@ static int do_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
pm_unblock_rpc(callee->process, syscall_pm_get_pid());
}
-
-#if 0
- {
- schedule_to_task(callee, (dword*) esp);
- } else {
- isf->eax = -1;
- schedule((dword*)esp);
- }
-#endif
+ // Zum aufgerufenen Task wechseln
+ pm_scheduler_push(current_thread);
+ pm_scheduler_get(callee);
+ current_thread = callee;
return 0;
+
+fail_retry:
+ // Jetzt direkt nochmal probieren ist nicht sinnvoll, lassen wir erstmal
+ // einen anderen Task vor
+ pm_scheduler_push(current_thread);
+ current_thread = pm_scheduler_pop();
+ return -EAGAIN;
}
int syscall_fastrpc(pid_t callee_pid, size_t metadata_size, void* metadata,
@@ -384,12 +386,12 @@ void syscall_fastrpc_ret(void)
// rpc->caller->process->pid,
// current_process->pid);
- // TODO Wechsel zum aufrufenden Task
-#if 0
+ // Wechsel zum aufrufenden Task
if (rpc->caller) {
- schedule_to_task(rpc->caller, (dword*) esp);
+ pm_scheduler_push(current_thread);
+ pm_scheduler_get(rpc->caller);
+ current_thread = rpc->caller;
}
-#endif
// Wenn es ein IRQ-verarbeitender RPC war, den Interrupt jetzt
// wieder aktivieren
--
1.6.0.2