diff options
author | tijl <tijl@FreeBSD.org> | 2014-12-02 14:21:06 +0000 |
---|---|---|
committer | tijl <tijl@FreeBSD.org> | 2014-12-02 14:21:06 +0000 |
commit | f3fce3afbd1c4050c718893066b4e89d130ef5d9 (patch) | |
tree | 07c6a0a43bf7bed843bf1adc6f0f4cc79c11bc7b /sys/dev | |
parent | 5bc138563e4ed95ebccf89ef0ea259d8d15978ac (diff) | |
download | FreeBSD-src-f3fce3afbd1c4050c718893066b4e89d130ef5d9.zip FreeBSD-src-f3fce3afbd1c4050c718893066b4e89d130ef5d9.tar.gz |
MFC r269634:
drm: fix usage of vm_phys_fictitious_to_vm_page
vm_phys_fictitious_to_vm_page should not be called directly, even when
operating on a range that has been registered using
vm_phys_fictitious_reg_range. PHYS_TO_VM_PAGE should be used instead
because on arches that use VM_PHYSSEG_DENSE the page might come
directly from vm_page_array.
Reported by: nwhitehorn
Tested by: nwhitehorn, David Mackay <davidm.jx8p@gmail.com>
Sponsored by: Citrix Systems R&D
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/drm2/i915/i915_gem.c | 6 | ||||
-rw-r--r-- | sys/dev/drm2/ttm/ttm_bo_vm.c | 8 |
2 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/drm2/i915/i915_gem.c b/sys/dev/drm2/i915/i915_gem.c index f3736c5..1e0a13e 100644 --- a/sys/dev/drm2/i915/i915_gem.c +++ b/sys/dev/drm2/i915/i915_gem.c @@ -1429,8 +1429,10 @@ retry: obj->fault_mappable = true; VM_OBJECT_WLOCK(vm_obj); - m = vm_phys_fictitious_to_vm_page(dev->agp->base + obj->gtt_offset + - offset); + m = PHYS_TO_VM_PAGE(dev->agp->base + obj->gtt_offset + offset); + KASSERT((m->flags & PG_FICTITIOUS) != 0, + ("physical address %#jx not fictitious", + (uintmax_t)(dev->agp->base + obj->gtt_offset + offset))); if (m == NULL) { VM_OBJECT_WUNLOCK(vm_obj); cause = 60; diff --git a/sys/dev/drm2/ttm/ttm_bo_vm.c b/sys/dev/drm2/ttm/ttm_bo_vm.c index 83ec76c..7aa1ac0 100644 --- a/sys/dev/drm2/ttm/ttm_bo_vm.c +++ b/sys/dev/drm2/ttm/ttm_bo_vm.c @@ -216,8 +216,12 @@ reserve: } if (bo->mem.bus.is_iomem) { - m = vm_phys_fictitious_to_vm_page(bo->mem.bus.base + - bo->mem.bus.offset + offset); + m = PHYS_TO_VM_PAGE(bo->mem.bus.base + bo->mem.bus.offset + + offset); + KASSERT((m->flags & PG_FICTITIOUS) != 0, + ("physical address %#jx not fictitious", + (uintmax_t)(bo->mem.bus.base + bo->mem.bus.offset + + offset))); pmap_page_set_memattr(m, ttm_io_prot(bo->mem.placement)); } else { ttm = bo->ttm; |