当我与客户保持联系时,我会收到每个客户的报告。一段时间后,程序崩溃,我收到一条错误消息:
skb分配失败。
我该怎么办?
答案 0 :(得分:0)
您提供的信息太不完整,无法预测任何内容。但是,网络套接字的主要问题仍然在于缓冲区分配。 skbuffs
是Linux内核处理网络数据包的缓冲区。当您与客户端保持连接并接收数据包时,内部数据包将由网卡接收,填充到skbuff
并传递到网络堆栈。
查看alloc_skb()
返回的内容。阅读手册页以了解如果alloc_skb()
返回NULL,则没有内存可以分配您想要的块。这可能是分配失败的情况之一。
顺便说一句,希望你在中断的基础上开车。 alloc_skb()
的手册页说,
只能使用GFP_ATOMIC的gfp_mask从中断分配缓冲区。
无论内存情况如何,交付数据的最佳选择是中断处理程序。可以在加载驱动程序时创建skb列表。并且,在中断期间,执行alloc_skb
,如果失败,您可以始终使用一个预分配的缓冲区(如果有的话)来保存数据。对于下一个中断事件,请补充缓冲区。