From mboxrd@z Thu Jan 1 00:00:00 1970 From: Izik Eidus Subject: [RFC][PATCH 2/5] add new exported function replace_page() Date: Mon, 21 Jan 2008 18:10:50 +0200 Message-ID: <4794C40A.3020500@qumranet.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030700060709090302040201" To: kvm-devel , andrea-atKUWr5tajBWk0Htik3J/w@public.gmane.org, avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org, dor.laor-atKUWr5tajBWk0Htik3J/w@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, yaniv-atKUWr5tajBWk0Htik3J/w@public.gmane.org Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------030700060709090302040201 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit -- woof. --------------030700060709090302040201 Content-Type: text/x-patch; name="0005-memory.c-add-new-exported-function-replace_page.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="0005-memory.c-add-new-exported-function-replace_page.patch" >>From c6fc21397e37481696723115cb1680f42661be48 Mon Sep 17 00:00:00 2001 From: Izik Eidus Date: Mon, 21 Jan 2008 17:04:45 +0200 Subject: [PATCH] memory.c: add new exported function replace_page() replace_page() - replace the pte mapping related to vm area between two pages (from oldpage to newpage) Signed-off-by: Izik Eidus --- include/linux/mm.h | 5 +++- mm/memory.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 1b7b95c..a311c25 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1094,7 +1094,10 @@ int remap_pfn_range(struct vm_area_struct *, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t); int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *); int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr, - unsigned long pfn); + unsigned long pfn); + +int replace_page(struct vm_area_struct *vma, struct page *oldpage, + struct page *newpage, pgprot_t prot); struct page *follow_page(struct vm_area_struct *, unsigned long address, unsigned int foll_flags); diff --git a/mm/memory.c b/mm/memory.c index 4bf0b6d..d8cb36b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2360,6 +2360,66 @@ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma, return __do_fault(mm, vma, address, pmd, pgoff, flags, orig_pte); } +/** + * replace_page - replace the pte mapping related to vm area between two pages + * (from oldpage to newpage) + */ +int replace_page(struct vm_area_struct *vma, struct page *oldpage, + struct page *newpage, pgprot_t prot) +{ + struct mm_struct *mm = vma->vm_mm; + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; + pte_t *ptep; + spinlock_t *ptl; + unsigned long addr; + int ret; + + BUG_ON(!PageLocked(oldpage)); + + ret = -EFAULT; + addr = page_address_in_vma(oldpage, vma); + if (addr == -EFAULT) + goto out; + + pgd = pgd_offset(mm, addr); + if (!pgd_present(*pgd)) + goto out; + + pud = pud_offset(pgd, addr); + if (!pud_present(*pud)) + goto out; + + pmd = pmd_offset(pud, addr); + if (!pmd_present(*pmd)) + goto out; + + ptep = pte_offset_map_lock(mm, pmd, addr, &ptl); + if (!ptep) + goto out; + + ret = 0; + get_page(newpage); + page_add_file_rmap(newpage); + + flush_cache_page(vma, addr, pte_pfn(*ptep)); + ptep_clear_flush(vma, addr, ptep); + set_pte_at(mm, addr, ptep, mk_pte(newpage, prot)); + + page_remove_rmap(oldpage, vma); + if (PageAnon(oldpage)) { + dec_mm_counter(mm, anon_rss); + inc_mm_counter(mm, file_rss); + } + put_page(oldpage); + + pte_unmap_unlock(ptep, ptl); +out: + return ret; +} +EXPORT_SYMBOL_GPL(replace_page); + /* * do_no_pfn() tries to create a new page mapping for a page without -- 1.5.3.6 --------------030700060709090302040201 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ --------------030700060709090302040201 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --------------030700060709090302040201--