kthread_usleep()
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Jan 2015 22:04:05 +0000 (17:04 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Feb 2015 15:12:31 +0000 (10:12 -0500)
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.

kern/include/kthread.h
kern/src/kthread.c
kern/src/syscall.c

index 8b24dff..e55a956 100644 (file)
@@ -82,6 +82,7 @@ struct kthread *__kthread_zalloc(void);
 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);
index ef17394..8dbc0b6 100644 (file)
@@ -180,6 +180,17 @@ void kthread_yield(void)
        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);
index 2be0963..6522682 100644 (file)
@@ -328,14 +328,9 @@ static int sys_null(void)
  * 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;
 }