嗯.... 我不确定你为什么要个人这样做。如果 alloc_skb() 返回 NULL,则没有内存来分配你想要的块。通常你会报告内存不足并丢弃数据。 当你将 skb 传递给 netif_rx 时,你实际上是在说“给你”。你不能期望回收缓冲区,因为它最终会被释放。 如果你必须尽最大努力传递数据,无论数据接收时(中断处理程序)的内存状况如何,我会在驱动程序加载时创建一个 skb 列表。然后在中断期间,尝试 alloc_skb,如果失败,则将数据放入预分配的缓冲区之一。然后在下一次中断发生时,尝试补充缓冲区池。 如果你到了 alloc_skb 失败且缓冲区池为空的地步,那么你基本上就完蛋了。 这将解决短期的内存不足情况,但如果你内存如此紧张,你可能只想 printk 一条消息说“多买点内存,小气鬼”或类似的话。 如果你足够聪明,你可以在中断时平衡缓冲区池,以确保你有足够的缓冲区来完成工作。如果你持续使用大量缓冲区,你可能需要动态增加缓冲区池中的缓冲区数量。如果你没有持续使用大量缓冲区,你可以动态减少数量。 仅供参考。
|