返回信息流系统环境:
目标机CPU是PPC405EP 内核版本:2.6.13
宿主机采用Linux+ELDK
问题:
交换芯片的驱动程序,目前模块的加载卸载(insmod/rmmod)、端口的启用禁用(up/down)都OK,中断处理函数也能被正常触发并执行。
但是,收到以太网包准备上交到操作系统协议栈的时候发生panic
更新:目前修改代码后不在发生panic,但是不知道报文交到上面没有。修改详细内容见1楼
问题描述:
问题的核心就是skb,目前好像有两种情况会发生panic:
一、skb_put时发生skb_over_panic;
二、中断处理函数已经执行完毕(通过printf已经判断要return了,不过发生panic时具体return没有不得而知。),但是在skb_realese时候发生错误,这部分好像是OS在做处理,已经不是驱动能够控制的了;
这部分主要的代码:(中断处理函数内的代码)
skb = dev_alloc_skb(pkt->data_len + 2);
if(NULL == skb)
{
printk(KERN_EMERG "VSC7398_rx: low on mem");
priv->stats.rx_dropped++;
goto out;
}
memcpy(skb_put(skb, pkt->data_len), pkt->data, pkt->data_len);
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
skb->ip_summed = CHECKSUM_UNNECESSARY;
priv->stats.rx_packets++;
priv->stats.rx_bytes += pkt->data_len;
ret = netif_rx(skb);
运行打印
Oops: kernel access of bad area, sig: 11 [#1]
NIP: C012E910 LR: C012ED50 SP: C7E67BF0 REGS: c7e67b40 TRAP: 0300 Not tainted
MSR: 00029030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: FFFFFFFF, DSISR: 00000000
TASK = c7d3d090[24] 'exe' THREAD: c7e66000
Last syscall: 54
GPR00: FFFFFFFF C7E67BF0 C7D3D090 FFFFFFFF C0371800 C7CAB800 C7CC42C8 C0220000
GPR08: C7E66000 C7CB3962 00000000 C7CB3962 24020022 100EC6B0 07FF5A00 00000001
GPR16: 00000001 07FF868C 00000000 FFFFFFFF 07F8D5D0 00000002 C01D0000 C0228D6C
GPR24: FFFB9C2B C7E67C88 00000040 C7CEA280 0000CCD0 FFFFFFFF C7CEA200 00000000
NIP [c012e910] skb_release_data+0x7c/0x10c
LR [c012ed50] kfree_skbmem+0x18/0x3c
Call trace:
[c012ed50] kfree_skbmem+0x18/0x3c
[c013585c] netif_receive_skb+0x26c/0x2ac
[c0135940] process_backlog+0xa4/0x18c
[c0133178] net_rx_action+0x98/0x19c
[c001c5e8] __do_softirq+0x7c/0x114
[c001c6d8] do_softirq+0x58/0x5c
[c0004528] do_IRQ+0x7c/0x90
[c0003370] ret_from_except+0x0/0x18
[c0004d8c] __delay+0xc/0x14
[c0133e58] dev_open+0x84/0xd8
[c0132b84] dev_change_flags+0x130/0x15c
[c01714e8] devinet_ioctl+0x694/0x778
[c0171890] inet_ioctl+0xec/0x120
[c0128d54] sock_ioctl+0x12c/0x318
[c006d174] do_ioctl+0x38/0x84
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #3399同步于 2008/12/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
【求助】交换芯片驱动程序报错
hobby
2008/12/29镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
更新下,目前对代码做了如下修改,死机的情况是没有了,不过不知道报文到底上去了没有。
原来的代码:
skb = dev_alloc_skb(pkt->data_len + 2);
if(NULL == skb)
{
printk(KERN_EMERG "VSC7398_rx: low on mem");
priv->stats.rx_dropped++;
goto out;
}
memcpy(skb_put(skb, pkt->data_len), pkt->data, pkt->data_len);
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
skb->ip_summed = CHECKSUM_UNNECESSARY;
priv->stats.rx_packets++;
priv->stats.rx_bytes += pkt->data_len;
ret = netif_rx(skb);
改后的代码:
alloc_skb(pkt->data_len + 2, GFP_ATOMIC);
if(NULL == skb)
{
printk(KERN_EMERG "VSC7398_rx: low on mem");
priv->stats.rx_dropped++;
goto out;
}
memcpy(skb->data, pkt->data, pkt->data_len);
skb->len += pkt->data_len;
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
skb->ip_summed = CHECKSUM_UNNECESSARY;
priv->stats.rx_packets++;
priv->stats.rx_bytes += pkt->data_len;
ret = netif_rx(skb);