我有一个由多个函数调用的函数。有些函数使用自旋锁定调用它,有些函数没有任何锁定。我怎么知道我的函数是否被保持螺旋锁调用?
我有一段时间写了一大段代码。它有一些函数可以使用和不使用不同代码路径的锁来调用。只考虑没有锁的情况,函数使用GFP_KERNEL标志分配skbs。使用spin_lock()调用时会导致问题。我需要处理这两种情况以避免在spin_lock中睡觉。
答案 0 :(得分:5)
如何知道我的函数是否在保持螺旋锁的情况下被调用?
你不能,不能直接。你需要在某种结构中设置一个标志,指示你是否持有锁。
最好创建2个功能。如果你拿着锁,你可以打电话给你,如果你没有锁,你可以打电话给你。
//b->lck must be taken
void foo_unlocked(struct bar *b)
{
//do your thing, assume relevant lock is held
}
//b->lck must not be taken
void foo(struct bar *b)
{
spin_lock(b->lck);
foo_unlocked(b);
spin_unlock(b->lck);
}
答案 1 :(得分:0)
我只需检查禁用抢占或禁用irqs。基于此,我可以使用GFP_KERNEL或GFP_ATOMIC分配内存。因此,我不需要依赖spin_lock或其他锁。使用in_atomic()和irqs_disabled()函数,我可以实现它。感谢