diff options
author | Daniel Schaeffer <daniel@dschaeffer.localdomain> | 2008-01-30 17:02:21 -0500 |
---|---|---|
committer | Daniel Schaeffer <daniel@dschaeffer.localdomain> | 2008-01-30 17:02:21 -0500 |
commit | 69918fd56c0bf20b670651c5114035c925da2876 (patch) | |
tree | e802a49492dd4ae96c55e19d926ebcb2a7a2b5e6 | |
parent | 181396da6285355076be1c4476be6c14d6f38d54 (diff) |
Fixed merge error
Changes to be committed:
modified: mm/memory.c
-rw-r--r-- | mm/memory.c | 61 |
1 files changed, 1 insertions, 60 deletions
diff --git a/mm/memory.c b/mm/memory.c index 04f39cbccefc..f82b359b2745 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1033,8 +1033,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, continue; } - if (!vma || ((vma->vm_flags & (VM_IO | VM_PFNMAP)) - && !(vma->vm_flags & VM_XIP)) + if (!vma || (vma->vm_flags & (VM_IO | VM_PFNMAP)) || !(vm_flags & vma->vm_flags)) return i ? : -EFAULT; @@ -1587,21 +1586,6 @@ static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) return pte; } -/* - * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock - */ -static inline void break_cow(struct vm_area_struct * vma, struct page * new_page, unsigned long address, - pte_t *page_table) -{ - pte_t entry; - - entry = maybe_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot)), - vma); - ptep_establish(vma, address, page_table, entry); - update_mmu_cache(vma, address, entry); - lazy_mmu_prot_update(entry); -} - static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va, struct vm_area_struct *vma) { /* @@ -1653,54 +1637,11 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, spinlock_t *ptl, pte_t orig_pte) { struct page *old_page, *new_page; - unsigned long pfn = pte_pfn(orig_pte); pte_t entry; int reuse = 0, ret = 0; int page_mkwrite = 0; struct page *dirty_page = NULL; - if (unlikely(!pfn_valid(pfn))) { - if ((vma->vm_flags & VM_XIP) && pte_present(orig_pte) && - pte_read(orig_pte)) { - /* - * Handle COW of XIP memory. - * Note that the source memory actually isn't a ram - * page so no struct page is associated to the source - * pte. - */ - char *dst; - int ret; - - spin_unlock(&mm->page_table_lock); - new_page = alloc_page(GFP_HIGHUSER); - if (!new_page) - return VM_FAULT_OOM; - - /* copy XIP data to memory */ - - dst = kmap_atomic(new_page, KM_USER0); - ret = copy_from_user(dst, (void*)address, PAGE_SIZE); - kunmap_atomic(dst, KM_USER0); - - /* make sure pte didn't change while we dropped the - lock */ - spin_lock(&mm->page_table_lock); - if (!ret && pte_same(*page_table, orig_pte)) { - inc_mm_counter(mm, file_rss); - break_cow(vma, new_page, address, page_table); - lru_cache_add(new_page); - page_add_file_rmap(new_page); - spin_unlock(&mm->page_table_lock); - return VM_FAULT_MINOR; /* Minor fault */ - } - - /* pte changed: back off */ - spin_unlock(&mm->page_table_lock); - page_cache_release(new_page); - return ret ? VM_FAULT_OOM : VM_FAULT_MINOR; - } - } - old_page = vm_normal_page(vma, address, orig_pte); if (!old_page) goto gotten; |