lockdep 的子类和 name_version

subclass and name_version of lockdep

我是 lockdep 的新手,有些东西我不能完全理解。 我想弄清楚 subclassname_version。似乎因为 lockdep 使用 name_version 来跟踪锁 class 的每个实例。 subclass代表嵌套锁。

那么我的问题来了。

每个有两个SSD /dev/sda /dev/sdb 每个 SSD 有两个分区,所以 /dev/sda1 /dev/sda2 /dev/sdb1 /dev/sdb2 那么对于每个磁盘和分区,锁名是如何确定的呢? 我认为 /dev/sda -> lock#1 /dev/sda1-> lock#1/1 /dev/sda2 -> lock#?/1 /dev/sda2的锁名是如何确定的?好像是lock_acquire()的顺序 可能会影响 name_version 但假设 /dev/sda1 的锁比 /dev/sda2 的锁是预先获得的。

是否有人可以为可能的情况澄清每把锁的名称?

我想我已经弄清楚这些是什么了。这是我到目前为止得到的东西。 基本上,lockdep 通过 class 来区分锁,而不是实例。换句话说,lock 认为所有自旋锁都是相同的,除非您通过 lockdep_set* 函数显式设置密钥。 (在此之后,假设所有的自旋锁都是由同一个函数初始化的) 实际上,当自旋锁被初始化时,静态的 key 参数总是传递给自旋锁的 lockdep_map 成员。这就是 lockdep 将所有自旋锁识别为相同的原因。 但是,这在调试死锁或可能的死锁情况时没有用。所以 lockdep 提供了 lockdep_set* 功能,这样你就可以注册每个锁,让 lockdep 认为它们是不同的。当传递给 lockdep_set* 的名称重叠时,lockdep 通过 name_version 来区分已注册的锁,该 name_version 打印为 # 后跟数字。 Subclass 原理相同。它用于嵌套锁。在 subclass 参数存在的情况下,lockdep 新注册以便区分它。否则,lockdep 会警告您可能存在死锁情况。

再举个例子说明一下。 有一个目录包含三个子目录,其中包含三个文件。 Top_Dir |_Sub_Dir_1 |__File1、文件 2、文件 3 |_Sub_Dir_2 |__File4、文件 5、文件 6 |_Sub_Dir_3 |__File7、文件 8、文件 9 在这种情况下,如果您对所有目录和文件使用自旋锁并且没有显式设置密钥,lockdep 会将所有锁识别为相同。 但是,如果您使用相同的名称显式设置密钥,您会看到 dir_lock、dir_lock#2、dir_lock#3、... 此外,当您将 subclass 参数与 *Nested 函数一起使用时,您可以看到 dir_lock/1、dir_lock#2/1、....

总而言之,您可以注释 name_version 和 subclass 以帮助您轻松调试死锁情况。