Linux下产生死锁问题分析(2)

说明:该驱动和前一篇文章“Linux字符驱动中动态分配设备号与动态生成设备节点”中的效果是相同的(见 ),只不过这里使用了信号量对globalvar_write 和 globalvar_read函数进行了阻塞控制,当上层应用程序写入驱动改变globalvar之后,读操作才可以进行。
 
上面代码为什么会出现死锁呢,可以查阅内核中的up()函数的定义:

/*  /kernel/semaphore.c  */
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);
}

static noinline void __sched  __up(struct semaphore *sem)
{
    struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
                        struct semaphore_waiter, list);
    list_del(&waiter->list);
    waiter->up = 1;
    wake_up_process(waiter->task);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/80d7174199f0675a79ca05a7351fef15.html