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 b4872f74c0
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>
This commit is contained in:
parent
8df8618c62
commit
4df0052a21
|
|
@ -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;
|
||||
if (kgem->nreloc__self == 0)
|
||||
return;
|
||||
|
||||
assert(kgem->reloc[i].target_handle == ~0U);
|
||||
kgem->reloc[i].target_handle = bo->target_handle;
|
||||
kgem->reloc[i].presumed_offset = bo->presumed_offset;
|
||||
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];
|
||||
|
||||
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;
|
||||
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) {
|
||||
uint32_t *b;
|
||||
kgem->reloc[n].target_handle = bo->target_handle;
|
||||
kgem->reloc[n].presumed_offset = 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;
|
||||
|
||||
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->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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue