|
@@ -50,6 +50,7 @@
|
|
#include <linux/export.h>
|
|
#include <linux/export.h>
|
|
#include <linux/delayacct.h>
|
|
#include <linux/delayacct.h>
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
|
|
+#include <linux/pfn_t.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/writeback.h>
|
|
#include <linux/memcontrol.h>
|
|
#include <linux/memcontrol.h>
|
|
#include <linux/mmu_notifier.h>
|
|
#include <linux/mmu_notifier.h>
|
|
@@ -1500,7 +1501,7 @@ int vm_insert_page(struct vm_area_struct *vma, unsigned long addr,
|
|
EXPORT_SYMBOL(vm_insert_page);
|
|
EXPORT_SYMBOL(vm_insert_page);
|
|
|
|
|
|
static int insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
static int insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
- unsigned long pfn, pgprot_t prot)
|
|
|
|
|
|
+ pfn_t pfn, pgprot_t prot)
|
|
{
|
|
{
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
int retval;
|
|
int retval;
|
|
@@ -1516,7 +1517,10 @@ static int insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
|
|
|
|
/* Ok, finally just insert the thing.. */
|
|
/* Ok, finally just insert the thing.. */
|
|
- entry = pte_mkspecial(pfn_pte(pfn, prot));
|
|
|
|
|
|
+ if (pfn_t_devmap(pfn))
|
|
|
|
+ entry = pte_mkdevmap(pfn_t_pte(pfn, prot));
|
|
|
|
+ else
|
|
|
|
+ entry = pte_mkspecial(pfn_t_pte(pfn, prot));
|
|
set_pte_at(mm, addr, pte, entry);
|
|
set_pte_at(mm, addr, pte, entry);
|
|
update_mmu_cache(vma, addr, pte); /* XXX: why not for insert_page? */
|
|
update_mmu_cache(vma, addr, pte); /* XXX: why not for insert_page? */
|
|
|
|
|
|
@@ -1566,14 +1570,14 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
if (track_pfn_insert(vma, &pgprot, pfn))
|
|
if (track_pfn_insert(vma, &pgprot, pfn))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- ret = insert_pfn(vma, addr, pfn, pgprot);
|
|
|
|
|
|
+ ret = insert_pfn(vma, addr, __pfn_to_pfn_t(pfn, PFN_DEV), pgprot);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(vm_insert_pfn);
|
|
EXPORT_SYMBOL(vm_insert_pfn);
|
|
|
|
|
|
int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
|
|
int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
|
|
- unsigned long pfn)
|
|
|
|
|
|
+ pfn_t pfn)
|
|
{
|
|
{
|
|
BUG_ON(!(vma->vm_flags & VM_MIXEDMAP));
|
|
BUG_ON(!(vma->vm_flags & VM_MIXEDMAP));
|
|
|
|
|
|
@@ -1587,10 +1591,10 @@ int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr,
|
|
* than insert_pfn). If a zero_pfn were inserted into a VM_MIXEDMAP
|
|
* than insert_pfn). If a zero_pfn were inserted into a VM_MIXEDMAP
|
|
* without pte special, it would there be refcounted as a normal page.
|
|
* without pte special, it would there be refcounted as a normal page.
|
|
*/
|
|
*/
|
|
- if (!HAVE_PTE_SPECIAL && pfn_valid(pfn)) {
|
|
|
|
|
|
+ if (!HAVE_PTE_SPECIAL && pfn_t_valid(pfn)) {
|
|
struct page *page;
|
|
struct page *page;
|
|
|
|
|
|
- page = pfn_to_page(pfn);
|
|
|
|
|
|
+ page = pfn_t_to_page(pfn);
|
|
return insert_page(vma, addr, page, vma->vm_page_prot);
|
|
return insert_page(vma, addr, page, vma->vm_page_prot);
|
|
}
|
|
}
|
|
return insert_pfn(vma, addr, pfn, vma->vm_page_prot);
|
|
return insert_pfn(vma, addr, pfn, vma->vm_page_prot);
|