[PATCH v2 1/2] selftests: sync: add test that waits on a destroyed timeline

Chris Wilson chris at chris-wilson.co.uk
Thu Sep 7 19:09:41 UTC 2017


Quoting Gustavo Padovan (2017-09-07 20:02:45)
> From: Emilio López <emilio.lopez at collabora.co.uk>
> 
> If a sw_sync_timeline is destroyed the fences associated to it need
> to be signalled. This test checks that.
> 
> Cc: Shuah Khan <shuah at kernel.org>
> Cc: linux-kselftest at vger.kernel.org
> Signed-off-by: Emilio López <emilio.lopez at collabora.co.uk>
> Signed-off-by: Gustavo Padovan <gustavo.padovan at collabora.com>
> ---
>  tools/testing/selftests/sync/sync_test.c |  1 +
>  tools/testing/selftests/sync/sync_wait.c | 58 ++++++++++++++++++++++++++++++++
>  tools/testing/selftests/sync/synctest.h  |  1 +
>  3 files changed, 60 insertions(+)
> 
> diff --git a/tools/testing/selftests/sync/sync_test.c b/tools/testing/selftests/sync/sync_test.c
> index 62fa666e501a..5d93c9dcc290 100644
> --- a/tools/testing/selftests/sync/sync_test.c
> +++ b/tools/testing/selftests/sync/sync_test.c
> @@ -79,6 +79,7 @@ int main(void)
>         err += RUN_TEST(test_fence_one_timeline_merge);
>         err += RUN_TEST(test_fence_merge_same_fence);
>         err += RUN_TEST(test_fence_multi_timeline_wait);
> +       err += RUN_TEST(test_fence_wait_on_destroyed_timeline);
>         err += RUN_TEST(test_stress_two_threads_shared_timeline);
>         err += RUN_TEST(test_consumer_stress_multi_producer_single_consumer);
>         err += RUN_TEST(test_merge_stress_random_merge);
> diff --git a/tools/testing/selftests/sync/sync_wait.c b/tools/testing/selftests/sync/sync_wait.c
> index d69b752f6550..82ad9f519959 100644
> --- a/tools/testing/selftests/sync/sync_wait.c
> +++ b/tools/testing/selftests/sync/sync_wait.c
> @@ -25,6 +25,7 @@
>   *  OTHER DEALINGS IN THE SOFTWARE.
>   */
>  
> +#include <pthread.h>
>  #include "sync.h"
>  #include "sw_sync.h"
>  #include "synctest.h"
> @@ -89,3 +90,60 @@ int test_fence_multi_timeline_wait(void)
>  
>         return 0;
>  }
> +
> +struct fds_test {
> +       int timeline;
> +       int fencesig, fencekill;
> +       int result;
> +};
> +
> +static int test_fence_wait_on_destroyed_timeline_thread(void *d)

A horrible cast later just because you didn't want to use s/int/void */
> +{
> +       struct fds_test *data = d;
> +       int ret;
> +
> +       /* in case of errors */
> +       data->result = 1;
> +
> +       ret = sw_sync_timeline_inc(data->timeline, 100);
> +       ASSERT(ret == 0, "Failure advancing timeline\n");

Just return the error, e.g.  return "err string";
Only allow explosions from the main thread.

> +
> +       ret = sync_wait(data->fencekill, -1);
> +       ASSERT(ret == 1, "Failure waiting on fence\n");
> +
> +       /* no errors occurred */
> +       data->result = 0;
> +       return 0;
> +}
> +
> +int test_fence_wait_on_destroyed_timeline(void)
> +{
> +       struct fds_test data;
> +       pthread_t thread;
> +       int valid;
> +
> +       data.timeline = sw_sync_timeline_create();
> +       valid = sw_sync_timeline_is_valid(data.timeline);
> +       ASSERT(valid, "Failure allocating timeline\n");
> +
> +       data.fencesig = sw_sync_fence_create(data.timeline, "allocFence", 100);
> +       data.fencekill = sw_sync_fence_create(data.timeline, "allocFence", 200);
> +
> +       /* Spawn a thread to wait on a fence when the timeline is killed */
> +       pthread_create(&thread, NULL, (void *(*)(void *))
> +                      test_fence_wait_on_destroyed_timeline_thread, &data);
> +
> +       /* Wait for the thread to spool up */
> +       sync_wait(data.fencesig, -1);
> +
> +       /* Kill the timeline */
> +       sw_sync_timeline_destroy(data.timeline);
> +
> +       /* wait for the thread to clean up */
> +       pthread_join(thread, NULL);

So in case of bug, we block forever. That suggests that you want to use a
timeout, 10s?
-Chris


More information about the dri-devel mailing list