手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux Slab分配器(五)--释放对象

[日期:2012-06-18] 来源:Linux社区  作者:t0nsha [字体: ]
  1. static void free_block(struct kmem_cache *cachep, void **objpp, int nr_objects,  
  2.                int node)  
  3. {  
  4.     int i;  
  5.     struct kmem_list3 *l3;  
  6.   
  7.     for (i = 0; i < nr_objects; i++) {  
  8.         void *objp = objpp[i];  
  9.         struct slab *slabp;  
  10.   
  11.         /*通过对象的虚拟地址得到slab描述符*/  
  12.         slabp = virt_to_slab(objp);  
  13.           
  14.         /*获取kmem_list3*/  
  15.         l3 = cachep->nodelists[node];  
  16.           
  17.         /*先将slab从所在链表中删除*/  
  18.         list_del(&slabp->list);  
  19.         check_spinlock_acquired_node(cachep, node);  
  20.         check_slabp(cachep, slabp);  
  21.           
  22.         /*将一个对象放回slab上*/  
  23.         slab_put_obj(cachep, slabp, objp, node);  
  24.         STATS_DEC_ACTIVE(cachep);  
  25.           
  26.         /*kmem_list3中的空闲对象数加1*/  
  27.         l3->free_objects++;  
  28.         check_slabp(cachep, slabp);  
  29.   
  30.         /* fixup slab chains */  
  31.         /*slab的对象全部空闲*/  
  32.         if (slabp->inuse == 0) {  
  33.             /*如果空闲对象数大于了空闲对象上限*/  
  34.             if (l3->free_objects > l3->free_limit) {  
  35.                 /*总空闲对象数减去一个slab的对象数*/  
  36.                 l3->free_objects -= cachep->num;  
  37.                 /* No need to drop any previously held 
  38.                  * lock here, even if we have a off-slab slab 
  39.                  * descriptor it is guaranteed to come from 
  40.                  * a different cache, refer to comments before 
  41.                  * alloc_slabmgmt. 
  42.                  */  
  43.                  /*销毁该slab*/  
  44.                 slab_destroy(cachep, slabp);  
  45.             } else {  
  46.                 /*将该slab添加到free链表*/  
  47.                 list_add(&slabp->list, &l3->slabs_free);  
  48.             }  
  49.         } else {/*否则添加到partial链表*/  
  50.             /* Unconditionally move a slab to the end of the 
  51.              * partial list on free - maximum time for the 
  52.              * other objects to be freed, too. 
  53.              */  
  54.             list_add_tail(&slabp->list, &l3->slabs_partial);  
  55.         }  
  56.     }  
  57. }  
linux
相关资讯       Linux内存管理 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款