一次内存调试过程(2)

  在monkey测试时,出现OOM情况,在OOM吐出的mem-info信息中slab SUnreclaim 并不多,只有300M左右。

但是系统确没有可分配内存,后来通过回退版本,发现是WIFI firmware提交导致。

继续跟踪slabinfo信息,发现skbuff_head_cache 一直在增加,查找skb的alloc_calls,发现WIFI驱动调用最多.


91376 __build_skb+0x44/0xac
[4]__build_skb+0x44/0xac
[5]__netdev_alloc_skb+0xf0/0x150
[6]osl_pktget+0xa0/0x10c
[7]dhd_msgbuf_rxbuf_post.isra.31+0x150/0x48c
[8]dhd_prot_rxcmplt_process+0x108/0x1e8
[9]dhd_prot_process_msgtype+0x134/0x1e8
[10]dhd_prot_process_msgbuf_rxcpl+0x90/0x118
[11]dhdpci_bus_read_frames.isra.20+0xa8/0xd4
[12]dhd_bus_dpc+0x238/0x2d8
[13]dhd_dpc+0x28/0x7c
[14]tasklet_action+0xec/0x184
[15]__do_softirq+0x288/0x5a4
 age=24/2561636/5602169 pid=0-27854 cpus=0,7

证明WIFI驱动申请的内存没有释放,继续查看__netdev_alloc_skb函数实现,发现可能会直接调用alloc_pages申请内存(所以在slab里面看不到内存泄露)

这个有两种情况: 1. len大于8k ,通过slab里面走alloc pages

2. len小于4k,且不是通过DMA,直接走alloc pages分配




猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/79869881