aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/migrate.h
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-05-06 17:50:20 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-07 15:12:57 -0400
commit906e0be197232c219197d058ef5095baa7764cd4 (patch)
tree0b2401f5448ddb1b856da8c080e71e0080183c41 /include/linux/migrate.h
parent4ab688c51226188f2d4ad4f789032c107944ef89 (diff)
page migration: Only migrate pages if allocation in the highest zone is possible
Address spaces contain an allocation flag that specifies restriction on the zone for pages placed in the mapping. I.e. some device may require pages to be allocated from a DMA zone. Block devices may not be able to use pages from HIGHMEM. Memory policies and the common use of page migration works only on the highest zone. If the address space does not allow allocation from the highest zone then the pages in the address space are not migratable simply because we can only allocate memory for a specified node if we allow allocation for the highest zone on each node. Acked-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/migrate.h')
-rw-r--r--include/linux/migrate.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 75e55dcdeb18..e10a90a93b5d 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -2,18 +2,29 @@
2#define _LINUX_MIGRATE_H 2#define _LINUX_MIGRATE_H
3 3
4#include <linux/mm.h> 4#include <linux/mm.h>
5#include <linux/mempolicy.h>
6#include <linux/pagemap.h>
5 7
6typedef struct page *new_page_t(struct page *, unsigned long private, int **); 8typedef struct page *new_page_t(struct page *, unsigned long private, int **);
7 9
10#ifdef CONFIG_MIGRATION
8/* Check if a vma is migratable */ 11/* Check if a vma is migratable */
9static inline int vma_migratable(struct vm_area_struct *vma) 12static inline int vma_migratable(struct vm_area_struct *vma)
10{ 13{
11 if (vma->vm_flags & (VM_IO|VM_HUGETLB|VM_PFNMAP|VM_RESERVED)) 14 if (vma->vm_flags & (VM_IO|VM_HUGETLB|VM_PFNMAP|VM_RESERVED))
12 return 0; 15 return 0;
16 /*
17 * Migration allocates pages in the highest zone. If we cannot
18 * do so then migration (at least from node to node) is not
19 * possible.
20 */
21 if (vma->vm_file &&
22 gfp_zone(mapping_gfp_mask(vma->vm_file->f_mapping))
23 < policy_zone)
24 return 0;
13 return 1; 25 return 1;
14} 26}
15 27
16#ifdef CONFIG_MIGRATION
17extern int isolate_lru_page(struct page *p, struct list_head *pagelist); 28extern int isolate_lru_page(struct page *p, struct list_head *pagelist);
18extern int putback_lru_pages(struct list_head *l); 29extern int putback_lru_pages(struct list_head *l);
19extern int migrate_page(struct address_space *, 30extern int migrate_page(struct address_space *,
@@ -28,6 +39,8 @@ extern int migrate_vmas(struct mm_struct *mm,
28 const nodemask_t *from, const nodemask_t *to, 39 const nodemask_t *from, const nodemask_t *to,
29 unsigned long flags); 40 unsigned long flags);
30#else 41#else
42static inline int vma_migratable(struct vm_area_struct *vma)
43 { return 0; }
31 44
32static inline int isolate_lru_page(struct page *p, struct list_head *list) 45static inline int isolate_lru_page(struct page *p, struct list_head *list)
33 { return -ENOSYS; } 46 { return -ENOSYS; }