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:
kaf24@firebug.cl.cam.ac.uk committed 2005-09-16 10:57:31 +00:00
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;
+2 -14
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.