[Mesa-dev] [PATCH v2 07/11] intel: tools: aub_mem: reuse already mapped ppgtt buffers
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Wed Aug 8 22:11:11 UTC 2018
On 08/08/18 20:07, Rafael Antognolli wrote:
> On Tue, Aug 07, 2018 at 06:35:18PM +0100, Lionel Landwerlin wrote:
>> When we map a PPGTT buffer into a continous address space of aubinator
>> to be able to inspect it, we currently add it to the list of BOs to
>> unmap once we're finished. An optimization we can apply it to look up
>> that list before trying to remap PPGTT buffers again (we already do
>> this for GGTT buffers).
>>
>> We need to take some care before doing this because the list also
>> contains GGTT BOs. As GGTT & PPGTT are 2 different address spaces, we
>> can have matching addresses in both that point to different physical
>> locations.
> So, before this change, we could have the same address for PPGTT and
> GGTT on the map list, but they never clashed because we only added the
> PPGTT ones at the end, and then unmapped them? Or was there something
> else preventing them from conflicting?
Before this change we could get clashes when asking for a GGTT address
and get a PPGTT one.
I think we got lucky so far because we use a very small amount of GGTT
and that didn't happen.
>> This changes adds a flag on the elements of the list of mapped BOs to
>> differenciate between GGTT & PPGTT, which allows use to reuse that
>> list when looking up both address spaces.
>>
>> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>> ---
>> src/intel/tools/aub_mem.c | 16 +++++++++++-----
>> 1 file changed, 11 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/intel/tools/aub_mem.c b/src/intel/tools/aub_mem.c
>> index 2d29386e57c..3d4dc8061bd 100644
>> --- a/src/intel/tools/aub_mem.c
>> +++ b/src/intel/tools/aub_mem.c
>> @@ -42,6 +42,7 @@ struct bo_map {
>> struct list_head link;
>> struct gen_batch_decode_bo bo;
>> bool unmap_after_use;
>> + bool ppgtt;
>> };
>>
>> struct ggtt_entry {
>> @@ -59,10 +60,11 @@ struct phys_mem {
>> };
>>
>> static void
>> -add_gtt_bo_map(struct aub_mem *mem, struct gen_batch_decode_bo bo, bool unmap_after_use)
>> +add_gtt_bo_map(struct aub_mem *mem, struct gen_batch_decode_bo bo, bool ppgtt, bool unmap_after_use)
>> {
>> struct bo_map *m = calloc(1, sizeof(*m));
>>
>> + m->ppgtt = ppgtt;
>> m->bo = bo;
>> m->unmap_after_use = unmap_after_use;
>> list_add(&m->link, &mem->maps);
>> @@ -190,7 +192,7 @@ aub_mem_local_write(void *_mem, uint64_t address,
>> .addr = address,
>> .size = size,
>> };
>> - add_gtt_bo_map(mem, bo, false);
>> + add_gtt_bo_map(mem, bo, false, false);
>> }
>>
>> void
>> @@ -253,7 +255,7 @@ aub_mem_get_ggtt_bo(void *_mem, uint64_t address)
>> struct gen_batch_decode_bo bo = {0};
>>
>> list_for_each_entry(struct bo_map, i, &mem->maps, link)
>> - if (i->bo.addr <= address && i->bo.addr + i->bo.size > address)
>> + if (!i->ppgtt && i->bo.addr <= address && i->bo.addr + i->bo.size > address)
>> return i->bo;
>>
>> address &= ~0xfff;
>> @@ -292,7 +294,7 @@ aub_mem_get_ggtt_bo(void *_mem, uint64_t address)
>> assert(res != MAP_FAILED);
>> }
>>
>> - add_gtt_bo_map(mem, bo, true);
>> + add_gtt_bo_map(mem, bo, false, true);
>>
>> return bo;
>> }
>> @@ -328,6 +330,10 @@ aub_mem_get_ppgtt_bo(void *_mem, uint64_t address)
>> struct aub_mem *mem = _mem;
>> struct gen_batch_decode_bo bo = {0};
>>
>> + list_for_each_entry(struct bo_map, i, &mem->maps, link)
>> + if (i->ppgtt && i->bo.addr <= address && i->bo.addr + i->bo.size > address)
>> + return i->bo;
>> +
>> address &= ~0xfff;
>>
>> if (!ppgtt_mapped(mem, mem->pml4, address))
>> @@ -353,7 +359,7 @@ aub_mem_get_ppgtt_bo(void *_mem, uint64_t address)
>> assert(res != MAP_FAILED);
>> }
>>
>> - add_gtt_bo_map(mem, bo, true);
>> + add_gtt_bo_map(mem, bo, true, true);
>>
>> return bo;
>> }
>> --
>> 2.18.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list