当内核检测到task hung时,我发现内核崩溃时有点和加号。
显示系统中持有的所有锁:由khungtaskd/737持有的2个锁:#0:(rcu_read_lock){....},at:<00000000eaa2e968> check_hung_uninterruptible_tasks check_hung_uninterruptible_tasks/ <00000000eaa2e968> _task.c:175个内联#0:(rcu_read_lock){....},at:<00000000eaa2e968>看门狗+0x1c5/0xd60内核/hung_task.c:249 #1:(tasklist_lock){.+.+},at:<000000005ed461f9> debug_show_all_locks+0xd3/0x400内核/锁定/锁页c:4464
锁名后面括号之间的点和加号是什么?
发布于 2018-04-13 07:12:00
自答:
在linux文档中有一个答案。
状态 验证器将锁类使用历史记录跟踪到4n +1单独的状态位:
其中状态可以是(内核/锁/lockdep_states.h)- hardirq - softirq - reclaim_fs之一。
当违反锁定规则时,这些状态位会出现在锁错误消息中。人为的例子:
modprobe/2287正在尝试获取锁:
(&sio\_locks[i].lock){-.-...}, at: [] mutex\_lock+0x21/0x24但是任务已经锁定了:
(&sio\_locks[i].lock){-.-...}, at: [] mutex\_lock+0x21/0x24位位置表示上面列出的每种状态的状态、状态读取,每个状态中显示的字符指示:
“.”在irq上下文中“在irq上下文中获得”+“在启用irq时获得”?在irq上下文中获得,启用irqs。
未使用的互斥不能成为导致错误的部分原因。
但是内核文档和崩溃日志之间的区别是,崩溃日志中只有4位,而文档中只有6位。
是因为,出于某种原因,linux源代码树(v4.16)的reclaim_fs在kernel/locking/lockdep_states.h中。
https://stackoverflow.com/questions/49788765
复制相似问题