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; }