| Top |
| igt_spin_t * | igt_spin_factory () |
| #define | igt_spin_new() |
| void | igt_spin_set_timeout () |
| void | igt_spin_reset () |
| void | igt_spin_end () |
| void | igt_spin_free () |
| bool | igt_spin_has_poll () |
| bool | igt_spin_has_started () |
| void | igt_spin_busywait_until_started () |
| void | igt_terminate_spins () |
| void | igt_unshare_spins () |
| void | igt_free_spins () |
| igt_spin_t * | igt_sync_spin () |
| #define | IGT_CORK() |
| #define | IGT_CORK_HANDLE() |
| #define | IGT_CORK_FENCE() |
| uint32_t | igt_cork_plug () |
| void | igt_cork_unplug () |
| igt_spin_factory_t | |
| igt_spin_t | |
| #define | IGT_SPIN_FENCE_IN |
| #define | IGT_SPIN_FENCE_SUBMIT |
| #define | IGT_SPIN_FENCE_OUT |
| #define | IGT_SPIN_POLL_RUN |
| #define | IGT_SPIN_FAST |
| #define | IGT_SPIN_NO_PREEMPTION |
| #define | IGT_SPIN_INVALID_CS |
| #define | IGT_SPIN_USERPTR |
| #define | IGT_SPIN_SOFTDEP |
| enum | igt_cork_type |
| struct | igt_cork_vgem |
| struct | igt_cork_sw_sync |
| struct | igt_cork |
| struct | intel_execution_engine2 |
A lot of igt testcases need some GPU workload to make sure a race window is big enough. Unfortunately having a fixed amount of workload leads to spurious test failures or overly long runtimes on some fast/slow platforms. This library contains functionality to submit GPU workloads that should consume exactly a specific amount of time.
igt_spin_t * igt_spin_factory (int fd,const igt_spin_factory_t *opts);
Start a recursive batch on a ring. Immediately returns a igt_spin_t that
contains the batch's handle that can be waited upon. The returned structure
must be passed to igt_spin_free() for post-processing.
void igt_spin_set_timeout (igt_spin_t *spin,int64_t ns);
Specify a timeout. This ends the recursive batch associated with spin
after
the timeout has elapsed.
spin |
spin state from |
|
ns |
amount of time in nanoseconds the batch continues to execute before finishing. |
void
igt_spin_reset (igt_spin_t *spin);
Reset the state of spin, allowing its reuse.
void
igt_spin_end (igt_spin_t *spin);
End the spinner associated with spin
manually.
void igt_spin_free (int fd,igt_spin_t *spin);
This function does the necessary post-processing after starting a
spin with igt_spin_new() and then frees it.
igt_spin_t * igt_sync_spin (int i915,uint64_t ahnd,const intel_ctx_t *ctx,const struct intel_execution_engine2 *e);
Starts a recursive batch on an engine.
Returns a igt_spin_t and tries to guarantee it to be running at the time of
the return. Otherwise it does a best effort only. Callers should check for
gem_class_can_store_dword
if they want to be sure guarantee can be given.
Both standard and igt_sync_spin API family can be used on the returned spinner object.
uint32_t igt_cork_plug (struct igt_cork *cork,int fd);
This function provides a mechanism to stall submission. It provides two blocking methods:
VGEM_BO. Imports a vgem bo with a fence attached to it. This bo can be used as a dependency during submission to stall execution until the fence is signaled.
SW_SYNC: Creates a timeline and then a fence on that timeline. The fence can be used as an input fence to a request, the request will be stalled until the fence is signaled.
The parameters required to unblock the execution and to cleanup are stored in the provided cork structure.
typedef struct {
uint32_t ctx_id;
const intel_ctx_t *ctx;
uint32_t dependency;
uint64_t dependency_size;
unsigned int engine;
unsigned int flags;
int fence;
uint64_t ahnd;
struct drm_xe_engine_class_instance *hwe;
uint32_t vm;
} igt_spin_factory_t;
A factory struct which contains creation parameters for an igt_spin_t.
GEM context handle |
||
const intel_ctx_t * |
intel_ctx_t context wrapper |
|
GEM object to depend on |
||
unsigned int |
Flags describing the engine to execute on |
|
unsigned int |
Set of IGT_SPIN_* flags |
|
int |
In-fence to wait on |
|
typedef struct {
struct igt_list_head link;
uint32_t handle;
uint32_t poll_handle;
uint32_t *batch;
uint32_t *condition;
uint32_t cmd_precondition;
uint32_t *poll;
#define SPIN_POLL_START_IDX 0
struct timespec last_signal;
pthread_t timer_thread;
int timerfd;
int out_fence;
struct drm_i915_gem_exec_object2 obj[2];
#define IGT_SPIN_BATCH 1
struct drm_i915_gem_execbuffer2 execbuf;
unsigned int flags;
#define SPIN_CLFLUSH (1 << 0)
struct igt_spin_factory opts;
struct xe_spin *xe_spin;
enum intel_driver driver;
size_t bo_size;
uint64_t address;
unsigned int engine;
uint32_t vm;
uint32_t syncobj;
} igt_spin_t;
struct igt_cork {
enum igt_cork_type type;
union {
int fd;
struct igt_cork_vgem vgem;
struct igt_cork_sw_sync sw_sync;
};
};