Semaphores and CVs have irqsave initializers
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Nov 2012 18:34:29 +0000 (10:34 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Nov 2012 23:41:18 +0000 (15:41 -0800)
We also now assert we can block when blocking.  We don't enforce the
spinlock checks yet.

kern/include/kthread.h
kern/src/alarm.c
kern/src/blockdev.c
kern/src/ext2fs.c
kern/src/kthread.c

index 776c639..b179548 100644 (file)
@@ -51,12 +51,14 @@ void kthread_runnable(struct kthread *kthread);
 void kthread_yield(void);
 
 void sem_init(struct semaphore *sem, int signals);
 void kthread_yield(void);
 
 void sem_init(struct semaphore *sem, int signals);
+void sem_init_irqsave(struct semaphore *sem, int signals);
 void sem_down(struct semaphore *sem);
 bool sem_up(struct semaphore *sem);
 void sem_down_irqsave(struct semaphore *sem, int8_t *irq_state);
 bool sem_up_irqsave(struct semaphore *sem, int8_t *irq_state);
 
 void cv_init(struct cond_var *cv);
 void sem_down(struct semaphore *sem);
 bool sem_up(struct semaphore *sem);
 void sem_down_irqsave(struct semaphore *sem, int8_t *irq_state);
 bool sem_up_irqsave(struct semaphore *sem, int8_t *irq_state);
 
 void cv_init(struct cond_var *cv);
+void cv_init_irqsave(struct cond_var *cv);
 void cv_lock(struct cond_var *cv);
 void cv_unlock(struct cond_var *cv);
 void cv_lock_irqsave(struct cond_var *cv, int8_t *irq_state);
 void cv_lock(struct cond_var *cv);
 void cv_unlock(struct cond_var *cv);
 void cv_lock_irqsave(struct cond_var *cv, int8_t *irq_state);
index 889ca0f..9af9263 100644 (file)
@@ -52,7 +52,7 @@ void init_awaiter(struct alarm_waiter *waiter,
        waiter->wake_up_time = ALARM_POISON_TIME;
        waiter->func = func;
        if (!func)
        waiter->wake_up_time = ALARM_POISON_TIME;
        waiter->func = func;
        if (!func)
-               sem_init(&waiter->sem, 0);
+               sem_init_irqsave(&waiter->sem, 0);
 }
 
 /* Give this the absolute time.  For now, abs_time is the TSC time that you want
 }
 
 /* Give this the absolute time.  For now, abs_time is the TSC time that you want
index 62eecc6..ec86543 100644 (file)
@@ -246,7 +246,7 @@ found:
        breq->flags = BREQ_READ;
        breq->callback = generic_breq_done;
        breq->data = 0;
        breq->flags = BREQ_READ;
        breq->callback = generic_breq_done;
        breq->data = 0;
-       sem_init(&breq->sem, 0);
+       sem_init_irqsave(&breq->sem, 0);
        breq->bhs = breq->local_bhs;
        breq->bhs[0] = bh;
        breq->nr_bhs = 1;
        breq->bhs = breq->local_bhs;
        breq->bhs[0] = bh;
        breq->nr_bhs = 1;
index bac92c4..33c0e3b 100644 (file)
@@ -715,7 +715,7 @@ int ext2_readpage(struct page_map *pm, struct page *page)
        breq->flags = BREQ_READ;
        breq->callback = generic_breq_done;
        breq->data = 0;
        breq->flags = BREQ_READ;
        breq->callback = generic_breq_done;
        breq->data = 0;
-       sem_init(&breq->sem, 0);
+       sem_init_irqsave(&breq->sem, 0);
        breq->bhs = breq->local_bhs;
        breq->nr_bhs = 0;
        /* Pack the BH pointers in the block request */
        breq->bhs = breq->local_bhs;
        breq->nr_bhs = 0;
        /* Pack the BH pointers in the block request */
index 00eb723..3d61b1e 100644 (file)
@@ -168,6 +168,15 @@ void sem_init(struct semaphore *sem, int signals)
        TAILQ_INIT(&sem->waiters);
        sem->nr_signals = signals;
        spinlock_init(&sem->lock);
        TAILQ_INIT(&sem->waiters);
        sem->nr_signals = signals;
        spinlock_init(&sem->lock);
+       sem->irq_okay = FALSE;
+}
+
+void sem_init_irqsave(struct semaphore *sem, int signals)
+{
+       TAILQ_INIT(&sem->waiters);
+       sem->nr_signals = signals;
+       spinlock_init_irqsave(&sem->lock);
+       sem->irq_okay = TRUE;
 }
 
 /* This downs the semaphore and suspends the current kernel context on its
 }
 
 /* This downs the semaphore and suspends the current kernel context on its
@@ -181,6 +190,7 @@ void sem_down(struct semaphore *sem)
        register uintptr_t new_stacktop;
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
 
        register uintptr_t new_stacktop;
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
 
+       assert(can_block(pcpui));
        /* Make sure we aren't holding any locks (only works if SPINLOCK_DEBUG) */
        assert(!pcpui->lock_depth);
        /* Try to down the semaphore.  If there is a signal there, we can skip all
        /* Make sure we aren't holding any locks (only works if SPINLOCK_DEBUG) */
        assert(!pcpui->lock_depth);
        /* Try to down the semaphore.  If there is a signal there, we can skip all
@@ -342,6 +352,15 @@ void cv_init(struct cond_var *cv)
        sem_init(&cv->sem, 0);
        spinlock_init(&cv->lock);
        cv->nr_waiters = 0;
        sem_init(&cv->sem, 0);
        spinlock_init(&cv->lock);
        cv->nr_waiters = 0;
+       cv->irq_okay = FALSE;
+}
+
+void cv_init_irqsave(struct cond_var *cv)
+{
+       sem_init_irqsave(&cv->sem, 0);
+       spinlock_init_irqsave(&cv->lock);
+       cv->nr_waiters = 0;
+       cv->irq_okay = TRUE;
 }
 
 void cv_lock(struct cond_var *cv)
 }
 
 void cv_lock(struct cond_var *cv)