kthread_usleep()
It's the guts of what sys_block did: blocks a kthread for X usec. The classic
issue is where we run the alarm handler and where to restart the kthread.
diff --git a/kern/include/kthread.h b/kern/include/kthread.h
index 8b24dff..e55a956 100644
--- a/kern/include/kthread.h
+++ b/kern/include/kthread.h
@@ -82,6 +82,7 @@
void restart_kthread(struct kthread *kthread);
void kthread_runnable(struct kthread *kthread);
void kthread_yield(void);
+void kthread_usleep(uint64_t usec);
void ktask(char *name, void (*fn)(void*), void *arg);
/* Debugging */
void check_poison(char *msg);
diff --git a/kern/src/kthread.c b/kern/src/kthread.c
index ef17394..8dbc0b6 100644
--- a/kern/src/kthread.c
+++ b/kern/src/kthread.c
@@ -180,6 +180,17 @@
sem_down(sem);
}
+void kthread_usleep(uint64_t usec)
+{
+ /* TODO: classic ksched issue: where do we want the wake up to happen? */
+ struct timer_chain *tchain = &per_cpu_info[core_id()].tchain;
+ struct alarm_waiter a_waiter;
+ init_awaiter(&a_waiter, 0);
+ set_awaiter_rel(&a_waiter, usec);
+ set_alarm(tchain, &a_waiter);
+ sleep_on_awaiter(&a_waiter);
+}
+
static void __ktask_wrapper(uint32_t srcid, long a0, long a1, long a2)
{
ERRSTACK(1);
diff --git a/kern/src/syscall.c b/kern/src/syscall.c
index 2be0963..6522682 100644
--- a/kern/src/syscall.c
+++ b/kern/src/syscall.c
@@ -328,14 +328,9 @@
* async I/O handling. */
static int sys_block(struct proc *p, unsigned int usec)
{
- struct timer_chain *tchain = &per_cpu_info[core_id()].tchain;
- struct alarm_waiter a_waiter;
- init_awaiter(&a_waiter, 0);
/* Note printing takes a few ms, so your printds won't be perfect. */
printd("[kernel] sys_block(), sleeping at %llu\n", read_tsc());
- set_awaiter_rel(&a_waiter, usec);
- set_alarm(tchain, &a_waiter);
- sleep_on_awaiter(&a_waiter);
+ kthread_usleep(usec);
printd("[kernel] sys_block(), waking up at %llu\n", read_tsc());
return 0;
}