Linux 网络块设备-某些读取请求失败-内核OOPS

Linux 网络块设备-某些读取请求失败-内核OOPS,linux,networking,linux-kernel,filesystems,linux-device-driver,Linux,Networking,Linux Kernel,Filesystems,Linux Device Driver,我正在为基于网络的块设备编写驱动程序。相同的读取操作成功,但其他操作似乎无法生成此内核Oops: [ 170.289421] ------------[ cut here ]------------ [ 170.289424] Kernel BUG at ffffffff81330120 [verbose debug info unavailable] [ 170.289425] invalid opcode: 0000 [#14] SMP [ 170.289427] Modules

我正在为基于网络的块设备编写驱动程序。相同的读取操作成功,但其他操作似乎无法生成此内核Oops:

[  170.289421] ------------[ cut here ]------------
[  170.289424] Kernel BUG at ffffffff81330120 [verbose debug info unavailable]
[  170.289425] invalid opcode: 0000 [#14] SMP 
[  170.289427] Modules linked in: dor(OF) ksocket(OF) nls_utf8(F) isofs(F) snd_ens1371(F) gameport(F) snd_ac97_codec(F) coretemp(F) ghash_clmulni_intel(F) ac97_bus(F) cryptd(F) snd_pcm(F) snd_seq_midi(F) joydev(F) snd_rawmidi(F) snd_seq_midi_event(F) hid_generic(F) snd_seq(F) vmw_balloon(F) snd_timer(F) snd_seq_device(F) microcode(F) psmouse(F) serio_raw(F) vmwgfx(F) ttm(F) snd(F) drm(F) bnep(F) i2c_piix4(F) rfcomm(F) soundcore(F) bluetooth(F) snd_page_alloc(F) ppdev(F) parport_pc(F) usbhid(F) hid(F) shpchp(F) mac_hid(F) lp(F) parport(F) e1000(F) floppy(F) mptspi(F) mptscsih(F) mptbase(F)
[  170.289443] CPU 1 
[  170.289445] Pid: 2706, comm: read_thread Tainted: GF     D    O 3.8.0-29-generic #42~precise1-Ubuntu VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform
[  170.289447] RIP: 0010:[<ffffffff81330120>]  [<ffffffff81330120>] blk_finish_request+0xf0/0x100
[  170.289450] RSP: 0018:ffff88010787de58  EFLAGS: 00010216
[  170.289451] RAX: 0000000000000000 RBX: ffff8801282afdb0 RCX: ffffffffffffffff
[  170.289452] RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff8801282afdb0
[  170.289453] RBP: ffff88010787de68 R08: 000000000000007f R09: 0000000000000000
[  170.289454] R10: 000000000000004c R11: 0000000000000033 R12: 0000000000000000
[  170.289455] R13: ffffffffa02a62e0 R14: 0000000000000000 R15: 0000000000000000
[  170.289456] FS:  0000000000000000(0000) GS:ffff88013ae20000(0000) knlGS:0000000000000000
[  170.289458] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  170.289459] CR2: 00007f65ae3d7d7c CR3: 0000000001c0d000 CR4: 00000000001407e0
[  170.289481] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  170.289500] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[  170.289502] Process read_thread (pid: 2706, threadinfo ffff88010787c000, task ffff880136589740)
[  170.289503] Stack:
[  170.289504]  ffff8801282afdb0 0000000000000000 ffff88010787de88 ffffffff81331fe4
[  170.289507]  ffff88013675e740 ffff88013675e740 ffff88010787de98 ffffffff8133201f
[  170.289509]  ffff88010787deb8 ffffffffa02a630b ffff88013675e740 ffff880137cdf8e0
[  170.289511] Call Trace:
[  170.289514]  [<ffffffff81331fe4>] __blk_end_bidi_request+0x34/0x50
[  170.289516]  [<ffffffff8133201f>] __blk_end_request_all+0x1f/0x30
[  170.289519]  [<ffffffffa02a630b>] kThread_fun_read+0x2b/0x40 [dor]
[  170.289522]  [<ffffffff8107f1b0>] kthread+0xc0/0xd0
[  170.289524]  [<ffffffff8107f0f0>] ? flush_kthread_worker+0xb0/0xb0
[  170.289527]  [<ffffffff816fc82c>] ret_from_fork+0x7c/0xb0
[  170.289529]  [<ffffffff8107f0f0>] ? flush_kthread_worker+0xb0/0xb0
[  170.289530] Code: 89 de e8 44 2b 00 00 e9 4b ff ff ff 83 7b 44 01 0f 85 58 ff ff ff 48 8b 7b 38 48 81 c7 60 01 00 00 e8 35 05 e1 ff e9 43 ff ff ff <0f> 0b 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 
[  170.289553] RIP  [<ffffffff81330120>] blk_finish_request+0xf0/0x100
[  170.289555]  RSP <ffff88010787de58>
[  170.289557] ---[ end trace 697188dbdb5f7c34 ]---
[170.289421]--------[此处剪切]------------
[170.289424]ffffffff81330120处的内核错误[详细调试信息不可用]
[170.289425]无效操作码:0000[#14]SMP
【170.289427】模块链接的模块链接的模块链接的模块链接的模块链接的模块链接的模块的模块链接的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的模块的,单词的,单词的,单词的,单词的,单词的,单词的,单词的,单词的,单词的,单词的,单词的,单词的,单词,单词的,单词的,单词的,单词的,单词,单词的,单词的,单词,单词的,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词,单词F)微码(F)psmouse(F)原始语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音语音
[170.289443]中央处理器1
[170.289445]Pid:2706,comm:read_thread-Tainted:GF D O 3.8.0-29-generic#42~precise1 Ubuntu VMware,Inc.VMware虚拟平台/440BX桌面参考平台
[170.289447]RIP:0010:[]黑漆饰面请求+0xf0/0x100
[170.289450]RSP:0018:ffff88010787de58 EFLAGS:00010216
[170.289451]RAX:0000000000000000 RBX:FFFF88012AFDB0 RCX:FFFFFFFFFFFFFF
[170.289452]RDX:000000000000000 1 RSI:0000000000000000 RDI:FFFF88012AFDB0
[170.289453]RBP:ffff88010787de68 R08:00000000000000 7F R09:0000000000000000
[170.289454]R10:00000000000000 4C R11:00000000000000 33 R12:0000000000000000000000
[170.289455]R13:FFFFFFFF A02A62E0 R14:0000000000000000 R15:0000000000000000
[170.289456]FS:0000000000000000(0000)GS:ffff88013ae20000(0000)KNLG:0000000000000000
[170.289458]CS:0010 DS:0000 ES:0000 CR0:00000000 80050033
[170.289459]CR2:00007f65ae3d7d7c CR3:000000000 1C0D000 CR4:0000000000 1407E0
[170.289481]DR0:0000000000000000 DR1:0000000000000000 DR2:0000000000000000000000
[170.289500]DR3:0000000000000000 DR6:00000000 FFFF0FF0 DR7:00000000000000 400
[170.289502]进程读取线程(pid:2706,线程信息ffff88010787c000,任务ffff880136589740)
[170.289503]堆栈:
[170.289504]FF88012AFDB0 0000000000000000 FF88010787DE88 FFFFFFFF 81331FE4
[170.289507]ffff88013675e740 ffff88013675e740 ffff88010787de98 FFFFFFFFFF 8133201F
[170.289509]FF88010787DEB8 FFFFFFFFFFA02A630B ffff88013675e740 ffff880137cdf8e0
[170.289511]呼叫跟踪:
[170.289514][]最终投标申请+0x34/0x50
[170.289516][]blk\U end\U request\U all+0x1f/0x30
[170.289519][]kThread_fun_read+0x2b/0x40[dor]
[170.289522][]kthread+0xc0/0xd0
[  170.289524]  [] ? 刷新线程工作线程+0xb0/0xb0
[170.289527][]从货叉回收+0x7c/0xb0
[  170.289529]  [] ? 刷新线程工作线程+0xb0/0xb0
[170.289530]代码:89 de e8 44 2b 00 e9 4b ff ff ff 83 7b 44 01 0f 85 58 ff ff 48 8b 7b 38 48 81 c7 60 01 00 e8 35 05 e1 ff e9 43 ff ff ff 0b 66 66 66 2e 0f 1f 84 00 00 00 0f 1f 44 00 00 00 00
[170.289553]RIP[]黑色完成请求+0xf0/0x100
[170.289555]RSP
[170.289557]--[end trace 697188DB5F7C34]---
你知道如何解决这个问题吗? 我可以把代码发给任何愿意帮忙的人


提前谢谢

“无效操作码”通常意味着您在()上遇到了一个错误。因为这是在blk_finish_request()中,所以很可能是这一行:block/blk core.c(2111):BUG_ON(blk_queued_rq(req));--3.8.x内核的行号2458


也许blk_end_request_all()在这里不是正确的调用。其他驱动程序似乎在完成所有操作时都会使用它。查看lxr.free-electronics.com,了解它的常用方式。

无效操作码通常意味着你碰到了一个BUG。因为这是在blk_finish_request()中,所以很可能是这一行:block/blk core.c(2111):BUG_ON(blk_queued_rq(req));--3.8.x内核的第2458行。那么,它是在抱怨,因为请求没有从队列中删除?这就是我从宏/函数blk_queued_rq()中了解到的。看起来好像有一个请求排队,那么它就是一个bug。该队列周围应该有一个锁。为了验证,您可以在BUG_ON()之前和之后放置一些调试喷发。可能blk_end_request_all()在这里不是正确的调用。其他驱动程序似乎在完成所有操作时都会使用它。看看它是如何被普遍使用的。你是对的。。。我将其更改为blk_end_request_cur(),Oops消失了!非常感谢你!像你这样的好人让生活更轻松!
static void blk_finish_request(struct request *req, int error)
{
        if (blk_rq_tagged(req))
                blk_queue_end_tag(req->q, req);

        BUG_ON(blk_queued_rq(req));

        if (unlikely(laptop_mode) && blk_fs_request(req))
                laptop_io_completion();

        blk_delete_timer(req);

        blk_account_io_done(req);

        if (req->end_io)
                req->end_io(req, error);
        else {
                if (blk_bidi_rq(req))
                        __blk_put_request(req->next_rq->q, req->next_rq);

                __blk_put_request(req->q, req);
        }
}