Chinaunix首页 | 论坛 | 博客
  • 博客访问: 790162
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类: LINUX

2014-02-12 15:50:28

转:http://blog.csdn.net/nerdx/article/details/12656699
  1. //调用路径:ip_defrag->ip_evictor  
  2. //  分片重组时,可使用内存上下限:  
  3. //      1.sysctl_ipfrag_high_thresh 可用内存上限  
  4. //      2.sysctl_ipfrag_low_thresh 内存超过上限后,需要释放内存到此限  
  5. 1.1 static void ip_evictor(void)  
  6. {  
  7.     struct ipq *qp;  
  8.     struct list_head *tmp;  
  9.     int work;  
  10.     //计算需要释放的内存  
  11.     work = atomic_read(&ip_frag_mem) - sysctl_ipfrag_low_thresh;  
  12.     if (work <= 0)  
  13.         return;  
  14.   
  15.     while (work > 0) {  
  16.         read_lock(&ipfrag_lock);  
  17.         if (list_empty(&ipq_lru_list)) {//最近最久没有没有被使用的链表,链表头的ipq最久没有被使用  
  18.             read_unlock(&ipfrag_lock);  
  19.             return;  
  20.         }  
  21.         //在获取锁的情况下,释放ipq  
  22.         tmp = ipq_lru_list.next;  
  23.         qp = list_entry(tmp, struct ipq, lru_list);  
  24.         atomic_inc(&qp->refcnt);//增加ipq的引用计数,防止其突然消失  
  25.         read_unlock(&ipfrag_lock);  
  26.   
  27.         spin_lock(&qp->lock);  
  28.         if (!(qp->last_in&COMPLETE))//ipq没有接收完全  
  29.             ipq_kill(qp);//  
  30.         spin_unlock(&qp->lock);  
  31.   
  32.         ipq_put(qp, &work);  
  33.         IP_INC_STATS_BH(IPSTATS_MIB_REASMFAILS);  
  34.     }  
  35. }  
  36. //调用路径:ip_evictor->ipq_kill  
  37. 1.2 static void ipq_kill(struct ipq *ipq)  
  38. {  
  39.     if (del_timer(&ipq->timer))//删除ipq的定时器  
  40.         atomic_dec(&ipq->refcnt);//递减定时器持有的引用计数  
  41.   
  42.     if (!(ipq->last_in & COMPLETE)) {//ipq没有接收完全  
  43.         ipq_unlink(ipq);//将ipq从ipq hash表bucket的链表上摘下来  
  44.         atomic_dec(&ipq->refcnt);//递减ipq hash表bucket对其持有的引用计数  
  45.         ipq->last_in |= COMPLETE;//标记ipq接收完全,防止其被更新  
  46.     }  
  47. }  
  48.   
  49. 1.3 static __inline__ void ipq_put(struct ipq *ipq, int *work)  
  50. {  
  51.     if (atomic_dec_and_test(&ipq->refcnt))//递减在ip_evictor中对ipq的引用  
  52.         ip_frag_destroy(ipq, work);//释放关联到此ipq的skb  
  53. }  
  54.   
  55. 1.4 static void ip_frag_destroy(struct ipq *qp, int *work)  
  56. {  
  57.     struct sk_buff *fp;  
  58.     //此ipq接收到的所有分片  
  59.     fp = qp->fragments;  
  60.     while (fp) {  
  61.         struct sk_buff *xp = fp->next;  
  62.   
  63.         frag_kfree_skb(fp, work);//释放skb,从work中减去此skb的大小  
  64.         fp = xp;  
  65.     }  
  66.   
  67.     frag_free_queue(qp, work);//释放ipq结构  
  68. }  
阅读(739) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~