--- 2.4.22-pre7aa1.clean/arch/alpha/kernel/alpha_ksyms.c 2003-07-25 23:18:37.000000000 -0500 +++ 2.4.22-pre7aa1/arch/alpha/kernel/alpha_ksyms.c 2003-07-25 23:25:55.000000000 -0500 @@ -200,6 +200,8 @@ EXPORT_SYMBOL(down_trylock); EXPORT_SYMBOL(up); +EXPORT_SYMBOL(__load_new_mm_context); + /* * SMP-specific symbols. */ --- 2.4.22-pre7aa1.clean/arch/i386/kernel/i386_ksyms.c 2003-07-25 23:18:39.000000000 -0500 +++ 2.4.22-pre7aa1/arch/i386/kernel/i386_ksyms.c 2003-07-25 23:25:55.000000000 -0500 @@ -151,6 +151,7 @@ /* TLB flushing */ EXPORT_SYMBOL(flush_tlb_page); +EXPORT_SYMBOL(flush_tlb_mm); #endif #ifdef CONFIG_X86_IO_APIC --- 2.4.22-pre7aa1.clean/include/linux/mm.h 2003-07-25 23:19:10.000000000 -0500 +++ 2.4.22-pre7aa1/include/linux/mm.h 2003-07-25 23:44:10.000000000 -0500 @@ -135,6 +135,8 @@ void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused); + int (*do_no_page)(struct mm_struct * mm, struct vm_area_struct * vma, + unsigned long address, int write_access, pte_t *page_table, pmd_t * pmd); #define HAVE_VMOP_MPROTECT int (*mprotect)(struct vm_area_struct * area, unsigned int newflags); }; @@ -517,6 +519,9 @@ extern void ptrace_disable(struct task_struct *); extern int ptrace_check_attach(struct task_struct *task, int kill); +extern int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma, + unsigned long address, int write_access, pte_t *page_table, pmd_t * pmd); + int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, int len, int write, int force, struct page **pages, struct vm_area_struct **vmas); --- 2.4.22-pre7aa1.clean/kernel/ksyms.c 2003-07-25 23:19:15.000000000 -0500 +++ 2.4.22-pre7aa1/kernel/ksyms.c 2003-07-25 23:25:56.000000000 -0500 @@ -127,6 +127,7 @@ EXPORT_SYMBOL(mem_map); #endif EXPORT_SYMBOL(remap_page_range); +EXPORT_SYMBOL(zap_page_range); EXPORT_SYMBOL(max_mapnr); EXPORT_SYMBOL(high_memory); EXPORT_SYMBOL(vmtruncate); @@ -141,6 +142,7 @@ EXPORT_SYMBOL(kmap_prot); EXPORT_SYMBOL(kmap_pte); #endif +EXPORT_SYMBOL(do_no_page); /* filesystem internal functions */ EXPORT_SYMBOL(def_blk_fops); --- 2.4.22-pre7aa1.clean/mm/memory.c 2003-07-25 23:19:15.000000000 -0500 +++ 2.4.22-pre7aa1/mm/memory.c 2003-07-25 23:42:28.000000000 -0500 @@ -1331,7 +1331,7 @@ * This is called with the MM semaphore held and the page table * spinlock held. Exit with the spinlock released. */ -static int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma, +int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma, unsigned long address, int write_access, pte_t *page_table, pmd_t * pmd) { struct page * new_page; @@ -1460,7 +1460,12 @@ * drop the lock. */ if (pte_none(entry)) + { + if (unlikely(vma->vm_ops && vma->vm_ops->do_no_page)) + return vma->vm_ops->do_no_page(mm, vma, + address, write_access, pte, pmd); return do_no_page(mm, vma, address, write_access, pte, pmd); + } return do_swap_page(mm, vma, address, pte, pmd, entry, write_access); }