我试图了解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;
}
然后如何检查已调用解锁函数的线程是否实际上是线程锁定的?
我缺少什么?
提前致谢。
答案 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);
}