- 论坛徽章:
- 9
|
释放一个 page 回伙伴系统
void TestCase_free_page(void)
{
struct page *page = /* 已知*/;
struct zone *zone;
struct page *buddy;
unsigned long page_idx,buddy_idx;
unsigned long combine_idx;
int order = 0;
zone = page_zone(page);
migratetype = get_pageblock_migratetype(page);
page_idx = page_to_pfn(page);
while(order < MAX_ORDER -1) {
buddy_idx = __find_buddy_index(page_idx,order);
buddy = page + (buddy_idx - page_idx);
if(!page_is_buddy(page,buddy,order))
break;
list_del(&buddy.lru);
rmv_page_order(buddy);
zone->free_area[order].nr_free--;
combine_idx = buddy_idx & page_idx;
page = page + (combine_idx - page_idx);
page_idx = combine_idx;
order++;
}
set_page_order(page,order);
if((order < MAX_ORDER - 2) && (pfn_valid_within(page_to_pfn(page)))) {
struct page *higher_page,*higher_buddy;
combine_idx = buddy_idx & page_idx;
higher_page = page + (combine_idx - page_idx);
buddy_idx = __find_buddy_index(combine_idx,order + 1);
higher_buddy = higher_page + (buddy_idx - combine_idx);
if(page_is_buddy(higher_page,higher_buddy,order + 1)) {
list_add_tail(&page->lru,
&zone->free_area[order].free_list[migratetype]);
goto out;
}
}
list_add(&page->lru,
&zone->free_area[order].free_list[migratetype]);
out:
zone->free_area[order].nr_free++;
} |
|