コード例 #1
0
ファイル: EmptyClass.cs プロジェクト: arakis/abanu
        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);
        }
コード例 #2
0
ファイル: EmptyClass.cs プロジェクト: arakis/abanu
        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);
        }
コード例 #3
0
ファイル: EmptyClass.cs プロジェクト: arakis/abanu
        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);
        }