Dead lock

内核中发生死锁的情况还是常常会有的,我们这次来看看一个真实发生死锁的情况,看看别人是怎么分析的。

这是一个A-B-B-A,锁顺序不统一导致的死锁。

首先,可以看到涉及的是两个进程。

INFO: task syz.5.48:5749 blocked for more than 143 seconds.
      Not tainted syzkaller #0

...

INFO: task syz.5.48:5754 blocked for more than 143 seconds.
      Not tainted syzkaller #0

也就是说进程5749和进程5754被阻塞了。

然后从下面看这两个进程都拿到了哪些锁。

1 lock held by syz.5.48/5749:
 #0: ffff888011d3f618 (&hugetlbfs_i_mmap_rwsem_key){++++}-{4:4}, at: i_mmap_lock_read include/linux/fs.h:568 [inline]
 #0: ffff888011d3f618 (&hugetlbfs_i_mmap_rwsem_key){++++}-{4:4}, at: __rmap_walk_file+0x227/0x620 mm/rmap.c:2905

3 locks held by syz.5.48/5754:
 ...
 #2: ffff888011d3f618 (&hugetlbfs_i_mmap_rwsem_key){++++}-{4:4}, at: i_mmap_lock_write include/linux/fs.h:548 [inline]
 #2: ffff888011d3f618 (&hugetlbfs_i_mmap_rwsem_key){++++}-{4:4}, at: hugetlbfs_punch_hole fs/hugetlbfs/inode.c:691 [inline]
 #2: ffff888011d3f618 (&hugetlbfs_i_mmap_rwsem_key){++++}-{4:4}, at: hugetlbfs_fallocate+0x4b5/0x1100 fs/hugetlbfs/inode.c:741

从这里看到,这两个进程都会去拿mmap_lock这个锁。其实这个时候是说两进程都拿到了这个锁,那么意味着他们有人还要拿另一个锁,但是这个锁被另一个拿了。

这时候要再回到call trace。

可以看到,进程5754卡在了folio_lock。那么这个时候就有可能是进程5749已经锁了folio,这样导致5754没法拿到。

这个时候再回到代码去看看是不是有这个可能。

根据lance的分析,确实有这个可能。

好了,至此我们学习了一个死锁案例,下次碰到这样的问题就有点思路了。

Last updated