【发布时间】:2013-10-10 17:31:40
【问题描述】:
我正在尝试编写一个块设备驱动程序,该驱动程序可以从/向网络套接字读取/写入块。在某些时候,当读取多个块时,使用此驱动程序的应用程序似乎挂起(但仍会接受输入,即使它不执行任何操作)并且系统通常似乎响应。 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
【问题讨论】:
-
在处理网络时,您绝对应该期待这种可能性,尽管如果您看到的事件发生是出于正当原因,还是由于实施/配置错误,这是一个悬而未决的问题。跨度>
-
驱动程序成功读取了多个块(我没有尝试弄清楚有多少)。但它停在某一时刻。我确信这是我做的坏事。当它试图只读取一个块时,它就成功了。仅当它尝试读取设备中的几个 (121) 个连续块时才会挂起。
-
从外观上看。看起来我在锁上做错了什么。但我不确定它是什么。
-
您能否通过伪造部分问题(例如网络)来分解问题,看看问题是否仅存在于块设备端?
-
嗯,是的。我在这里基本上修改了 ram 磁盘驱动程序:linuxforu.com/2012/02/device-drivers-disk-on-ram-block-drivers>。 ram 磁盘可以工作,但是,当我将网络部分添加到它时,我遇到了很多问题。我将在另一条评论中将链接发送到我的代码。
标签: linux-kernel linux-device-driver