[igt-dev] [PATCH i-g-t v2 1/1] lib/intel_batchbuffer: add tracking and reset for allocator

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Tue Feb 1 15:32:50 UTC 2022


On Tue, Feb 01, 2022 at 03:07:57PM +0100, Kamil Konieczny wrote:
> After subtest ends, due to normal flow or after fail by
> igt_assert, igt_core inits intel_allocator before next subtest,
> and this makes allocator handle keeped in intel_batchbuffer
> invalid. Moreover any call to intel_allocator can result in
> fail as there are no allocators until first allocator_open.
> 
> Add tracking intel_butchbuffer if it is using allocator and
> recreate its allocator handle and offsets from igt_core before
> next subtest.
> 
> Add flag for turn on tracking and a helper function for it.
> It will not change behaviour of already used tests. Use case is
> for standalone runs with many subtests like gem_concurrent_blit.
> 
> v2: add tracking flag with default off (Zbigniew)
> 
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>

You've missed my two comments, scroll down:

> ---
>  lib/igt_core.c          |  2 ++
>  lib/intel_batchbuffer.c | 61 +++++++++++++++++++++++++++++++++++++++++
>  lib/intel_batchbuffer.h |  7 +++++
>  3 files changed, 70 insertions(+)
> 
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index 7c906675..ab27a24d 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -59,6 +59,7 @@
>  
>  #include "drmtest.h"
>  #include "intel_allocator.h"
> +#include "intel_batchbuffer.h"
>  #include "intel_chipset.h"
>  #include "intel_io.h"
>  #include "igt_debugfs.h"
> @@ -1426,6 +1427,7 @@ __noreturn static void exit_subtest(const char *result)
>  	 * remnants from previous allocator run (if any).
>  	 */
>  	intel_allocator_init();
> +	intel_bb_reinit_allocator();
>  
>  	if (!in_dynamic_subtest)
>  		_igt_dynamic_tests_executed = -1;
> diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
> index 10d8a6e0..7870e5a4 100644
> --- a/lib/intel_batchbuffer.c
> +++ b/lib/intel_batchbuffer.c
> @@ -80,6 +80,10 @@
>   * library as a dependency.
>   */
>  
> +static bool intel_bb_do_tracking;
> +static IGT_LIST_HEAD(intel_bb_list);
> +static pthread_mutex_t intel_bb_list_lock = PTHREAD_MUTEX_INITIALIZER;
> +
>  /**
>   * intel_batchbuffer_align:
>   * @batch: batchbuffer object
> @@ -1359,6 +1363,9 @@ __intel_bb_create(int i915, uint32_t ctx, uint32_t size, bool do_relocs,
>  								  strategy);
>  	ibb->allocator_type = allocator_type;
>  	ibb->allocator_strategy = strategy;
> +	ibb->allocator_start = start;
> +	ibb->allocator_end = end;
> +
>  	ibb->i915 = i915;
>  	ibb->enforce_relocs = do_relocs;
>  	ibb->handle = gem_create(i915, size);
> @@ -1384,6 +1391,12 @@ __intel_bb_create(int i915, uint32_t ctx, uint32_t size, bool do_relocs,
>  
>  	ibb->refcount = 1;
>  
> +	if (intel_bb_do_tracking && ibb->allocator_type != INTEL_ALLOCATOR_NONE) {
> +		pthread_mutex_lock(&intel_bb_list_lock);
> +		igt_list_add(&ibb->link, &intel_bb_list);
> +		pthread_mutex_unlock(&intel_bb_list_lock);
> +	}
> +
>  	return ibb;
>  }
>  
> @@ -1600,6 +1613,12 @@ void intel_bb_destroy(struct intel_bb *ibb)
>  	__intel_bb_destroy_cache(ibb);
>  
>  	if (ibb->allocator_type != INTEL_ALLOCATOR_NONE) {
> +		if (intel_bb_do_tracking) {
> +			pthread_mutex_lock(&intel_bb_list_lock);
> +			igt_list_del(&ibb->link);
> +			pthread_mutex_unlock(&intel_bb_list_lock);
> +		}
> +
>  		intel_allocator_free(ibb->allocator_handle, ibb->handle);
>  		intel_allocator_close(ibb->allocator_handle);
>  	}
> @@ -2959,3 +2978,45 @@ igt_huc_copyfunc_t igt_get_huc_copyfunc(int devid)
>  
>  	return copy;
>  }
> +

Add documentation to public functions.

> +void intel_bb_track(bool do_tracking)
> +{
> +	if (intel_bb_do_tracking == do_tracking)
> +		return;
> +
> +	if (intel_bb_do_tracking) {
> +		struct intel_bb *entry, *tmp;
> +
> +		pthread_mutex_lock(&intel_bb_list_lock);
> +		igt_list_for_each_entry_safe(entry, tmp, &intel_bb_list, link)
> +			igt_list_del(&entry->link);
> +		pthread_mutex_unlock(&intel_bb_list_lock);
> +	}
> +
> +	intel_bb_do_tracking = do_tracking;
> +}
> +
> +void __intel_bb_reinit_alloc(struct intel_bb *ibb)
> +{
> +	if (ibb->allocator_type == INTEL_ALLOCATOR_NONE)
> +		return;
> +
> +	ibb->allocator_handle = intel_allocator_open_full(ibb->i915, ibb->ctx,
> +							  ibb->allocator_start, ibb->allocator_end,
> +							  ibb->allocator_type,
> +							  ibb->allocator_strategy);
> +	intel_bb_reset(ibb, true);
> +}
> +

Same here.

> +void intel_bb_reinit_allocator(void)
> +{
> +	struct intel_bb *iter;
> +
> +	if (!intel_bb_do_tracking)
> +		return;
> +
> +	pthread_mutex_lock(&intel_bb_list_lock);
> +	igt_list_for_each_entry(iter, &intel_bb_list, link)
> +		__intel_bb_reinit_alloc(iter);
> +	pthread_mutex_unlock(&intel_bb_list_lock);
> +}
> diff --git a/lib/intel_batchbuffer.h b/lib/intel_batchbuffer.h
> index e7606307..15413b34 100644
> --- a/lib/intel_batchbuffer.h
> +++ b/lib/intel_batchbuffer.h
> @@ -456,7 +456,10 @@ struct igt_pxp {
>   * Batchbuffer without libdrm dependency
>   */
>  struct intel_bb {
> +	struct igt_list_head link;
> +
>  	uint64_t allocator_handle;
> +	uint64_t allocator_start, allocator_end;
>  	uint8_t allocator_type;
>  	enum allocator_strategy allocator_strategy;
>  
> @@ -524,6 +527,10 @@ struct intel_bb *
>  intel_bb_create_with_relocs_and_context(int i915, uint32_t ctx, uint32_t size);
>  void intel_bb_destroy(struct intel_bb *ibb);
>  
> +// make it safe to use intel_allocator after failed test

We've previously agreed we use C style comments only in IGT so use /* and */

--
Zbigniew

> +void intel_bb_reinit_allocator(void);
> +void intel_bb_track(bool do_tracking);
> +
>  static inline void intel_bb_ref(struct intel_bb *ibb)
>  {
>  	ibb->refcount++;
> -- 
> 2.32.0
> 


More information about the igt-dev mailing list