void up(struct semaphore *sem) { unsigned long flags; spin_lock_irqsave(&sem->lock, flags); if (likely(list_empty(&sem->wait_list))) sem->count++; else __up(sem); spin_unlock_irqrestore(&sem->lock, flags); }
void up(struct semaphore *sem) { #ifdef WAITQUEUE_DEBUG CHECK_MAGIC(sem->__magic); #endif #ifdef CONFIG_DEBUG_SEMAPHORE printk("%s(%d): up(%p) <count=%d> from %p\n", current->comm, current->pid, sem, atomic_read(&sem->count), __builtin_return_address(0)); #endif __up(sem); }
/** * up :释放信号量 * @sem: the semaphore to release */ void up(struct semaphore *sem) { unsigned long flags; spin_lock_irqsave(&sem->lock, flags); /*没有其他进程在等待sem信号量,则直接递增cout的值 * 直接返回*/ if (likely(list_empty(&sem->wait_list))) sem->count++; else __up(sem); spin_unlock_irqrestore(&sem->lock, flags); }
/** * up - release the semaphore * @sem: the semaphore to release * * Release the semaphore. Unlike mutexes, up() may be called from any * context and even by tasks which have never called down(). */ void up(struct semaphore *sem) { unsigned long flags; spin_lock_irqsave(&sem->lock, flags); #ifdef CONFIG_MT_LOCK_DEBUG if(0 == sem->count) sem_clear_owner(sem); #endif if (likely(list_empty(&sem->wait_list))){ sem->count++; }else __up(sem); spin_unlock_irqrestore(&sem->lock, flags); }
/** * up - release the semaphore * @sem: the semaphore to release * * Release the semaphore. Unlike mutexes, up() may be called from any * context and even by tasks which have never called down(). */ void up(struct semaphore *sem) { unsigned long flags; raw_spin_lock_irqsave(&sem->lock, flags); #ifdef CONFIG_ILOCKDEP ilockdep_release(&sem->idep_map, _RET_IP_, (void *)sem); #endif if (likely(list_empty(&sem->wait_list))) sem->count++; else __up(sem); raw_spin_unlock_irqrestore(&sem->lock, flags); }
void up(semaphore_t *sem) { __up(sem, WT_KSEM); }
static void usem_up(semaphore_t *sem) { __up(sem, WT_USEM); }
static int usem_up(semaphore_t *sem) { __up(sem, WT_USEM); return 0; }