From: Nick Piggin <npiggin@suse.de>
To: Hugh Dickins <hugh@veritas.com>,
Linux Memory Management <linux-mm@kvack.org>
Cc: Andrew Morton <akpm@osdl.org>, Jes Sorensen <jes@sgi.com>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Linux Kernel <linux-kernel@vger.kernel.org>,
Nick Piggin <npiggin@suse.de>, Ingo Molnar <mingo@elte.hu>
Subject: [patch 4/5] mm: add vm_insert_pfn helpler
Date: Mon, 9 Oct 2006 18:12:59 +0200 (CEST) [thread overview]
Message-ID: <20061009140447.13840.20975.sendpatchset@linux.site> (raw)
In-Reply-To: <20061009140354.13840.71273.sendpatchset@linux.site>
Add a vm_insert_pfn helper, so that ->fault handlers can have nopfn
functionality by installing their own pte and returning NULL.
Index: linux-2.6/include/linux/mm.h
===================================================================
--- linux-2.6.orig/include/linux/mm.h
+++ linux-2.6/include/linux/mm.h
@@ -1104,6 +1104,7 @@ unsigned long vmalloc_to_pfn(void *addr)
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 *, unsigned long addr, unsigned long pfn);
struct page *follow_page(struct vm_area_struct *, unsigned long address,
unsigned int foll_flags);
Index: linux-2.6/mm/memory.c
===================================================================
--- linux-2.6.orig/mm/memory.c
+++ linux-2.6/mm/memory.c
@@ -1267,6 +1267,50 @@ int vm_insert_page(struct vm_area_struct
}
EXPORT_SYMBOL(vm_insert_page);
+/**
+ * vm_insert_pfn - insert single pfn into user vma
+ * @vma: user vma to map to
+ * @addr: target user address of this page
+ * @pfn: source kernel pfn
+ *
+ * Similar to vm_inert_page, this allows drivers to insert individual pages
+ * they've allocated into a user vma. Same comments apply.
+ *
+ * This function should only be called from a vm_ops->fault handler, and
+ * in that case the handler should return NULL.
+ */
+int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)
+{
+ struct mm_struct *mm = vma->vm_mm;
+ int retval;
+ pte_t *pte, entry;
+ spinlock_t *ptl;
+
+ BUG_ON(is_cow_mapping(vma->vm_flags));
+
+ retval = -ENOMEM;
+ pte = get_locked_pte(mm, addr, &ptl);
+ if (!pte)
+ goto out;
+ retval = -EBUSY;
+ if (!pte_none(*pte))
+ goto out_unlock;
+
+ /* Ok, finally just insert the thing.. */
+ entry = pfn_pte(pfn, vma->vm_page_prot);
+ set_pte_at(mm, addr, pte, entry);
+ update_mmu_cache(vma, addr, entry);
+
+ vma->vm_flags |= VM_PFNMAP;
+ retval = 0;
+out_unlock:
+ pte_unmap_unlock(pte, ptl);
+
+out:
+ return retval;
+}
+EXPORT_SYMBOL(vm_insert_pfn);
+
/*
* maps a range of physical memory into the requested pages. the old
* mappings are removed. any references to nonexistent pages results
WARNING: multiple messages have this Message-ID (diff)
From: Nick Piggin <npiggin@suse.de>
To: Hugh Dickins <hugh@veritas.com>,
Linux Memory Management <linux-mm@kvack.org>
Cc: Andrew Morton <akpm@osdl.org>, Jes Sorensen <jes@sgi.com>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Linux Kernel <linux-kernel@vger.kernel.org>,
Nick Piggin <npiggin@suse.de>, Ingo Molnar <mingo@elte.hu>
Subject: [patch 4/5] mm: add vm_insert_pfn helpler
Date: Mon, 9 Oct 2006 18:12:59 +0200 (CEST) [thread overview]
Message-ID: <20061009140447.13840.20975.sendpatchset@linux.site> (raw)
In-Reply-To: <20061009140354.13840.71273.sendpatchset@linux.site>
Add a vm_insert_pfn helper, so that ->fault handlers can have nopfn
functionality by installing their own pte and returning NULL.
Index: linux-2.6/include/linux/mm.h
===================================================================
--- linux-2.6.orig/include/linux/mm.h
+++ linux-2.6/include/linux/mm.h
@@ -1104,6 +1104,7 @@ unsigned long vmalloc_to_pfn(void *addr)
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 *, unsigned long addr, unsigned long pfn);
struct page *follow_page(struct vm_area_struct *, unsigned long address,
unsigned int foll_flags);
Index: linux-2.6/mm/memory.c
===================================================================
--- linux-2.6.orig/mm/memory.c
+++ linux-2.6/mm/memory.c
@@ -1267,6 +1267,50 @@ int vm_insert_page(struct vm_area_struct
}
EXPORT_SYMBOL(vm_insert_page);
+/**
+ * vm_insert_pfn - insert single pfn into user vma
+ * @vma: user vma to map to
+ * @addr: target user address of this page
+ * @pfn: source kernel pfn
+ *
+ * Similar to vm_inert_page, this allows drivers to insert individual pages
+ * they've allocated into a user vma. Same comments apply.
+ *
+ * This function should only be called from a vm_ops->fault handler, and
+ * in that case the handler should return NULL.
+ */
+int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)
+{
+ struct mm_struct *mm = vma->vm_mm;
+ int retval;
+ pte_t *pte, entry;
+ spinlock_t *ptl;
+
+ BUG_ON(is_cow_mapping(vma->vm_flags));
+
+ retval = -ENOMEM;
+ pte = get_locked_pte(mm, addr, &ptl);
+ if (!pte)
+ goto out;
+ retval = -EBUSY;
+ if (!pte_none(*pte))
+ goto out_unlock;
+
+ /* Ok, finally just insert the thing.. */
+ entry = pfn_pte(pfn, vma->vm_page_prot);
+ set_pte_at(mm, addr, pte, entry);
+ update_mmu_cache(vma, addr, entry);
+
+ vma->vm_flags |= VM_PFNMAP;
+ retval = 0;
+out_unlock:
+ pte_unmap_unlock(pte, ptl);
+
+out:
+ return retval;
+}
+EXPORT_SYMBOL(vm_insert_pfn);
+
/*
* maps a range of physical memory into the requested pages. the old
* mappings are removed. any references to nonexistent pages results
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2006-10-09 16:13 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-09 16:12 [rfc] 2.6.19-rc1-git5: consolidation of file backed fault handlers Nick Piggin
2006-10-09 16:12 ` Nick Piggin
2006-10-09 16:12 ` [patch 1/5] mm: fault vs invalidate/truncate check Nick Piggin
2006-10-09 16:12 ` Nick Piggin
2006-10-09 16:12 ` [patch 2/5] mm: fault vs invalidate/truncate race fix Nick Piggin
2006-10-09 16:12 ` Nick Piggin
2006-10-09 21:10 ` Mark Fasheh
2006-10-09 21:10 ` Mark Fasheh
2006-10-10 1:10 ` Nick Piggin
2006-10-10 1:10 ` Nick Piggin
2006-10-11 18:34 ` Mark Fasheh
2006-10-11 18:34 ` Mark Fasheh
2006-10-12 3:28 ` Nick Piggin
2006-10-12 3:28 ` Nick Piggin
2006-10-09 16:12 ` [patch 3/5] mm: fault handler to replace nopage and populate Nick Piggin
2006-10-09 16:12 ` Nick Piggin
2006-10-09 16:12 ` Nick Piggin [this message]
2006-10-09 16:12 ` [patch 4/5] mm: add vm_insert_pfn helpler Nick Piggin
2006-10-09 21:03 ` Benjamin Herrenschmidt
2006-10-09 21:03 ` Benjamin Herrenschmidt
2006-10-10 0:42 ` Nick Piggin
2006-10-10 0:42 ` Nick Piggin
2006-10-10 1:11 ` faults and signals Benjamin Herrenschmidt
2006-10-10 1:11 ` Benjamin Herrenschmidt
2006-10-10 1:20 ` Nick Piggin
2006-10-10 1:20 ` Nick Piggin
2006-10-10 1:58 ` Benjamin Herrenschmidt
2006-10-10 1:58 ` Benjamin Herrenschmidt
2006-10-10 2:00 ` Benjamin Herrenschmidt
2006-10-10 2:00 ` Benjamin Herrenschmidt
2006-10-10 2:04 ` Nick Piggin
2006-10-10 2:04 ` Nick Piggin
2006-10-10 2:07 ` Benjamin Herrenschmidt
2006-10-10 2:07 ` Benjamin Herrenschmidt
2006-10-10 1:16 ` ptrace and pfn mappings Benjamin Herrenschmidt
2006-10-10 1:16 ` Benjamin Herrenschmidt
2006-10-10 2:23 ` Nick Piggin
2006-10-10 2:23 ` Nick Piggin
2006-10-10 2:47 ` Benjamin Herrenschmidt
2006-10-10 2:47 ` Benjamin Herrenschmidt
2006-10-10 2:56 ` Benjamin Herrenschmidt
2006-10-10 2:56 ` Benjamin Herrenschmidt
2006-10-10 3:03 ` Nick Piggin
2006-10-10 3:03 ` Nick Piggin
2006-10-10 3:42 ` Benjamin Herrenschmidt
2006-10-10 3:42 ` Benjamin Herrenschmidt
2006-10-10 2:58 ` Nick Piggin
2006-10-10 2:58 ` Nick Piggin
2006-10-10 3:40 ` Benjamin Herrenschmidt
2006-10-10 3:40 ` Benjamin Herrenschmidt
2006-10-10 3:46 ` Nick Piggin
2006-10-10 3:46 ` Nick Piggin
2006-10-10 4:58 ` Benjamin Herrenschmidt
2006-10-10 4:58 ` Benjamin Herrenschmidt
2006-10-10 12:31 ` Christoph Hellwig
2006-10-10 12:31 ` Christoph Hellwig
2006-10-10 12:42 ` Benjamin Herrenschmidt
2006-10-10 12:42 ` Benjamin Herrenschmidt
2006-10-10 18:06 ` Hugh Dickins
2006-10-10 18:06 ` Hugh Dickins
2006-10-09 16:13 ` [patch 5/5] mm: merge nopfn with fault handler Nick Piggin
2006-10-09 16:13 ` Nick Piggin
2006-10-09 20:57 ` [rfc] 2.6.19-rc1-git5: consolidation of file backed fault handlers Benjamin Herrenschmidt
2006-10-09 20:57 ` Benjamin Herrenschmidt
2006-10-09 21:00 ` Benjamin Herrenschmidt
2006-10-09 21:00 ` Benjamin Herrenschmidt
2006-10-10 0:53 ` Nick Piggin
2006-10-10 0:53 ` Nick Piggin
-- strict thread matches above, loose matches on Subject: below --
2006-10-10 14:21 Nick Piggin
2006-10-10 14:22 ` [patch 4/5] mm: add vm_insert_pfn helpler Nick Piggin
2006-10-10 14:22 ` Nick Piggin
2006-10-11 10:12 ` Thomas Hellstrom
2006-10-11 11:24 ` Nick Piggin
2006-10-11 21:30 ` Thomas Hellström
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061009140447.13840.20975.sendpatchset@linux.site \
--to=npiggin@suse.de \
--cc=akpm@osdl.org \
--cc=benh@kernel.crashing.org \
--cc=hugh@veritas.com \
--cc=jes@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.