From: Jan Beulich Date: Wed, 30 Aug 2017 10:23:23 +0000 (+0200) Subject: Revert "mm: don't hold heap lock in alloc_heap_pages() longer than necessary" X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=dfe280c17dbc93c267a9fdf0caa4c0abdd64cd3c;p=people%2Froyger%2Fxen.git Revert "mm: don't hold heap lock in alloc_heap_pages() longer than necessary" This reverts commit dab6a84aadab11f31332030a1e9f0b9282d76156, as it introduces a race with free_heap_pages(). --- diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 12e06fd71c..9fa62d26ba 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -855,7 +855,6 @@ static struct page_info *alloc_heap_pages( struct page_info *pg; bool need_tlbflush = false; uint32_t tlbflush_timestamp = 0; - unsigned int dirty_cnt = 0; /* Make sure there are enough bits in memflags for nodeID. */ BUILD_BUG_ON((_MEMF_bits - _MEMF_node) < (8 * sizeof(nodeid_t))); @@ -944,8 +943,6 @@ static struct page_info *alloc_heap_pages( if ( d != NULL ) d->last_alloc_node = node; - spin_unlock(&heap_lock); - for ( i = 0; i < (1 << order); i++ ) { /* Reference count must continuously be zero for free pages. */ @@ -955,7 +952,7 @@ static struct page_info *alloc_heap_pages( { if ( !(memflags & MEMF_no_scrub) ) scrub_one_page(&pg[i]); - dirty_cnt++; + node_need_scrub[node]--; } pg[i].count_info = PGC_state_inuse; @@ -977,8 +974,6 @@ static struct page_info *alloc_heap_pages( check_one_page(&pg[i]); } - spin_lock(&heap_lock); - node_need_scrub[node] -= dirty_cnt; spin_unlock(&heap_lock); if ( need_tlbflush )