[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3 2/9] mm: Place unscrubbed pages at the end of pagelist



>> @@ -851,11 +867,14 @@ static int reserve_offlined_page(struct page_info 
>> *head)
>>      int zone = page_to_zone(head), i, head_order = PFN_ORDER(head), count = 
>> 0;
>>      struct page_info *cur_head;
>>      int cur_order;
>> +    bool need_scrub;
>>  
>>      ASSERT(spin_is_locked(&heap_lock));
>>  
>>      cur_head = head;
>>  
>> +    head->u.free.dirty_head = false;
>> +
>>      page_list_del(head, &heap(node, zone, head_order));
>>  
>>      while ( cur_head < (head + (1 << head_order)) )
>> @@ -892,8 +911,16 @@ static int reserve_offlined_page(struct page_info *head)
>>              {
>>              merge:
>>                  /* We don't consider merging outside the head_order. */
>> -                page_list_add_tail(cur_head, &heap(node, zone, cur_order));
>> -                PFN_ORDER(cur_head) = cur_order;
>> +
>> +                /* See if any of the pages need scrubbing. */
>> +                need_scrub = false;
>> +                for ( i = 0; i < (1 << cur_order); i++ )
>> +                    if ( test_bit(_PGC_need_scrub, &cur_head[i].count_info) 
>> )
>> +                    {
>> +                        need_scrub = true;
>> +                        break;
>> +                    }
>> +                page_list_add_scrub(cur_head, node, zone, cur_order, 
>> need_scrub);
> This thing with clearing dirty_head, then setting it again in
> page_list_add_scrub() could use some explanation -- either near one of
> these loops, or in mm.h preferrably.

This is done because we are merging/splitting buddies and dirty_head
should only be set on buddy's head. So we clear it before any such
operation and then, as we merge/split things, we see if there are any
dirty pages in the buddy. If there are, we set dirty_head.

I will add something.

(Note that at Jan's suggestion I will replace boolean dirty_head with an
int that hints where the first dirty page in the buddy is)

>
>
>>                  cur_head += (1 << cur_order);
>>                  break;
>>              }
>> @@ -922,10 +949,13 @@ static int reserve_offlined_page(struct page_info 
>> *head)
>>  /* Returns new buddy head. */
>>  static struct page_info *
>>  merge_and_free_buddy(struct page_info *pg, unsigned int node,
>> -                     unsigned int zone, unsigned int order)
>> +                     unsigned int zone, unsigned int order,
>> +                     bool need_scrub)
> What is the meaning of "need_scrub" here?  Does this mean that pg needs
> to be scrubbed?

It means that the buddy needs (or, more precisely, may need) scrubbing.


-boris

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.