Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我们怎么知道我们在旋转锁中?_Linux_Linux Kernel_Linux Device Driver_Embedded Linux_Kernel Module - Fatal编程技术网

Linux 我们怎么知道我们在旋转锁中?

Linux 我们怎么知道我们在旋转锁中?,linux,linux-kernel,linux-device-driver,embedded-linux,kernel-module,Linux,Linux Kernel,Linux Device Driver,Embedded Linux,Kernel Module,我有一个被多个函数调用的函数。有些函数在保持自旋锁的情况下调用它,有些函数则没有任何锁。我如何知道我的函数是否在自旋锁保持的情况下被调用 我有一段时间以前写的代码。它有一些函数,可以从不同的代码路径调用带锁和不带锁的函数。这些函数只考虑没有锁的情况,分配带有GFP_内核标志的SKB。使用spin_lock()调用时会导致问题。我需要处理这两种情况,以避免睡在旋转锁内 我如何知道我的函数是否在自旋锁保持的情况下被调用 你不能,不能直接。您需要自己在某些结构中设置一个标志,指示是否持有锁 最好创建两

我有一个被多个函数调用的函数。有些函数在保持自旋锁的情况下调用它,有些函数则没有任何锁。我如何知道我的函数是否在自旋锁保持的情况下被调用

我有一段时间以前写的代码。它有一些函数,可以从不同的代码路径调用带锁和不带锁的函数。这些函数只考虑没有锁的情况,分配带有GFP_内核标志的SKB。使用spin_lock()调用时会导致问题。我需要处理这两种情况,以避免睡在旋转锁内

我如何知道我的函数是否在自旋锁保持的情况下被调用

你不能,不能直接。您需要自己在某些结构中设置一个标志,指示是否持有锁

最好创建两个函数。一个你拿着锁就叫它,一个你不拿着锁就叫它

//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);
}
我如何知道我的函数是否在自旋锁保持的情况下被调用

你不能,不能直接。您需要自己在某些结构中设置一个标志,指示是否持有锁

最好创建两个函数。一个你拿着锁就叫它,一个你不拿着锁就叫它

//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);
}

我只需要检查抢占禁用或IRQ禁用。基于此,我可以使用GFP_内核或GFP_原子来分配内存。因此,我不需要依赖于何时自旋锁定或另一个锁定。使用in_atomic()和irqs_disabled()函数,我可以实现它。谢谢

我只需要检查已禁用抢占或已禁用IRQ。基于此,我可以使用GFP_内核或GFP_原子来分配内存。因此,我不需要依赖于何时自旋锁定或另一个锁定。使用in_atomic()和irqs_disabled()函数,我可以实现它。谢谢

基于这一事实,你想决定什么?alloc_skb(大小,GFP_内核/GFP_原子);基于这一事实,您试图决定什么?alloc_skb(大小,GFP_内核/GFP_原子);我无法判断这是否真的有效,是否是无种族的,但我可以告诉你,这样做通常不是一个好主意。在C语言中,尤其是在低级系统编程中,最好告诉程序员她有什么选择,让她选择做什么,或者要求某些条件,让她确保这些条件,而不是自己尝试满足非平凡的条件。就像@nos所说的,最好的解决方案是有两个函数,一个假设锁定,另一个假设不锁定。或者,您可以使用一个
bool
值来判断是否使用了锁。执行这些操作不是一个好主意的原因是您强制用户执行某些可能不必要、低效或错误的操作。我不知道你的具体应用程序,所以这是一般性的,但想象一下程序员在她知道的上下文中调用你的函数可以使用
GFP_ATOMIC
,但由于某些原因,自旋锁不可用,或者不应该使用。我无法判断这是否真的有效,是否没有种族限制,但我可以告诉你,这样做通常不是一个好主意。在C语言中,尤其是在低级系统编程中,最好告诉程序员她有什么选择,让她选择做什么,或者要求某些条件,让她确保这些条件,而不是自己尝试满足非平凡的条件。就像@nos所说的,最好的解决方案是有两个函数,一个假设锁定,另一个假设不锁定。或者,您可以使用一个
bool
值来判断是否使用了锁。执行这些操作不是一个好主意的原因是您强制用户执行某些可能不必要、低效或错误的操作。我不知道您的具体应用程序,所以这是一般性的,但是想象一下程序员在她知道的上下文中调用您的函数可以使用
GFP\u-ATOMIC
,但由于某些原因,自旋锁不可用,或者不应该使用。我想最好将其称为
\uuuuufoo
(Linux风格)或者
foo\u nolock
(Solaris风格?)我认为最好称之为
\uu foo
(Linux风格)或
foo\u nolock
(Solaris风格?)