diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index a759afc9e3..97c8d73b7b 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1557,7 +1557,7 @@ static int alloc_l2_table(struct page_info *page, unsigned long type) if ( rc == -EINTR && i ) { page->nr_validated_ptes = i; - page->partial_flags = 0; + page->partial_flags = partial_flags;; rc = -ERESTART; } else if ( rc < 0 && rc != -EINTR ) @@ -1660,7 +1660,7 @@ static int alloc_l3_table(struct page_info *page) else if ( rc == -EINTR && i ) { page->nr_validated_ptes = i; - page->partial_flags = 0; + page->partial_flags = partial_flags; rc = -ERESTART; } if ( rc < 0 ) @@ -1982,8 +1982,8 @@ static int free_l2_table(struct page_info *page) } else if ( rc == -EINTR && i < L2_PAGETABLE_ENTRIES - 1 ) { - page->nr_validated_ptes = i + 1; - page->partial_flags = 0; + page->nr_validated_ptes = i + !(partial_flags & PTF_partial_set); + page->partial_flags = partial_flags; rc = -ERESTART; } @@ -2030,8 +2030,8 @@ static int free_l3_table(struct page_info *page) } else if ( rc == -EINTR && i < L3_PAGETABLE_ENTRIES - 1 ) { - page->nr_validated_ptes = i + 1; - page->partial_flags = 0; + page->nr_validated_ptes = i + !(partial_flags & PTF_partial_set); + page->partial_flags = partial_flags; rc = -ERESTART; } return rc > 0 ? 0 : rc; @@ -2061,8 +2061,8 @@ static int free_l4_table(struct page_info *page) } else if ( rc == -EINTR && i < L4_PAGETABLE_ENTRIES - 1 ) { - page->nr_validated_ptes = i + 1; - page->partial_flags = 0; + page->nr_validated_ptes = i + !(partial_flags & PTF_partial_set); + page->partial_flags = partial_flags; rc = -ERESTART; }