- 论坛徽章:
- 0
|
kernel version: 2.4.20
平时用arp -d删除一个确定以后没通信可能的arp条目时,该条目还存在hash表中,所以能在proc显示出来,只是flag有所改变,而MAC为0,而在ip neigh上却为真正的MAC。
anyway, 只好跟踪arp_ioctl:
case SIOCDARP:
err = arp_req_delete(&r, dev);
在arp_req_delete()里最后调用neigh_release();
static inline void neigh_release(struct neighbour *neigh)
{
if (atomic_dec_and_test(&neigh->refcnt))
neigh_destroy(neigh);
}
我在neigh_release()前printk出该refcnt还有3个,所以还不能立刻free掉内存。
究竟谁还在用,谁还有机会release呢?
大概跟踪主要有dst_entry路由cache。而neighbour的垃圾收集程序无论同步还是异步的都只能判断refcnt为1时才free内存,所以会有一种这样的情况:ping到一个无效的ip两次后,我用了arp -d后一直还存在,一直不在垃圾回收出现。
如果我想立刻使用arp -d就可以删除,请问有什么办法么,如果要修改内核,该如何入手?谢谢! |
|