static page *__rmqueue(zone *zone, byte order) { free_area *area; byte current_order; page * page; for (current_order = order; current_order < MAX_ORDER; ++current_order) { area = zone->Free_area + current_order; if (list_empty(&area->Free_list)) { continue; } //page = list_entry(area->free_list.next, page, lru); page = list_entry__1(area->Free_list.Next); list_del(&page->Lru); rmv_page_order(page); area->Nr_free--; zone->Free_pages -= 1UL << order; return(expand(zone, page, order, current_order, area)); } return(null); }
static page *expand(zone *zone, page *page, int low, int high, free_area *area) { uint size = (uint)1 << (byte)high; while (high > low) { area--; high--; size >>= 1; //BUG_ON(bad_range(zone, &page[size])); list_add(&page[size].Lru, &area->Free_list); area->Nr_free++; set_page_order(&page[size], high); } return(page); }
static page *buffered_rmqueue(zone *zone, int order, int gfp_flags) { ulong flags; page *page = null; //int cold = !!(gfp_flags & __GFP_COLD); //if (order == 0) //{ // per_cpu_pages* pcp; // pcp = &zone->pageset[get_cpu()].pcp[cold]; // local_irq_save(flags); // if (pcp->count <= pcp->low) // pcp->count += rmqueue_bulk(zone, 0, // pcp->batch, &pcp->list); // if (pcp->count) // { // page = list_entry(pcp->list.next, page, lru); // list_del(&page->lru); // pcp->count--; // } // local_irq_restore(flags); // put_cpu(); //} //if (page == null) //{ // //spin_lock_irqsave(&zone->lock_, flags); // page = __rmqueue(zone, order); // //spin_unlock_irqrestore(&zone->lock_, flags); //} //if (page != null) //{ // BUG_ON(bad_range(zone, page)); // //mod_page_state_zone(zone, pgalloc, 1 << order); // prep_new_page(page, order); // if (gfp_flags & __GFP_ZERO) // prep_zero_page(page, order, gfp_flags); // if (order && (gfp_flags & __GFP_COMP)) // prep_compound_page(page, order); //} return(page); }