mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
direct_remap_pfn_range() takes a vm_area_struct rather than
an mm_struct. Also it sets VM_RESERVED and VM_IO, just like generic remap_pfn_range() in mm/memory.c. Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
cac86eced4
commit
1f730cca16
6 files changed
+38
-35
No files matched your search
@@ -45,12 +45,12 @@ static int direct_remap_area_pte_fn(pte_t *pte,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
pgprot_t prot,
|
||||
domid_t domid)
|
||||
static int __direct_remap_pfn_range(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
pgprot_t prot,
|
||||
domid_t domid)
|
||||
{
|
||||
int i;
|
||||
unsigned long start_address;
|
||||
@@ -98,6 +98,20 @@ int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int direct_remap_pfn_range(struct vm_area_struct *vma,
|
||||
unsigned long address,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
pgprot_t prot,
|
||||
domid_t domid)
|
||||
{
|
||||
/* Same as remap_pfn_range(). */
|
||||
vma->vm_flags |= VM_IO | VM_RESERVED;
|
||||
|
||||
return __direct_remap_pfn_range(
|
||||
vma->vm_mm, address, mfn, size, prot, domid);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(direct_remap_pfn_range);
|
||||
|
||||
|
||||
@@ -221,8 +235,9 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
|
||||
#ifdef __x86_64__
|
||||
flags |= _PAGE_USER;
|
||||
#endif
|
||||
if (direct_remap_pfn_range(&init_mm, (unsigned long) addr, phys_addr>>PAGE_SHIFT,
|
||||
size, __pgprot(flags), domid)) {
|
||||
if (__direct_remap_pfn_range(&init_mm, (unsigned long)addr,
|
||||
phys_addr>>PAGE_SHIFT,
|
||||
size, __pgprot(flags), domid)) {
|
||||
vunmap((void __force *) addr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -295,7 +295,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
||||
/* Write-combine setting is ignored, it is changed via the mtrr
|
||||
* interfaces on this platform.
|
||||
*/
|
||||
if (direct_remap_pfn_range(vma->vm_mm, vma->vm_start, vma->vm_pgoff,
|
||||
if (direct_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot, DOMID_IO))
|
||||
return -EAGAIN;
|
||||
|
||||
@@ -90,22 +90,10 @@ out:
|
||||
|
||||
static int mmap_mem(struct file * file, struct vm_area_struct * vma)
|
||||
{
|
||||
int uncached;
|
||||
|
||||
uncached = uncached_access(file);
|
||||
if (uncached)
|
||||
if (uncached_access(file))
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
|
||||
/* Don't try to swap out physical pages.. */
|
||||
vma->vm_flags |= VM_RESERVED;
|
||||
|
||||
/*
|
||||
* Don't dump addresses that are not real memory to a core file.
|
||||
*/
|
||||
if (uncached)
|
||||
vma->vm_flags |= VM_IO;
|
||||
|
||||
if (direct_remap_pfn_range(vma->vm_mm, vma->vm_start, vma->vm_pgoff,
|
||||
if (direct_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||
vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot, DOMID_IO))
|
||||
return -EAGAIN;
|
||||
|
||||
@@ -130,12 +130,12 @@ static int privcmd_ioctl(struct inode *inode, struct file *file,
|
||||
if ( (msg[j].va + (msg[j].npages<<PAGE_SHIFT)) > vma->vm_end )
|
||||
return -EINVAL;
|
||||
|
||||
if ( (rc = direct_remap_pfn_range(vma->vm_mm,
|
||||
msg[j].va&PAGE_MASK,
|
||||
msg[j].mfn,
|
||||
msg[j].npages<<PAGE_SHIFT,
|
||||
vma->vm_page_prot,
|
||||
mmapcmd.dom)) < 0 )
|
||||
if ( (rc = direct_remap_pfn_range(vma,
|
||||
msg[j].va&PAGE_MASK,
|
||||
msg[j].mfn,
|
||||
msg[j].npages<<PAGE_SHIFT,
|
||||
vma->vm_page_prot,
|
||||
mmapcmd.dom)) < 0 )
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -460,7 +460,7 @@ void make_pages_writable(void *va, unsigned int nr);
|
||||
#define kern_addr_valid(addr) (1)
|
||||
#endif /* !CONFIG_DISCONTIGMEM */
|
||||
|
||||
int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
int direct_remap_pfn_range(struct vm_area_struct *vma,
|
||||
unsigned long address,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
@@ -474,10 +474,10 @@ int touch_pte_range(struct mm_struct *mm,
|
||||
unsigned long size);
|
||||
|
||||
#define io_remap_page_range(vma,from,phys,size,prot) \
|
||||
direct_remap_pfn_range(vma->vm_mm,from,phys>>PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range(vma,from,(phys)>>PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
|
||||
#define io_remap_pfn_range(vma,from,pfn,size,prot) \
|
||||
direct_remap_pfn_range(vma->vm_mm,from,pfn,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range(vma,from,pfn,size,prot,DOMID_IO)
|
||||
|
||||
#define MK_IOSPACE_PFN(space, pfn) (pfn)
|
||||
#define GET_IOSPACE(pfn) 0
|
||||
|
||||
@@ -526,7 +526,7 @@ extern int kern_addr_valid(unsigned long addr);
|
||||
|
||||
#define DOMID_LOCAL (0xFFFFU)
|
||||
|
||||
int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
int direct_remap_pfn_range(struct vm_area_struct *vma,
|
||||
unsigned long address,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
@@ -542,10 +542,10 @@ int touch_pte_range(struct mm_struct *mm,
|
||||
unsigned long size);
|
||||
|
||||
#define io_remap_page_range(vma, vaddr, paddr, size, prot) \
|
||||
direct_remap_pfn_range((vma)->vm_mm,vaddr,paddr>>PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range(vma,vaddr,(paddr)>>PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
|
||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
||||
direct_remap_pfn_range((vma)->vm_mm,vaddr,pfn,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range(vma,vaddr,pfn,size,prot,DOMID_IO)
|
||||
|
||||
#define MK_IOSPACE_PFN(space, pfn) (pfn)
|
||||
#define GET_IOSPACE(pfn) 0
|
||||
|
||||