Linux lockdep的子类和名称\u版本

Linux lockdep的子类和名称\u版本,linux,kernel,locking,Linux,Kernel,Locking,我是洛克德普的新手,有些事情我不能完全理解。 我想找出子类和name\u版本。似乎由于lockdep使用name\u version来跟踪lock类的每个实例。和子类表示嵌套锁 然后我的问题来了 每个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#

我是洛克德普的新手,有些事情我不能完全理解。 我想找出
子类
name\u版本
。似乎由于lockdep使用
name\u version
来跟踪lock类的每个实例。和
子类
表示嵌套锁

然后我的问题来了

每个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\u acquire()
可能会影响
名称\u版本
,但假设
/dev/sda1
的锁是预先获取的,而不是
/dev/sda2
的锁


有没有人能为可能出现的情况澄清每个锁的名称?

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

让我用一个例子再解释一遍。 有一个目录包含三个子目录,其中包含三个文件。 总导演 |_副主任1 |__文件1、文件2、文件3 |_副主任2 |__文件4、文件5、文件6 |_副署长3 |__文件7、文件8、文件9 在这种情况下,如果您对所有目录和文件使用自旋锁,并且没有显式地设置密钥,则lockdep将识别所有锁是相同的。 但是如果您显式地使用相同的名称设置密钥,您可以看到dir_lock,dir_lock#2,dir_lock#3。。。 此外,当您使用带有*嵌套函数的子类参数时,您可以看到这样的情况:dir_lock/1,dir_lock#2/1

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