【问题标题】:there is __cond_lock(x,c) define in compiler.h file , but no __cond_unlock(x,c) define?compiler.h 文件中有 __cond_lock(x,c) 定义,但没有 __cond_unlock(x,c) 定义?
【发布时间】:2013-09-02 06:53:10
【问题描述】:

在complier.h中,有一个宏定义如下:

# define __cond_lock(x,c)   ((c) ? ({ __acquire(x); 1; }) : 0)

但是这里我有个问题,就是哪里有__cond_lock定义,却没有定义对应的__cond_unlock,那么释放上的变量,如何保持__cond_lock和__cond_unlock一致?

而且我查看了函数spin_trylock()的定义,它使用了__cond_lock,但是其中也使用了一个_spin_trylock函数。在_spin_trylock函数中,经过几次调用,在这种情况下会使用到__acquire函数,相当于一个操作,它进行了两次计算会导致出现Sparse detection的警告信息,我写了一个实验代码来测试我的判断之后,确实会出现警告信息,如果我写了两次解锁指令,就没有警告信息,但是这在程序运行时不一致。

【问题讨论】:

    标签: linux compilation kernel


    【解决方案1】:

    使用锁定保护关键部分取决于程序员。这意味着,如果您持有锁以保护关键原因,则必须在完成后释放锁。

    Linux 内核中有各种类型的锁定原语,例如。 spinlock()、spinlock_irq()、spin_trylock()。他们有自己的目的。现在, spin_trylock() 在其中使用 __cond_lock ,这是因为要确保该特定锁是否可用于锁定或已被占用。看一下如何使用 spin_trylock 或 __cond_lock 的几个示例。例如。在 kernel/sched/fair.c::rebalance_domain (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/sched/fair.c?id=d8dfad3876e4386666b759da3c833d62fb8b2267#n5574) 查看平衡是如何使用的,它一直在使用 spin_trylock() 来保持锁定并在有条件地释放它时进行。另一个例子可以在 kernel/posix-timers.c, lock_timer() 宏中找到。如果您仔细查看 lock_timer() 的用法,您会发现 __cond_lock 在内核中是如何被使用的,希望您的困惑会消失。

    换句话说,__cond_lock 用于有条件地持有锁,而不是直接使用。在释放锁之前检查一个特定的锁是可能的,这是迄今为止所做的。

    【讨论】:

      猜你喜欢
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2019-12-01
      相关资源
      最近更新 更多