]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
Revert "mm: don't hold heap lock in alloc_heap_pages() longer than necessary"
authorJan Beulich <jbeulich@suse.com>
Wed, 30 Aug 2017 10:23:23 +0000 (12:23 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 30 Aug 2017 10:23:23 +0000 (12:23 +0200)
This reverts commit dab6a84aadab11f31332030a1e9f0b9282d76156,
as it introduces a race with free_heap_pages().

xen/common/page_alloc.c

index 12e06fd71c69699a5e7845ac2d09cedce3526688..9fa62d26bacce136f00f452dd72408c8df9ba81d 100644 (file)
@@ -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 )