//调用路径:ip_defrag->ip_evictor
// 分片重组时,可使用内存上下限:
// 1.sysctl_ipfrag_high_thresh 可用内存上限
// 2.sysctl_ipfrag_low_thresh 内存超过上限后,需要释放内存到此限
1.1 static void ip_evictor(void)
{
struct ipq *qp;
struct list_head *tmp;
int work;
//计算需要释放的内存
work = atomic_read(&ip_frag_mem) - sysctl_ipfrag_low_thresh;
if (work <= 0)
return; while (work > 0) {
read_lock(&ipfrag_lock);
if (list_empty(&ipq_lru_list)) {//最近最久没有没有被使用的链表,链表头的ipq最久没有被使用
read_unlock(&ipfrag_lock);
return;
}
//在获取锁的情况下,释放ipq
tmp = ipq_lru_list.next;
qp = list_entry(tmp, struct ipq, lru_list);
atomic_inc(&qp->refcnt);//增加ipq的引用计数,防止其突然消失
read_unlock(&ipfrag_lock); spin_lock(&qp->lock);
if (!(qp->last_in&COMPLETE))//ipq没有接收完全
ipq_kill(qp);//
spin_unlock(&qp->lock); ipq_put(qp, &work);
IP_INC_STATS_BH(IPSTATS_MIB_REASMFAILS);
}
}
//调用路径:ip_evictor->ipq_kill
1.2 static void ipq_kill(struct ipq *ipq)
{
if (del_timer(&ipq->timer))//删除ipq的定时器
atomic_dec(&ipq->refcnt);//递减定时器持有的引用计数 if (!(ipq->last_in & COMPLETE)) {//ipq没有接收完全
ipq_unlink(ipq);//将ipq从ipq hash表bucket的链表上摘下来
atomic_dec(&ipq->refcnt);//递减ipq hash表bucket对其持有的引用计数
ipq->last_in |= COMPLETE;//标记ipq接收完全,防止其被更新
}
} 1.3 static __inline__ void ipq_put(struct ipq *ipq, int *work)
{
if (atomic_dec_and_test(&ipq->refcnt))//递减在ip_evictor中对ipq的引用
ip_frag_destroy(ipq, work);//释放关联到此ipq的skb
} 1.4 static void ip_frag_destroy(struct ipq *qp, int *work)
{
struct sk_buff *fp;
//此ipq接收到的所有分片
fp = qp->fragments;
while (fp) {
struct sk_buff *xp = fp->next; frag_kfree_skb(fp, work);//释放skb,从work中减去此skb的大小
fp = xp;
} frag_free_queue(qp, work);//释放ipq结构
}

最新文章

  1. oracle日常——sqlplus客户端登录
  2. C语言实现的Web服务器(转-kungstriving)
  3. github心得
  4. Nginx 安装编译配置
  5. carryLess开发日记_2017-05-18
  6. js复制内容到剪贴板
  7. POSIX Timer
  8. Linux 系统安装
  9. android 软键盘自动弹出和关闭
  10. Scala枚举--Enumeration
  11. PHP框架CI CodeIgniter 的log_message开启日志记录方法
  12. 腾讯 深圳 25928-PHP开发工程师(深圳)
  13. 关于virgo-tomcat-server-3.6.0.RELEASE配置文件修改说明
  14. SublimeText3 插件的使用和本身的配置
  15. input 拍照上传
  16. c语言学习笔记.数组.
  17. Python Tornado框架(TCP层)
  18. 怎样下载YouTube 4K视频
  19. django 删除表后如何恢复
  20. handlebars.js基础学习笔记

热门文章

  1. android完全退出应用程序
  2. 为初学者写ORM,ORM的原理及测试案例
  3. LA 3485 (积分 辛普森自适应法) Bridge
  4. HDU 4746 (莫比乌斯反演) Mophues
  5. POJ 3211 (分组01背包) Washing Clothes
  6. session服务器Nginx+Tomcat+Memcached集群Session共享
  7. 不同语言的Unix时间戳
  8. [Everyday Mathematics]20150105
  9. Mobile testing基础之签名
  10. [selenium webdriver Java]元素定位——findElement/findElements