[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/4] xen: introduce an "scrub" free page list
>>> On 17.06.14 at 13:49, <lliubbo@xxxxxxxxx> wrote: > Because of page scrubbing, it's very slow to destroy a domain with large > memory. > It takes around 10 minutes when destroy a guest of nearly 1 TB of memory. > > This patch introduced a "scrub" free page list, pages on this list need to be > scrubbed before use. During domain destory just mark pages "PGC_need_scrub" > and then add them to this list, so that xl can return quickly. > > In alloc_domheap_pages(): > - If there are pages on the normal "heap" freelist, allocate them. > - Try to allocate from the "scrub" free list with the same order and do > scrubbing synchronously. > > In order to not fail high order allocate request, merge page trunks for > PGC_need_scrub pages. > Note: PCG_need_scrub pages and normal pages are not mergeable The whole series needs sync-ing logically both with Konrad's recent boot time scrubbing changes (this change here really makes his change unnecessary - the affected pages could quite well be simply marked as needing scrubbing, getting dealt with by the logic added here) and with XSA-100's change. > @@ -629,8 +632,24 @@ static struct page_info *alloc_heap_pages( > > /* Find smallest order which can satisfy the request. */ > for ( j = order; j <= MAX_ORDER; j++ ) > + { > if ( (pg = page_list_remove_head(&heap(node, zone, j))) ) > goto found; > + > + /* Try to scrub a page directly */ > + if ( (pg = page_list_remove_head(&scrub(node, zone, j))) ) > + { > + for ( i = 0; i < (1 << j); i++ ) Definitely not: You may have found a 4Tb chunk for a request of a single page. You don't want to scrub all 4Tb in that case. I think this needs to be put after the "found" label. Which raises the question on the need for separate _heap[] and _scrub[] - if chunks with different PGC_need_scrub flags aren't mergeable, why do you need separate arrays? > + { > + if ( test_bit(_PGC_need_scrub, &(pg[i].count_info)) ) Please no pointless and inconsistent (with surrounding code) parentheses. > + { > + scrub_one_page(&pg[i]); > + pg[i].count_info &= ~(PGC_need_scrub); Again. > + } Hard tabs (also further down). > @@ -859,6 +878,22 @@ static void free_heap_pages( > midsize_alloc_zone_pages = max( > midsize_alloc_zone_pages, total_avail_pages / > MIDSIZE_ALLOC_FRAC); > > + if ( need_scrub ) > + { > + /* Specail for tainted case */ > + if ( tainted ) > + { > + for ( i = 0; i < (1 << order); i++ ) > + scrub_one_page(&pg[i]); Are you trying to provoke another #MC for pages that got offlined? Just avoid setting PGC_need_scrub in this case and you're done. > @@ -1250,6 +1320,11 @@ void __init end_boot_allocator(void) > #endif > } > > + for ( i = 0; i < MAX_NUMNODES; i++ ) > + for ( j = 0; j < NR_ZONES; j++ ) > + for ( order = 0; order <= MAX_ORDER; order++ ) > + INIT_PAGE_LIST_HEAD(&scrub(i, j, order)); > + Why is this not being done alongside the setting up of _heap[]? > @@ -1564,22 +1639,21 @@ void free_domheap_pages(struct page_info *pg, > unsigned int order) > * domain has died we assume responsibility for erasure. > */ > if ( unlikely(d->is_dying) ) > - for ( i = 0; i < (1 << order); i++ ) > - scrub_one_page(&pg[i]); > - > - free_heap_pages(pg, order); > + free_heap_pages(pg, order, 1); > + else > + free_heap_pages(pg, order, 0); > } > else if ( unlikely(d == dom_cow) ) > { > ASSERT(order == 0); > scrub_one_page(pg); > - free_heap_pages(pg, 0); > + free_heap_pages(pg, 0, 0); Is there a particular reason why you don't defer the scrubbing here? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |