2

我正在尝试编写一个块设备驱动程序,该驱动程序从/向网络套接字读取/写入块。在某些时候,当读取多个块时,使用此驱动程序的应用程序似乎挂起(但仍会接受输入,即使它什么都不做)并且系统通常似乎响应。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
4

1 回答 1

0

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

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

于 2013-10-16T17:47:43.707 回答