Index: linux-2.6.13/include/linux/mm.h =================================================================== --- linux-2.6.13.orig/include/linux/mm.h 2005-08-30 12:17:28.000000000 -0700 +++ linux-2.6.13/include/linux/mm.h 2005-08-30 12:17:35.000000000 -0700 @@ -178,6 +178,11 @@ extern unsigned int kobjsize(const void #define VM_NormalReadHint(v) (!((v)->vm_flags & VM_READHINTMASK)) #define VM_SequentialReadHint(v) ((v)->vm_flags & VM_SEQ_READ) #define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ) +#ifdef CONFIG_MEMORY_HOTPLUG +#define VM_Immovable(v) ((v)->vm_flags & VM_IMMOVABLE) +#else +#define VM_Immovable(v) (0) +#endif /* * mapping from the currently active vm_flags protection bits (the Index: linux-2.6.13/mm/memory.c =================================================================== --- linux-2.6.13.orig/mm/memory.c 2005-08-30 12:17:28.000000000 -0700 +++ linux-2.6.13/mm/memory.c 2005-08-30 12:17:35.000000000 -0700 @@ -1281,15 +1281,18 @@ static int do_wp_page(struct mm_struct * goto no_new_page; if (old_page == ZERO_PAGE(address)) { - new_page = alloc_zeroed_user_highpage(vma, address); + if (VM_Immovable(vma)) { + new_page = alloc_page_vma(GFP_USER, vma, address); + if (new_page) + clear_user_page(address, address, new_page); + } else + new_page = alloc_zeroed_user_highpage(vma, address); if (!new_page) goto no_new_page; } else { -#ifdef CONFIG_MEMORY_HOTPLUG - if (vma->vm_flags & VM_IMMOVABLE) + if (VM_Immovable(vma)) new_page = alloc_page_vma(GFP_USER, vma, address); else -#endif new_page = alloc_page_vma(GFP_HIGHUSER, vma, address); if (!new_page) @@ -1779,11 +1782,9 @@ do_anonymous_page(struct mm_struct *mm, if (unlikely(anon_vma_prepare(vma))) goto no_mem; -#ifdef CONFIG_MEMORY_HOTPLUG - if (vma->vm_flags & VM_IMMOVABLE) + if (VM_Immovable(vma)) page = alloc_page_vma(GFP_USER, vma, addr); else -#endif page = alloc_zeroed_user_highpage(vma, addr); if (!page) goto no_mem;