lockdep 的子类和 name_version
subclass and name_version of lockdep
我是 lockdep 的新手,有些东西我不能完全理解。
我想弄清楚 subclass
和 name_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 以帮助您轻松调试死锁情况。
我是 lockdep 的新手,有些东西我不能完全理解。
我想弄清楚 subclass
和 name_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 以帮助您轻松调试死锁情况。