Linux kernel 阻塞超过120秒

Linux kernel 阻塞超过120秒,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在尝试编写一个块设备驱动程序,用于从网络套接字读取/写入块。在某个时刻,当读取多个块时,使用此驱动程序的应用程序似乎挂起(但仍然会接受输入,即使它不做任何操作),并且系统总体上似乎响应良好。dmesg显示以下消息。总的来说,即使我启动了任何其他使用该驱动程序的应用程序,我也不能将其用于任何事情 我正在使用linux内核v3.9 有人能帮忙解决这个问题吗 [ 489.779458] INFO: task xxd:2939 blocked for more than 120 seconds.

我正在尝试编写一个块设备驱动程序,用于从网络套接字读取/写入块。在某个时刻,当读取多个块时,使用此驱动程序的应用程序似乎挂起(但仍然会接受输入,即使它不做任何操作),并且系统总体上似乎响应良好。dmesg显示以下消息。总的来说,即使我启动了任何其他使用该驱动程序的应用程序,我也不能将其用于任何事情

我正在使用linux内核v3.9

有人能帮忙解决这个问题吗

[  489.779458] INFO: task xxd:2939 blocked for more than 120 seconds.
[  489.779466] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[  489.779469] xxd             D 0000000000000000     0  2939   2237 0x00000006
[  489.779475]  ffff8801912a9998 0000000000000046 02fc000000000008 ffff8801bfff7000
[  489.779479]  ffff8801b2ef45f0 ffff8801912a9fd8 ffff8801912a9fd8 ffff8801912a9fd8
[  489.779482]  ffff8801b61e9750 ffff8801b2ef45f0 ffff8801912a9998 ffff8801b8e34af8
[  489.779485] Call Trace:
[  489.779497]  [<ffffffff81131ad0>] ? __lock_page+0x70/0x70
[  489.779505]  [<ffffffff816e86a9>] schedule+0x29/0x70
[  489.779510]  [<ffffffff816e877f>] io_schedule+0x8f/0xd0
[  489.779514]  [<ffffffff81131ade>] sleep_on_page+0xe/0x20
[  489.779518]  [<ffffffff816e654a>] __wait_on_bit_lock+0x5a/0xc0
[  489.779522]  [<ffffffff811348aa>] ? find_get_pages+0xca/0x150
[  489.779526]  [<ffffffff81131ac7>] __lock_page+0x67/0x70
[  489.779531]  [<ffffffff8107fa50>] ? autoremove_wake_function+0x40/0x40
[  489.779536]  [<ffffffff81140bd2>] truncate_inode_pages_range+0x4b2/0x4c0
[  489.779540]  [<ffffffff81140c65>] truncate_inode_pages+0x15/0x20
[  489.779545]  [<ffffffff811d331c>] kill_bdev+0x2c/0x40
[  489.779548]  [<ffffffff811d3931>] __blkdev_put+0x71/0x1c0
[  489.779552]  [<ffffffff811aeb48>] ? __d_free+0x48/0x70
[  489.779556]  [<ffffffff811d3adb>] blkdev_put+0x5b/0x160
[  489.779559]  [<ffffffff811d3c05>] blkdev_close+0x25/0x30
[  489.779564]  [<ffffffff8119b16a>] __fput+0xba/0x240
[  489.779568]  [<ffffffff8119b2fe>] ____fput+0xe/0x10
[  489.779572]  [<ffffffff8107ba18>] task_work_run+0xc8/0xf0
[  489.779577]  [<ffffffff8105f797>] do_exit+0x2c7/0xa70
[  489.779581]  [<ffffffff8106f32e>] ? send_sig_info+0x1e/0x20
[  489.779585]  [<ffffffff8106f34c>] ? send_sig+0x1c/0x20
[  489.779588]  [<ffffffff8105ffd4>] do_group_exit+0x44/0xa0
[  489.779592]  [<ffffffff8106fe00>] get_signal_to_deliver+0x230/0x600
[  489.779600]  [<ffffffff81014398>] do_signal+0x58/0x8e0
[  489.779605]  [<ffffffff81014ca0>] do_notify_resume+0x80/0xc0
[  489.779608]  [<ffffffff816f241a>] int_signal+0x12/0x17
[489.779458]信息:任务xxd:2939被阻止超过120秒。
[489.779466]“echo 0>/proc/sys/kernel/hung\u task\u timeout\u secs”禁用此消息。
[489.779469]xxd D 000000000000000000 2939 2237 0x00000006
[489.779475]FF8801912A998 00000000000000 46 02FC00000000008 FFFF8801BFF7000
[489.779479]FF8801B2EF45F0 FF8801912A9FD8 FF8801912A9FD8 FF8801912A9FD8 FF8801912A9FD8
[489.779482]FF8801B61E9750 FF8801B2EF45F0 FF8801912AF998 FF8801B8E34AF8
[489.779485]呼叫跟踪:
[  489.779497]  [] ? __锁定页面+0x70/0x70
[489.779505][]时间表+0x29/0x70
[489.779510][]io_计划+0x8f/0xd0
[489.779514][]第页睡眠+0xe/0x20
[489.779518][]位锁定+0x5a/0xc0上的等待
[  489.779522]  [] ? 查找页面+0xca/0x150
[489.779526][]锁定页面+0x67/0x70
[  489.779531]  [] ? 自动删除唤醒功能+0x40/0x40
[489.779536][]截断索引节点页面范围+0x4b2/0x4c0
[489.779540][]截断索引节点页面+0x15/0x20
[489.779545][]杀死bdev+0x2c/0x40
[489.779548][]blkdev put+0x71/0x1c0
[  489.779552]  [] ? __d_自由+0x48/0x70
[489.779556][]blkdev_put+0x5b/0x160
[489.779559][]blkdev_关闭+0x25/0x30
[489.779564][]\uuu fput+0xba/0x240
[489.779568][]输出+0xe/0x10
[489.779572][]任务工作运行+0xc8/0xf0
[489.779577][]不退出+0x2c7/0xa70
[  489.779581]  [] ? 发送信号信息+0x1e/0x20
[  489.779585]  [] ? 发送信号+0x1c/0x20
[489.779588][]do_组_出口+0x44/0xa0
[489.779592][]获取信号以发送+0x230/0x600
[489.779600][]do_信号+0x58/0x8e0
[489.779605][]是否通知恢复+0x80/0xc0
[489.779608][]输入信号+0x12/0x17

我在套接字周围执行了错误的同步。这意味着一些竞争条件导致一些请求没有得到服务。那些未送达的请求导致进程挂起


添加一些互斥锁(而不是信号量)解决了这一问题。

在处理网络时,您肯定会认为这是一种可能性,但如果您看到的事件是出于合法原因,或者是由于实现/配置错误,则这是一个悬而未决的问题。驱动程序成功读取了多个块(我没有试图计算出有多少个)。但它在某一点停止。我确信这是我做的不好的事情。当它尝试只读取一个块时,它成功地做到了。它只有在尝试读取多个块时才会挂起(121)设备中的顺序块。从外观上看。看起来我的锁有问题。但我不确定是什么问题。你能通过伪造部分(如网络)来解决问题,看看是否只有块设备端存在问题吗?嗯,是的。我基本上在这里修改了ram磁盘驱动程序:<>。ram磁盘但是,当我将网络部分添加到它时,我遇到了许多问题。我将在另一条评论中发送链接到我的代码。