diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memory.c | 5 | ||||
-rw-r--r-- | mm/mempolicy.c | 14 | ||||
-rw-r--r-- | mm/swap.c | 3 |
3 files changed, 17 insertions, 5 deletions
diff --git a/mm/memory.c b/mm/memory.c index 9abc6008544b..85e80a57db29 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -623,11 +623,12 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, | |||
623 | (*zap_work)--; | 623 | (*zap_work)--; |
624 | continue; | 624 | continue; |
625 | } | 625 | } |
626 | |||
627 | (*zap_work) -= PAGE_SIZE; | ||
628 | |||
626 | if (pte_present(ptent)) { | 629 | if (pte_present(ptent)) { |
627 | struct page *page; | 630 | struct page *page; |
628 | 631 | ||
629 | (*zap_work) -= PAGE_SIZE; | ||
630 | |||
631 | page = vm_normal_page(vma, addr, ptent); | 632 | page = vm_normal_page(vma, addr, ptent); |
632 | if (unlikely(details) && page) { | 633 | if (unlikely(details) && page) { |
633 | /* | 634 | /* |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 2a8206009422..b21869a39f0b 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -330,9 +330,19 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, | |||
330 | int err; | 330 | int err; |
331 | struct vm_area_struct *first, *vma, *prev; | 331 | struct vm_area_struct *first, *vma, *prev; |
332 | 332 | ||
333 | /* Clear the LRU lists so pages can be isolated */ | 333 | if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) { |
334 | if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) | 334 | /* Must have swap device for migration */ |
335 | if (nr_swap_pages <= 0) | ||
336 | return ERR_PTR(-ENODEV); | ||
337 | |||
338 | /* | ||
339 | * Clear the LRU lists so pages can be isolated. | ||
340 | * Note that pages may be moved off the LRU after we have | ||
341 | * drained them. Those pages will fail to migrate like other | ||
342 | * pages that may be busy. | ||
343 | */ | ||
335 | lru_add_drain_all(); | 344 | lru_add_drain_all(); |
345 | } | ||
336 | 346 | ||
337 | first = find_vma(mm, start); | 347 | first = find_vma(mm, start); |
338 | if (!first) | 348 | if (!first) |
@@ -393,7 +393,8 @@ void pagevec_strip(struct pagevec *pvec) | |||
393 | struct page *page = pvec->pages[i]; | 393 | struct page *page = pvec->pages[i]; |
394 | 394 | ||
395 | if (PagePrivate(page) && !TestSetPageLocked(page)) { | 395 | if (PagePrivate(page) && !TestSetPageLocked(page)) { |
396 | try_to_release_page(page, 0); | 396 | if (PagePrivate(page)) |
397 | try_to_release_page(page, 0); | ||
397 | unlock_page(page); | 398 | unlock_page(page); |
398 | } | 399 | } |
399 | } | 400 | } |