|
@@ -240,6 +240,27 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
|
|
|
}
|
|
|
EXPORT_SYMBOL(get_user_pages);
|
|
|
|
|
|
+/**
|
|
|
+ * follow_pfn - look up PFN at a user virtual address
|
|
|
+ * @vma: memory mapping
|
|
|
+ * @address: user virtual address
|
|
|
+ * @pfn: location to store found PFN
|
|
|
+ *
|
|
|
+ * Only IO mappings and raw PFN mappings are allowed.
|
|
|
+ *
|
|
|
+ * Returns zero and the pfn at @pfn on success, -ve otherwise.
|
|
|
+ */
|
|
|
+int follow_pfn(struct vm_area_struct *vma, unsigned long address,
|
|
|
+ unsigned long *pfn)
|
|
|
+{
|
|
|
+ if (!(vma->vm_flags & (VM_IO | VM_PFNMAP)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ *pfn = address >> PAGE_SHIFT;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(follow_pfn);
|
|
|
+
|
|
|
DEFINE_RWLOCK(vmlist_lock);
|
|
|
struct vm_struct *vmlist;
|
|
|
|