funtasty 发表于 2015-01-08 14:46

网卡通信问题请问各位大牛

小弟有一款cavium板子,5020, 上面的网卡其中千兆的线由于主板设计问题不能连接。板子应可用100M或者10M连接。
但是当两台这样的机器对接的时候,发现连接不上,网口灯不亮。但是将一台板子里面的自协商关闭之后网口灯点亮,网络连接。
连接速率显示100M全双工。
但当这样对接之后,使用bw进行性能测试时, 关闭自协商的那台机器会panic,信息如下:
/ # Port 1 receive error code 6, packet dropped
Port 1 receive error code 6, packet dropped
Port 1 receive error code 6, packet dropped
CPU 0 Unable to handle kernel paging request at virtual address 0000000000000000, epc == ffffffff8138e0c4, ra == ffffffff8138e988
Oops[#1]:
Cpu 0
$ 0   : 0000000000000000 0000000000000008 0000000000000000 0000000000000000
$ 4   : a80000000db62a80 0000000000000040 0000000000000040 ffffffff8189f168
$ 8   : 0000000000000000 0000000000000000 ffffffff81482ac8 0000000000000000
$12   : 0000000000000010 ffffffff81105a74 a80000000f850000 0000000000000000
$16   : 0000000000000000 a800000002688ed8 a800000002688ee0 00000000ffffd08a
$20   : 0000000000000040 ffffffff818a0000 a800000002688f10 ffffffff818a0000
$24   : 0000000000000006 0000000000000000                                 
$28   : ffffffff81898000 ffffffff8189bb70 ffffffff821ee6a0 ffffffff8138e988
Hi    : 00000000000000cc
Lo    : fffffffff070e000
epc   : ffffffff8138e0c4 process_backlog+0x94/0x108
    Not tainted
ra    : ffffffff8138e988 net_rx_action+0x118/0x220
Status: 1000cce2    KX SX UX KERNEL EXL
Cause : 0080000c
BadVA : 0000000000000000
PrId: 000d0601 (Cavium Octeon+)
Modules linked in: crypto_null authenc ebt_redirect ebtable_broute ebtables xt_comment xt_state iptable_nat nf_nat nf_conntrack_ipv4 nf_conntrack nf_defrag_ipv4 alg_init pcie_ssx06 octeon_gpio xfrm_user esp4
Process swapper (pid: 0, threadinfo=ffffffff81898000, task=ffffffff818a6880, tls=0000000000000000)
Stack : 0000000000000040 a800000002688f10 0000000000000006 0000000000000126
      a800000002688ed8 a800000002688ef8 00000000ffffd08b ffffffff8138e988
      0000000000000001 ffffffff8189c798 0000000000000018 0000000000000100
      0000000000000003 000000000000000a ffffffff821af1d0 ffffffff821ee6a0
      0000000000000000 ffffffff81158d1c 0000000000000000 8001070000000218
      8001070000000200 8001070000000000 8001070000000108 ffffffff821d0000
      0000000000000005 ffffffffc0103ca0 0000000000000000 ffffffff81158dd8
      0000000000000027 ffffffff8110c460 ffffffff821d0000 0000000000000000
      0000000000000001 ffffffff821d0000 ffffffff821d0000 ffffffff81105bd0
      0000000000000005 ffffffff81100888 0000000000000000 ffffffff821d0000
      ...
Call Trace:
[<ffffffff8138e0c4>] process_backlog+0x94/0x108
[<ffffffff8138e988>] net_rx_action+0x118/0x220
[<ffffffff81158d1c>] __do_softirq+0x154/0x1a0
[<ffffffff81158dd8>] do_softirq+0x70/0x78
[<ffffffff8110c460>] plat_irq_dispatch+0xd8/0x158
[<ffffffff81100888>] ret_from_irq+0x0/0x4
[<ffffffff81100a80>] r4k_wait+0x20/0x40
[<ffffffff81129d2c>] cpu_idle+0x74/0x90
[<ffffffff818d7aa4>] start_kernel+0x3bc/0x41c


Code: dc820008fc800000fc800008 <fc430000> fc620008416060200c4e36ca261000010214182a
Disabling lock debugging due to kernel taint
Kernel panic - not syncing: Fatal exception in interrupt

求达人解答。

gaojl0728 发表于 2015-01-08 16:01

这个问题应该比较容易定位, 是空指针访问,

你用gdb反汇编下 process_backlog+0x94/0x108看是在哪一行触发的空指针访问,

然后把process_backlog的代码贴上来看看。

gaojl0728 发表于 2015-01-08 16:25

大概推断的话, 应该是网卡驱动有bug导致的空指针访问,
网卡驱动收到报文之后会把skb放到中断底半步也就是backlog里面慢速处理, 这里skb内存指向网卡硬件的内存,
因为底半步执行的时候是开中断的,网卡还能继续收包,但是后面收到的报文出错了, 网卡硬件把内存暴力清空了, 这就导致backlog里面放的skb 无效了, 但是backlog 不知道(不同的上下文)还在继续处理,结果就访问到空指针了。

我手上只有linux 3.15.5的代码, 3.15.5的代码已经不一样了, 3.15.5的skb不放在backlog里面处理, 用的是NAPI直接在网卡的接收中断里处理报文,应该没有这个问题。

funtasty 发表于 2015-01-08 16:33

回复 3# gaojl0728
解释的太清楚了, 多谢多谢。

   
页: [1]
查看完整版本: 网卡通信问题请问各位大牛