From 7e544204d5ae162e02f03c5ec0271e98deefae43 Mon Sep 17 00:00:00 2001 From: Steven Walter Date: Thu, 12 Nov 2009 12:24:13 -0500 Subject: [PATCH 1/2] pass vma to copy_user_highpage --- src/include/asm-arm/page.h | 8 +++++--- src/include/linux/highmem.h | 4 ++-- src/mm/memory.c | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/include/asm-arm/page.h b/src/include/asm-arm/page.h index d06c9f5..282ee54 100644 --- a/src/include/asm-arm/page.h +++ b/src/include/asm-arm/page.h @@ -106,10 +106,12 @@ #error Unknown user operations model #endif +struct vm_area_struct; + struct cpu_user_fns { void (*cpu_clear_user_page)(void *p, unsigned long user); void (*cpu_copy_user_page)(void *to, const void *from, - unsigned long user); + unsigned long user, struct vm_area_struct *vma); }; #ifdef MULTI_USER @@ -125,11 +127,11 @@ extern struct cpu_user_fns cpu_user; extern void __cpu_clear_user_page(void *p, unsigned long user); extern void __cpu_copy_user_page(void *to, const void *from, - unsigned long user); + unsigned long user, struct vm_area_struct *vma); #endif #define clear_user_page(addr,vaddr,pg) __cpu_clear_user_page(addr, vaddr) -#define copy_user_page(to,from,vaddr,pg) __cpu_copy_user_page(to, from, vaddr) +#define copy_user_page(to,from,vaddr,pg,vma) __cpu_copy_user_page(to, from, vaddr,vma) #define clear_page(page) memzero((void *)(page), PAGE_SIZE) extern void copy_page(void *to, const void *from); diff --git a/src/include/linux/highmem.h b/src/include/linux/highmem.h index 85ce7ef..0bbcb96 100644 --- a/src/include/linux/highmem.h +++ b/src/include/linux/highmem.h @@ -89,13 +89,13 @@ static inline void memclear_highpage_flush(struct page *page, unsigned int offse kunmap_atomic(kaddr, KM_USER0); } -static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr) +static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr, struct vm_area_struct *vma) { char *vfrom, *vto; vfrom = kmap_atomic(from, KM_USER0); vto = kmap_atomic(to, KM_USER1); - copy_user_page(vto, vfrom, vaddr, to); + copy_user_page(vto, vfrom, vaddr, to, vma); kunmap_atomic(vfrom, KM_USER0); kunmap_atomic(vto, KM_USER1); /* Make sure this page is cleared on other CPU's too before using it */ diff --git a/src/mm/memory.c b/src/mm/memory.c index f508c60..69d8d32 100644 --- a/src/mm/memory.c +++ b/src/mm/memory.c @@ -1448,7 +1448,7 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) return pte; } -static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va) +static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va, struct vm_area_struct *vma) { /* * If the source page was a PFN mapping, we don't have @@ -1472,7 +1472,7 @@ static inline void cow_user_page(struct page *dst, struct page *src, unsigned lo return; } - copy_user_highpage(dst, src, va); + copy_user_highpage(dst, src, va, vma); } /* @@ -1596,7 +1596,7 @@ gotten: new_page = alloc_page_vma(GFP_HIGHUSER, vma, address); if (!new_page) goto oom; - cow_user_page(new_page, old_page, address); + cow_user_page(new_page, old_page, address, vma); } /* @@ -2240,7 +2240,7 @@ retry: page = alloc_page_vma(GFP_HIGHUSER, vma, address); if (!page) goto oom; - copy_user_highpage(page, new_page, address); + copy_user_highpage(page, new_page, address, vma); page_cache_release(new_page); new_page = page; anon = 1; -- 1.6.2.3.g5bbe6