[igt-dev] [PATCH i-g-t v3 01/11] lib/igt_dummyload: add igt_cork
Chris Wilson
chris at chris-wilson.co.uk
Fri Feb 16 09:44:08 UTC 2018
Quoting Antonio Argenziano (2018-02-16 00:43:00)
> From: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
>
> The "cork" bo (imported bo with attached fence) and fence is used in several
> tests to stall execution. Moving it to a common place makes the codebase
> cleaner.
>
> Note that the actual test updates is done in follow up patches as it is
> simpler to do in one go after one more common function is added in the
> next patch.
>
> v2: don't use new/free naming, don't use dynamic alloc (Chris)
> v3: add sw_sync common functions. (Chris)
>
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Signed-off-by: Antonio Argenziano <antonio.argenziano at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> ---
> lib/igt_dummyload.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> lib/igt_dummyload.h | 15 +++++++
> 2 files changed, 134 insertions(+)
>
> diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
> index 27eb402b..bd12d283 100644
> --- a/lib/igt_dummyload.c
> +++ b/lib/igt_dummyload.c
> @@ -29,12 +29,14 @@
> #include <i915_drm.h>
>
> #include "igt_core.h"
> +#include "drmtest.h"
> #include "igt_dummyload.h"
> #include "igt_gt.h"
> #include "intel_chipset.h"
> #include "intel_reg.h"
> #include "ioctl_wrappers.h"
> #include "sw_sync.h"
> +#include "igt_vgem.h"
>
> /**
> * SECTION:igt_dummyload
> @@ -371,3 +373,120 @@ void igt_terminate_spin_batches(void)
> igt_spin_batch_end(iter);
> pthread_mutex_unlock(&list_lock);
> }
> +
> +static uint32_t igt_cork_plug_vgem(int fd, struct igt_cork_vgem *cork)
> +{
> + struct vgem_bo bo;
> + int dmabuf;
> + uint32_t handle;
> +
> + cork->device = drm_open_driver(DRIVER_VGEM);
> + igt_require(vgem_has_fences(cork->device));
> +
> + bo.width = bo.height = 1;
> + bo.bpp = 4;
> + vgem_create(cork->device, &bo);
> + cork->fence = vgem_fence_attach(cork->device, &bo, VGEM_FENCE_WRITE);
> +
> + dmabuf = prime_handle_to_fd(cork->device, bo.handle);
> + handle = prime_fd_to_handle(fd, dmabuf);
> + close(dmabuf);
> +
> + return handle;
> +}
> +
> +static void igt_cork_unplug_vgem(struct igt_cork_vgem *cork)
> +{
> + igt_assert(cork->device);
> +
> + vgem_fence_signal(cork->device, cork->fence);
> + close(cork->device);
> + cork->device = -1;
> +}
> +
> +static uint32_t igt_cork_plug_sw_sync(struct igt_cork_sw_sync *cork)
> +{
> + int fence;
> +
> + igt_require_sw_sync();
> +
> + cork->timeline = sw_sync_timeline_create();
> + fence = sw_sync_timeline_create_fence(cork->timeline, 1);
> +
> + return fence;
> +}
> +
> +static void igt_cork_unplug_sw_sync(struct igt_cork_sw_sync *cork)
> +{
> + sw_sync_timeline_inc(cork->timeline, 1);
> + close(cork->timeline);
> +}
> +
> +/**
> + * igt_cork_plug:
> + * @fd: open drm file descriptor
> + * @method: method to utilize for corking.
> + * @cork: structure that will be filled with the state of the cork bo.
> + * Note: this has to match the corking method.
> + *
> + * 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.
> + *
> + * Returns:
> + * Handle of the imported BO / Sw sync fence FD.
> + */
> +uint32_t igt_cork_plug(int fd, unsigned method, void *cork)
unions are your friend here.
struct igt_cork {
enum igt_cork_type type;
union igt_cork_type {
int fd;
struct igt_cork_vgem {
int device;
uint32_t fence;
} vgem;
struct igt_cork_sw_sync {
int timeline;
} sw_sync;
};
}
void igt_cork_init(struct igt_cork *cork, enum igt_cork_type)
{
cork->type = type;
cork->fd = -1;
}
#define IGT_CORK(name, type) struct igt_cork name = { .type = type, .fd = -1}
#define IGT_CORK_HANDLE(name) IGT_CORK(name, CORK_VGEM_HANDLE)
#define IGT_CORK_FENCE(name) IGT_CORK(name, CORK_SYNC_FD)
uint32_t igt_cork_plug(struct igt_cork *cork, int fd)
{
igt_assert(cork->fd == -1);
switch (method) {
case CORK_SYNC_FD:
return plug_sync_fd(&cork->sw_sync, fd);
case CORK_VGEM_HANDLE:
return plug_vgem_handle(&cork->vgem, fd);
default:...
}
}
void igt_cork_unplug(struct igt_cork *cork)
{
switch (cork->type) {
case CORK_SYNC_FD:
return unplug_sync_fd(&cork->sw_sync);
case CORK_VGEM_HANDLE:
return unplug_vgem_handle(&cork->vgem);
}
}
More information about the igt-dev
mailing list