Jacob_linux 发表于 2016-07-04 15:32

Netfilter hook函数中使用等待队列问题?

在Netfilter hook函数中, 将消息通过netlink 发送到用户层,然后使用等待队列wait_event_timeout等待指定时间,用户层收到信息后通过netlink发送消息,内核接收到消息后调用wake_up**,但是当hook函数返回NF_DROP时候会出现 BUG: scheduling while atomic,有时还会死机。急!!!求指教

Godbach 发表于 2016-07-05 08:42

回复 1# Jacob_linux
详细的 BUG 信息就是这个吗。你在用户态处理报文需要多久。

   

Jacob_linux 发表于 2016-07-05 10:06

回复 2# Godbach

Jul4 17:31:41 jager kernel: BUG: scheduling while atomic: swapper/0/0x10000100
Jul4 17:31:41 jager kernel: Modules linked in: anetctl(U) autofs4 sunrpc 8021q garp stp llc ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 fuse vmhgfs(U) vsock(U) snd_ens1371 snd_rawmidi snd_ac97_codec ac97_bus snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc e1000 sg microcode vmware_balloon vmci(U) i2c_piix4 i2c_core shpchp uinput ext4 mbcache jbd2 sd_mod crc_t10dif sr_mod cdrom mptspi mptscsih mptbase scsi_transport_spi pata_acpi ata_generic ata_piix dm_mirror dm_region_hash dm_log dm_mod
Jul4 17:31:41 jager kernel: CPU 0
Jul4 17:31:41 jager kernel: Modules linked in: anetctl(U) autofs4 sunrpc 8021q garp stp llc ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 iptable_filter ip_tables ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 xt_state nf_conntrack ip6table_filter ip6_tables ipv6 fuse vmhgfs(U) vsock(U) snd_ens1371 snd_rawmidi snd_ac97_codec ac97_bus snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc e1000 sg microcode vmware_balloon vmci(U) i2c_piix4 i2c_core shpchp uinput ext4 mbcache jbd2 sd_mod crc_t10dif sr_mod cdrom mptspi mptscsih mptbase scsi_transport_spi pata_acpi ata_generic ata_piix dm_mirror dm_region_hash dm_log dm_mod
Jul4 17:31:41 jager kernel:
Jul4 17:31:41 jager kernel: Pid: 0, comm: swapper Not tainted 2.6.32-358.11.1.2.ky3.1.x86_64 #1 VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform
Jul4 17:31:41 jager kernel: RIP: 0010:[<ffffffff8103b90b>][<ffffffff8103b90b>] native_safe_halt+0xb/0x10
Jul4 17:31:41 jager kernel: RSP: 0018:ffffffff81a01ec8EFLAGS: 00000246
Jul4 17:31:41 jager kernel: RAX: 0000000000000000 RBX: ffffffff81a01ec8 RCX: 0000000000000000
Jul4 17:31:41 jager kernel: RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffff825e1228
Jul4 17:31:41 jager kernel: RBP: ffffffff8100bb8e R08: 0000000000000000 R09: 0000000000000000
Jul4 17:31:41 jager kernel: R10: 0000031a501539e2 R11: 0000000000000000 R12: 0000000000000086
Jul4 17:31:41 jager kernel: R13: ffffffff81a01e38 R14: ffff880014a115e8 R15: ffffffff81a01e78
Jul4 17:31:41 jager kernel: FS:0000000000000000(0000) GS:ffff880014a00000(0000) knlGS:0000000000000000
Jul4 17:31:41 jager kernel: CS:0010 DS: 0018 ES: 0018 CR0: 000000008005003b
Jul4 17:31:41 jager kernel: CR2: 00007fe021c19000 CR3: 0000000037f98000 CR4: 00000000001407f0
Jul4 17:31:41 jager kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Jul4 17:31:41 jager kernel: DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Jul4 17:31:41 jager kernel: Process swapper (pid: 0, threadinfo ffffffff81a00000, task ffffffff81a8d020)
Jul4 17:31:41 jager kernel: Stack:
Jul4 17:31:41 jager kernel: ffffffff81a01ee8 ffffffff81014a3d ffffffff81a01fd8 ffffffff82407560
Jul4 17:31:41 jager kernel: <d> ffffffff81a01f18 ffffffff81009fc6 6db6db6db6db6db7 74f37c0561630b83
Jul4 17:31:41 jager kernel: <d> 0000000000000000 6db6db6db6db6db7 ffffffff81a01f28 ffffffff814f493a
Jul4 17:31:41 jager kernel: Call Trace:
Jul4 17:31:41 jager kernel: [<ffffffff81014a3d>] ? default_idle+0x4d/0xb0
Jul4 17:31:41 jager kernel: [<ffffffff81009fc6>] ? cpu_idle+0xb6/0x110
Jul4 17:31:41 jager kernel: [<ffffffff814f493a>] ? rest_init+0x7a/0x80
Jul4 17:31:41 jager kernel: [<ffffffff82427f7b>] ? start_kernel+0x424/0x430
Jul4 17:31:41 jager kernel: [<ffffffff8242733a>] ? x86_64_start_reservations+0x125/0x1

详细的信息, 我认为与用户态处理时间没有关系, 我正常ACCEPT 是没有问题的,DROP或者QUEUE ,才会出这些警告,网上说这种是在中断上下文中不可使用休眠类函数,那类似等待队列的延时机制都不可用吗?
   

GFree_Wind 发表于 2016-07-05 12:50

软中断里,就不能做这个“然后使用等待队列wait_event_timeout等待指定时间”。

错误信息已经很明显了。wait_event_timeout会被schedule,怎么能在atomic上下文做呢
页: [1]
查看完整版本: Netfilter hook函数中使用等待队列问题?