r259580 breaks radeonkms
Roger Pau Monné
royger at FreeBSD.org
Wed Aug 6 16:52:19 UTC 2014
On 06/08/14 16:35, Nathan Whitehorn wrote:
>
>
> On 2014-08-06 02:35, Roger Pau Monné wrote:
>> On 06/08/14 02:37, Nathan Whitehorn wrote:
>>> Kernels with r269580 will panic when loading the radeonkms driver in
>>> pmap_page_set_memattr(). This probably indicates a bug in radeonkms, but
>>> the system is unusable in the meantime.
>>> -Nathan
>>
>> I seem to be able to load radeonkms just fine after r269580:
>
> It's possible that it is related to actually using it, rather than
> loading the module. I was only testing them together. I'm using vt and
> the panic (page fault in kernel mode) occurs when TTM tries to set
> memory attributes on some page while starting X. Before the panic, I see
> all the normal Radeon module messages as you do, so the module seems to
> have actually loaded correctly. The KMS console also seems to be
> functional enough to display the panic message, so I suspect it's X that
> triggers it.
> -Nathan
Please try the attached patch, it seems to solve the panic for me. It
also includes a fix for Intel i915 gem, which I'm not able to test
because I don't have the hardware.
Roger.
-------------- next part --------------
From 9dd3a21d99ff2fc7bf3299359751d2399eee912a Mon Sep 17 00:00:00 2001
From: Roger Pau Monne <roger.pau at citrix.com>
Date: Wed, 6 Aug 2014 18:16:53 +0200
Subject: [PATCH] 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
Sponsored by: Citrix Systems R&D
---
sys/dev/drm2/i915/i915_gem.c | 6 ++++--
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 a3acb60..6d46207 100644
--- a/sys/dev/drm2/i915/i915_gem.c
+++ b/sys/dev/drm2/i915/i915_gem.c
@@ -1428,8 +1428,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;
--
1.7.7.5 (Apple Git-26)
More information about the freebsd-current
mailing list