[PATCH i-g-t v4 17/40] SQUASH: lib/intel_batchbuffer: Remove intel_bufs for bb reset with purging caches
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Mon Feb 15 19:43:17 UTC 2021
To be squashed.
When intel_bb_reset(ibb, false) is called we just clean objects
array leaving cache / allocator state intact.
When intel_bb_reset(ibb, true) is called we purge cache as well as
detach intel_bufs from intel_bb.
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
---
lib/intel_batchbuffer.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
index a33ef7586..5c6a4bd21 100644
--- a/lib/intel_batchbuffer.c
+++ b/lib/intel_batchbuffer.c
@@ -1261,6 +1261,8 @@ static inline uint64_t __intel_bb_get_offset(struct intel_bb *ibb,
* If we do reset without purging caches we use addresses from intel-bb cache
* during execbuf objects construction.
*
+ * If we do reset with purging caches allocator entires are freed as well.
+ *
* Returns:
*
* Pointer the intel_bb, asserts on failure.
@@ -1491,6 +1493,10 @@ void intel_bb_destroy(struct intel_bb *ibb)
* @purge_objects_cache: if true destroy internal execobj and relocs + cache
*
* Recreate batch bo when there's no additional reference.
+ *
+ * When purge_object_cache == true we destroy cache as well as remove intel_buf
+ * from intel-bb tracking list. Removing intel_bufs releases their addresses
+ * in the allocator.
*/
void intel_bb_reset(struct intel_bb *ibb, bool purge_objects_cache)
@@ -1516,8 +1522,10 @@ void intel_bb_reset(struct intel_bb *ibb, bool purge_objects_cache)
__intel_bb_destroy_objects(ibb);
__reallocate_objects(ibb);
- if (purge_objects_cache)
+ if (purge_objects_cache) {
+ __intel_bb_remove_intel_bufs(ibb);
__intel_bb_destroy_cache(ibb);
+ }
/*
* When we use allocators we're in no-reloc mode so we have to free
@@ -2329,6 +2337,7 @@ static void update_offsets(struct intel_bb *ibb,
struct drm_i915_gem_exec_object2 *objects)
{
struct drm_i915_gem_exec_object2 *object;
+ struct intel_buf *entry;
uint32_t i;
for (i = 0; i < ibb->num_objects; i++) {
@@ -2340,6 +2349,16 @@ static void update_offsets(struct intel_bb *ibb,
if (i == 0)
ibb->batch_offset = object->offset;
}
+
+ igt_list_for_each_entry(entry, &ibb->intel_bufs, link) {
+ object = intel_bb_find_object(ibb, entry->handle);
+ igt_assert(object);
+
+ if (ibb->allocator_type == INTEL_ALLOCATOR_SIMPLE)
+ igt_assert(object->offset == entry->addr.offset);
+ else
+ entry->addr.offset = object->offset;
+ }
}
#define LINELEN 76
--
2.26.0
More information about the Intel-gfx-trybot
mailing list