|
@@ -1563,9 +1563,30 @@ out:
|
|
|
*/
|
|
|
int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
|
unsigned long pfn)
|
|
|
+{
|
|
|
+ return vm_insert_pfn_prot(vma, addr, pfn, vma->vm_page_prot);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(vm_insert_pfn);
|
|
|
+
|
|
|
+/**
|
|
|
+ * vm_insert_pfn_prot - insert single pfn into user vma with specified pgprot
|
|
|
+ * @vma: user vma to map to
|
|
|
+ * @addr: target user address of this page
|
|
|
+ * @pfn: source kernel pfn
|
|
|
+ * @pgprot: pgprot flags for the inserted page
|
|
|
+ *
|
|
|
+ * This is exactly like vm_insert_pfn, except that it allows drivers to
|
|
|
+ * to override pgprot on a per-page basis.
|
|
|
+ *
|
|
|
+ * This only makes sense for IO mappings, and it makes no sense for
|
|
|
+ * cow mappings. In general, using multiple vmas is preferable;
|
|
|
+ * vm_insert_pfn_prot should only be used if using multiple VMAs is
|
|
|
+ * impractical.
|
|
|
+ */
|
|
|
+int vm_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr,
|
|
|
+ unsigned long pfn, pgprot_t pgprot)
|
|
|
{
|
|
|
int ret;
|
|
|
- pgprot_t pgprot = vma->vm_page_prot;
|
|
|
/*
|
|
|
* Technically, architectures with pte_special can avoid all these
|
|
|
* restrictions (same for remap_pfn_range). However we would like
|
|
@@ -1587,7 +1608,7 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(vm_insert_pfn);
|
|
|
+EXPORT_SYMBOL(vm_insert_pfn_prot);
|
|
|
|
|
|
int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
|
|
|
unsigned long pfn)
|