summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-10-24 08:08:23 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-10-24 09:18:52 +0100
commit4df0052a21efd744c4b8cb2409139ded6e45f5c8 (patch)
tree6cf920bf073d736279e8ed9c319c128c3d444d64
parent8df8618c62c0918416ca3e21b081299eacb9b054 (diff)
sna: Update the reloc->delta for the shrunk batch
As well as actually updating the value in the batch for the relocation address, we need to tell the kernel in case it has to update the address. Another regression from commit b4872f74c05a92c91d7b57146eb35ed2ecc86d97 Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Tue Oct 21 10:38:22 2014 +0100 sna: Avoid pwriting large batches Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85389 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c69
1 files changed, 40 insertions, 29 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 146d22ff..0eef0360 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1260,36 +1260,47 @@ static void kgem_fixup_relocs(struct kgem *kgem, struct kgem_bo *bo, int shrink)
bo->target_handle = kgem->has_handle_lut ? kgem->nexec : bo->handle;
assert(kgem->nreloc__self <= 256);
- if (kgem->nreloc__self) {
- DBG(("%s: fixing up %d%s self-relocations\n",
- __FUNCTION__, kgem->nreloc__self,
- kgem->nreloc__self == 256 ? "+" : ""));
- for (n = 0; n < kgem->nreloc__self; n++) {
- int i = kgem->reloc__self[n];
- uint32_t *b;
-
- assert(kgem->reloc[i].target_handle == ~0U);
- kgem->reloc[i].target_handle = bo->target_handle;
- kgem->reloc[i].presumed_offset = bo->presumed_offset;
-
- b = &kgem->batch[kgem->reloc[i].offset/sizeof(*b)];
- *b = kgem->reloc[i].delta + bo->presumed_offset;
- if (kgem->reloc[i].read_domains == I915_GEM_DOMAIN_INSTRUCTION)
- *b -= shrink;
- }
-
- if (n == 256) {
- for (n = kgem->reloc__self[255]; n < kgem->nreloc; n++) {
- if (kgem->reloc[n].target_handle == ~0U) {
- uint32_t *b;
- kgem->reloc[n].target_handle = bo->target_handle;
- kgem->reloc[n].presumed_offset = bo->presumed_offset;
-
- b = &kgem->batch[kgem->reloc[n].offset/sizeof(*b)];
- *b = kgem->reloc[n].delta + bo->presumed_offset;
- if (kgem->reloc[n].read_domains == I915_GEM_DOMAIN_INSTRUCTION)
- *b -= shrink;
+ if (kgem->nreloc__self == 0)
+ return;
+
+ DBG(("%s: fixing up %d%s self-relocations to handle=%p, presumed-offset=%llx\n",
+ __FUNCTION__, kgem->nreloc__self,
+ kgem->nreloc__self == 256 ? "+" : "",
+ bo->handle, (long long)bo->presumed_offset));
+ for (n = 0; n < kgem->nreloc__self; n++) {
+ int i = kgem->reloc__self[n];
+
+ assert(kgem->reloc[i].target_handle == ~0U);
+ kgem->reloc[i].target_handle = bo->target_handle;
+ kgem->reloc[i].presumed_offset = bo->presumed_offset;
+
+ if (kgem->reloc[i].read_domains == I915_GEM_DOMAIN_INSTRUCTION) {
+ DBG(("%s: moving base of self-reloc[%d:%d] %d -> %d\n",
+ __FUNCTION__, n, i,
+ kgem->reloc[i].delta,
+ kgem->reloc[i].delta - shrink));
+
+ kgem->reloc[i].delta -= shrink;
+ }
+ kgem->batch[kgem->reloc[i].offset/sizeof(uint32_t)] =
+ kgem->reloc[i].delta + bo->presumed_offset;
+ }
+
+ if (n == 256) {
+ for (n = kgem->reloc__self[255]; n < kgem->nreloc; n++) {
+ if (kgem->reloc[n].target_handle == ~0U) {
+ kgem->reloc[n].target_handle = bo->target_handle;
+ kgem->reloc[n].presumed_offset = bo->presumed_offset;
+
+ if (kgem->reloc[n].read_domains == I915_GEM_DOMAIN_INSTRUCTION) {
+ DBG(("%s: moving base of reloc[%d] %d -> %d\n",
+ __FUNCTION__, n,
+ kgem->reloc[n].delta,
+ kgem->reloc[n].delta - shrink));
+ kgem->reloc[n].delta -= shrink;
}
+ kgem->batch[kgem->reloc[n].offset/sizeof(uint32_t)] =
+ kgem->reloc[n].delta + bo->presumed_offset;
}
}
}