--- memhotplug-dave/include/linux/mm.h | 5 +++++ memhotplug-dave/mm/memory.c | 15 ++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff -puN include/linux/mm.h~AA-PM-22.1-cow-on-zeropage include/linux/mm.h --- memhotplug/include/linux/mm.h~AA-PM-22.1-cow-on-zeropage 2005-03-11 10:52:09.000000000 -0800 +++ memhotplug-dave/include/linux/mm.h 2005-03-11 10:52:09.000000000 -0800 @@ -181,6 +181,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 diff -puN mm/memory.c~AA-PM-22.1-cow-on-zeropage mm/memory.c --- memhotplug/mm/memory.c~AA-PM-22.1-cow-on-zeropage 2005-03-11 10:52:09.000000000 -0800 +++ memhotplug-dave/mm/memory.c 2005-03-11 10:52:09.000000000 -0800 @@ -1336,15 +1336,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) @@ -1824,11 +1827,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; _