如何在内核中的互斥锁解锁期间检查所有权?

时间:2015-08-18 06:52:57

标签: multithreading linux-kernel mutex

我试图了解Linux内核中互斥实现的内部结构。 据我所知,互斥体实现最基本的一点是

  

只有获得锁定的线程才能释放锁定   互斥

无论如何,即使在执行互斥锁实现(http://lxr.free-electrons.com/source/kernel/locking/mutex.c)之后,我也无法理解在mutex_unlock期间如何检查所有权?

根据实施情况:

void __sched mutex_unlock(struct mutex *lock){ 
     .......
     mutex_clear_owner(lock);  // just clears the owner
     __mutex_fastpath_unlock(&lock->count, __mutex_unlock_slowpath);
     ....
}

这是mutex_clear_owner宏定义(http://lxr.free-electrons.com/source/kernel/locking/mutex.h#L25)。

static inline void mutex_clear_owner(struct mutex *lock)
{
    lock->owner = NULL;
}

然后如何检查已调用解锁函数的线程是否实际上是线程锁定的?

我缺少什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你的问题不清楚。

"只有获得锁定的线程才能释放互斥锁上的锁定。是程序员的信息。显然,如果说互斥锁只能被锁定它们的线程解锁,并且通过解锁由不同线程锁定的互斥锁而导致代码违反此属性,那么任何错误报告都不会对您有所帮助,并且在这里毫无意义。 / p>

因此,检测此类违规尝试仅作为调试功能才有意义,在这种情况下,oops / panic是有序的。

正如您所看到的,清除所有者的行为是#ifndef CONFIG_DEBUG_MUTEXES。

答案 1 :(得分:0)

现在我明白了本月的@employee试图说的话。

这是所有权检查debug_mutex_unlock函数。这只会在有意义的调试案例中调用。

void debug_mutex_unlock(struct mutex *lock)
{
    if (likely(debug_locks)) {
        DEBUG_LOCKS_WARN_ON(lock->magic != lock);

        if (!lock->owner)
            DEBUG_LOCKS_WARN_ON(!lock->owner);
        else
            DEBUG_LOCKS_WARN_ON(lock->owner != current);

        DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next);
        mutex_clear_owner(lock);
    }