diff options
author | Dave Airlie <airlied@linux.ie> | 2005-11-29 09:46:27 +0000 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2005-11-29 09:46:27 +0000 |
commit | 0db80529d540fabd148275f8f9c999615153edbe (patch) | |
tree | 0829f3142cea85da626c9692acefd02b5d432ca8 | |
parent | 645e2d411d4cb79db307351169413004d8b5a2ea (diff) |
Fix from Hugh Dickins for consistent mapping
-rw-r--r-- | linux-core/drm_vm.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index b2d0bfb1..6c0ab57a 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -157,8 +157,7 @@ static __inline__ struct page *drm_do_vm_shm_nopage(struct vm_area_struct *vma, offset = address - vma->vm_start; i = (unsigned long)map->handle + offset; - page = (map->type == _DRM_CONSISTENT) ? - virt_to_page((void *)i) : vmalloc_to_page((void *)i); + page = vmalloc_to_page((void *)i); if (!page) return NOPAGE_OOM; get_page(page); @@ -311,6 +310,7 @@ static __inline__ struct page *drm_do_vm_sg_nopage(struct vm_area_struct *vma, unsigned long page_offset; struct page *page; + DRM_DEBUG("\n"); if (!entry) return NOPAGE_SIGBUS; /* Error */ if (address > vma->vm_end) @@ -673,11 +673,15 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) vma->vm_start, vma->vm_end, map->offset + offset); vma->vm_ops = &drm_vm_ops; break; - case _DRM_SHM: case _DRM_CONSISTENT: - /* Consistent memory is much like shared memory. The - * only difference is that drm_vm_shm_nopage must use - * virt_to_page instead of vmalloc_to_page. */ + /* Consistent memory is really like shared memory. But + * it's allocated in a different way, so avoid nopage */ + if (remap_pfn_range(vma, vma->vm_start, + page_to_pfn(virt_to_page(map->handle)), + vma->vm_end - vma->vm_start, vma->vm_page_prot)) + return -EAGAIN; + /* fall through to _DRM_SHM */ + case _DRM_SHM: vma->vm_ops = &drm_vm_shm_ops; vma->vm_private_data = (void *)map; /* Don't let this area swap. Change when |