【问题标题】:Checking the owner field of struct mutex in Linux在 Linux 中检查 struct mutex 的所有者字段
【发布时间】:2019-12-06 22:51:38
【问题描述】:

我想签入锁定在内核中的struct mutex,他是该互斥体的所有者。

struct mutex {
    atomic_long_t       owner;
    spinlock_t      wait_lock;
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
    struct optimistic_spin_queue osq; /* Spinner MCS lock */
#endif
    struct list_head    wait_list;
#ifdef CONFIG_DEBUG_MUTEXES
    void            *magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
    struct lockdep_map  dep_map;
#endif
};

我从kernel documentation 了解到:

字段所有者实际上包含 struct task_struct * 到当前锁 所有者,因此如果当前不拥有,则为 NULL。

是否有任何安全的方法可以将该字段与current 进行比较?

【问题讨论】:

  • 注:来自kernel.org两种锁都不是递归的
  • @red0ct 我不想实现递归锁,我想实现一些清理代码,以确保在持有互斥锁时杀死的进程释放它(即采取一些纠正措施以防万一在持有互斥锁的同时释放进程)
  • @ad3angel1s 你不能在获得互斥体时设置一个标志,在释放互斥体时清除标志,然后在清理代码中检查标志吗?
  • @IanAbbott 不确定这将如何工作。在清理过程中,我如何通过查看 isTaken 标志知道当前进程是互斥锁的实际所有者?
  • @ad3angel1s 这取决于您所说的“杀死”是什么意思。任务可能会收到信号,但不会在系统调用过程中被销毁。

标签: c linux-kernel mutex


【解决方案1】:

有没有办法将该字段与当前字段进行比较?

来自kernel/locking/mutex.c你可以使用这个功能:

/*
 * Internal helper function; C doesn't allow us to hide it :/
 *
 * DO NOT USE (outside of mutex code).
 */
static inline struct task_struct *__mutex_owner(struct mutex *lock)
{
    return (struct task_struct *)(atomic_long_read(&lock->owner) & ~MUTEX_FLAGS);
}

那我猜:

extern struct mutex *some_mutex;
extern struct task_struct *current;
__mutex_owner(some_mutex) == current;

【讨论】:

  • 谢谢!但为什么“不要使用(互斥代码之外)”?
【解决方案2】:

如果你想实现递归互斥体,那么你可以使用mutex_trylock_recursive函数:它的行为类似于mutex_trylock,但是它允许互斥体的当前所有者调用这个函数。在这种情况下,它会返回一个特殊值。


__mutex_owner 一样,函数mutex_trylock_recursive 被标记为已弃用/“请勿使用”。可能有人不喜欢内核中的递归互斥锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多