summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@linux.ie>2005-11-29 09:46:27 +0000
committerDave Airlie <airlied@linux.ie>2005-11-29 09:46:27 +0000
commit0db80529d540fabd148275f8f9c999615153edbe (patch)
tree0829f3142cea85da626c9692acefd02b5d432ca8
parent645e2d411d4cb79db307351169413004d8b5a2ea (diff)
Fix from Hugh Dickins for consistent mapping
-rw-r--r--linux-core/drm_vm.c16
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