x86: PAT use reserve free memtype in mmap of /dev/mem
Use reserve_memtype and free_memtype wrappers for /dev/mem mmaps. The memtype is slightly complicated here, given that we have to support existing X mappings. We fallback on UC_MINUS for that. Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
f0970c13b6
commit
e7f260a276
@@ -300,6 +300,35 @@ static inline int private_mapping_ok(struct vm_area_struct *vma)
|
||||
}
|
||||
#endif
|
||||
|
||||
void __attribute__((weak))
|
||||
map_devmem(unsigned long pfn, unsigned long len, pgprot_t prot)
|
||||
{
|
||||
/* nothing. architectures can override. */
|
||||
}
|
||||
|
||||
void __attribute__((weak))
|
||||
unmap_devmem(unsigned long pfn, unsigned long len, pgprot_t prot)
|
||||
{
|
||||
/* nothing. architectures can override. */
|
||||
}
|
||||
|
||||
static void mmap_mem_open(struct vm_area_struct *vma)
|
||||
{
|
||||
map_devmem(vma->vm_pgoff, vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
static void mmap_mem_close(struct vm_area_struct *vma)
|
||||
{
|
||||
unmap_devmem(vma->vm_pgoff, vma->vm_end - vma->vm_start,
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
static struct vm_operations_struct mmap_mem_ops = {
|
||||
.open = mmap_mem_open,
|
||||
.close = mmap_mem_close
|
||||
};
|
||||
|
||||
static int mmap_mem(struct file * file, struct vm_area_struct * vma)
|
||||
{
|
||||
size_t size = vma->vm_end - vma->vm_start;
|
||||
@@ -321,13 +350,17 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma)
|
||||
size,
|
||||
vma->vm_page_prot);
|
||||
|
||||
vma->vm_ops = &mmap_mem_ops;
|
||||
|
||||
/* Remap-pfn-range will mark the range VM_IO and VM_RESERVED */
|
||||
if (remap_pfn_range(vma,
|
||||
vma->vm_start,
|
||||
vma->vm_pgoff,
|
||||
size,
|
||||
vma->vm_page_prot))
|
||||
vma->vm_page_prot)) {
|
||||
unmap_devmem(vma->vm_pgoff, size, vma->vm_page_prot);
|
||||
return -EAGAIN;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user