[Intel-gfx] [PATCH i-g-t 4/4] tests/syncobj: Add some wait and reset tests (v5)

Jason Ekstrand jason at jlekstrand.net
Thu Aug 10 16:02:56 UTC 2017


On Thu, Aug 10, 2017 at 2:40 AM, Chris Wilson <chris at chris-wilson.co.uk>
wrote:

> Quoting Jason Ekstrand (2017-08-10 06:35:43)
> > This adds both trivial error-checking tests as well as more complex
> > tests which actually test whether or not waits do what they're supposed
> > to do.  They only currently work on i915 but it should be simple to hook
> > them up for other drivers by simply implementing the little function
> > pointer hook provided at the top for triggering a syncobj.
> >
> > v2:
> >  - Actually add the reset tests.
> > v3:
> >  - Only do one execbuf for trigger
> >  - Use do_ioctl and do_ioctl_err
> >  - Better check for syncobj support
> >  - Add local_/LOCAL_ defines of things
> >  - Use a timer instead of a pthread
> > v4:
> >  - Use ioctl wrappers
> >  - Use VGEM instead of i915
> >  - Combine a bunch of the simple tests into one function
> > v5:
> >  - Combinatorially generate basic tests
> >  - Use sw_sync instead of using vgem directly
>
> Aye, sw_sync looks to be quite useful here - a completely driver
> agnostic method for signaling syncobj. Nice.
>
> > +static int
> > +syncobj_attach_sw_sync(int fd, uint32_t handle)
> > +{
> > +       struct drm_syncobj_handle;
> > +       int timeline, fence;
> > +
> > +       timeline = sw_sync_timeline_create();
> > +       fence = sw_sync_timeline_create_fence(timeline, 1);
> > +       syncobj_import_sync_file(fd, handle, fence);
> > +       close(fence);
> > +
> > +       return timeline;
> > +}
> > +
> > +static void
> > +syncobj_trigger(int fd, uint32_t handle)
> > +{
> > +       int timeline = syncobj_attach_sw_sync(fd, handle);
> > +       sw_sync_timeline_inc(timeline, 1);
> > +}
> > +
> > +struct delayed_trigger {
> > +       int fd;
> > +       uint32_t *syncobjs;
> > +       int count;
> > +       uint64_t nsec;
> > +};
> > +
> > +static void
> > +trigger_syncobj_delayed_func(union sigval sigval)
> > +{
> > +       struct delayed_trigger *trigger = sigval.sival_ptr;
> > +       int i;
> > +
> > +       for (i = 0; i < trigger->count; i++)
> > +               syncobj_trigger(trigger->fd, trigger->syncobjs[i]);
> > +       free(trigger);
> > +}
> > +
> > +static timer_t
> > +trigger_syncobj_delayed(int fd, uint32_t *syncobjs, int count, uint64_t
> nsec)
> > +{
> > +       struct delayed_trigger *trigger;
> > +        timer_t timer;
> > +        struct sigevent sev;
> > +        struct itimerspec its;
> > +
> > +       trigger = malloc(sizeof(*trigger));
> > +       trigger->fd = fd;
> > +       trigger->syncobjs = syncobjs;
> > +       trigger->count = count;
> > +       trigger->nsec = nsec;
> > +
> > +        memset(&sev, 0, sizeof(sev));
> > +        sev.sigev_notify = SIGEV_THREAD;
> > +        sev.sigev_value.sival_ptr = trigger;
> > +        sev.sigev_notify_function = trigger_syncobj_delayed_func;
> > +        igt_assert(timer_create(CLOCK_MONOTONIC, &sev, &timer) == 0);
> > +
> > +        memset(&its, 0, sizeof(its));
> > +        its.it_value.tv_sec = nsec / NSEC_PER_SEC;
> > +        its.it_value.tv_nsec = nsec % NSEC_PER_SEC;
> > +        igt_assert(timer_settime(timer, 0, &its, NULL) == 0);
> > +
> > +       return timer;
> > +}
>
> static void
> trigger_syncobj_delayed_func(union sigval sigval)
> {
>         int timeline = (intptr_t)sigval.sival_ptr;
>         sw_sync_timeline_inc(timeline, 1);
>         close(timeline);
> }
>
> static timer_t
> trigger_syncobj_delayed(int fd, uint32_t *syncobjs, int count, uint64_t
> nsec)
> {
>         struct itimerspec its;
>         struct sigevent sev;
>         int timeline, fence;
>         timer_t timer;
>
>         timeline = sw_sync_timeline_create();
>         fence = sw_sync_timeline_create_fence(timeline, 1);
>
>         for (int i = 0; i < count; i++)
>                 syncobj_import_sync_file(fd, syncobjs[i], fence);
>         close(fence);
>
>         memset(&sev, 0, sizeof(sev));
>         sev.sigev_notify = SIGEV_THREAD;
>         sev.sigev_value.sival_ptr = (intptr_t)timeline;
>         sev.sigev_notify_function = trigger_syncobj_delayed_func;
>         igt_assert(timer_create(CLOCK_MONOTONIC, &sev, &timer) == 0);
>
>         memset(&its, 0, sizeof(its));
>         its.it_value.tv_sec = nsec / NSEC_PER_SEC;
>         its.it_value.tv_nsec = nsec % NSEC_PER_SEC;
>         igt_assert(timer_settime(timer, 0, &its, NULL) == 0);
>
>         return timer;
> }
>

As i continue improving things, it's morphing to look more like that.
Actually my current test do it both ways.  The original way for
WAIT_FOR_SUBMIT and the way described above for normal waits.  There will
be a v6...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/intel-gfx/attachments/20170810/2fda2bd2/attachment.html>


More information about the Intel-gfx mailing list