Chinaunix首页 | 论坛 | 博客
  • 博客访问: 612821
  • 博文数量: 113
  • 博客积分: 2554
  • 博客等级: 少校
  • 技术积分: 1428
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-21 19:53
文章分类

全部博文(113)

文章存档

2014年(1)

2013年(2)

2012年(94)

2011年(16)

分类: LINUX

2011-12-21 20:20:59

  1. static struct page * rmqueue(zone_t *zone, unsigned long order)
  2. {
  3.     free_area_t * area = zone->free_area + order;
  4.     unsigned long curr_order = order;
  5.     struct list_head *head, *curr;
  6.     unsigned long flags;
  7.     struct page *page;

  8.     spin_lock_irqsave(&zone->lock, flags);
  9.     do {
  10.         head = &area->free_list;
  11.         curr = memlist_next(head);

  12.         if (curr != head) {//不为空
  13.             unsigned int index;

  14.             page = memlist_entry(curr, struct page, list);//取得第一页
  15.             if (BAD_RANGE(zone,page))
  16.                 BUG();
  17.             memlist_del(curr);//删除第一页
  18.             index = (page - mem_map) - zone->offset;
  19.             MARK_USED(index, curr_order, area);
  20.             zone->free_pages -= 1 << order;//空闲页数减小

  21.             page = expand(zone, page, index, order, curr_order, area);
  22.             spin_unlock_irqrestore(&zone->lock, flags);

  23.             set_page_count(page, 1);
  24.             if (BAD_RANGE(zone,page))
  25.                 BUG();
  26.             DEBUG_ADD_PAGE
  27.             return page;    
  28.         }
  29.         curr_order++;
  30.         area++;
  31.     } while (curr_order < MAX_ORDER);
  32.     spin_unlock_irqrestore(&zone->lock, flags);

  33.     return NULL;
  34. }
阅读(1115) | 评论(0) | 转发(0) |
0

上一篇:expand函数

下一篇:buddy算法

给主人留下些什么吧!~~