Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest: sync: fence tests for sw_sync framework

These tests are based on the libsync test suite from Android.
This commit includes tests for basic fence creation.

Signed-off-by: Emilio López <emilio.lopez@collabora.co.uk>
Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>

authored by

Emilio López and committed by
Shuah Khan
6a5b7d2c 82208160

+140
+1
tools/testing/selftests/sync/Makefile
··· 11 11 OBJS = sync_test.o sync.o 12 12 13 13 TESTS += sync_alloc.o 14 + TESTS += sync_fence.o 14 15 15 16 sync_test: $(OBJS) $(TESTS) 16 17
+132
tools/testing/selftests/sync/sync_fence.c
··· 1 + /* 2 + * sync fence tests with one timeline 3 + * Copyright 2015-2016 Collabora Ltd. 4 + * 5 + * Based on the implementation from the Android Open Source Project, 6 + * 7 + * Copyright 2012 Google, Inc 8 + * 9 + * Permission is hereby granted, free of charge, to any person obtaining a 10 + * copy of this software and associated documentation files (the "Software"), 11 + * to deal in the Software without restriction, including without limitation 12 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 + * and/or sell copies of the Software, and to permit persons to whom the 14 + * Software is furnished to do so, subject to the following conditions: 15 + * 16 + * The above copyright notice and this permission notice shall be included in 17 + * all copies or substantial portions of the Software. 18 + * 19 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 23 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 24 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25 + * OTHER DEALINGS IN THE SOFTWARE. 26 + */ 27 + 28 + #include "sync.h" 29 + #include "sw_sync.h" 30 + #include "synctest.h" 31 + 32 + int test_fence_one_timeline_wait(void) 33 + { 34 + int fence, valid, ret; 35 + int timeline = sw_sync_timeline_create(); 36 + 37 + valid = sw_sync_timeline_is_valid(timeline); 38 + ASSERT(valid, "Failure allocating timeline\n"); 39 + 40 + fence = sw_sync_fence_create(timeline, "allocFence", 5); 41 + valid = sw_sync_fence_is_valid(fence); 42 + ASSERT(valid, "Failure allocating fence\n"); 43 + 44 + /* Wait on fence until timeout */ 45 + ret = sync_wait(fence, 0); 46 + ASSERT(ret == 0, "Failure waiting on fence until timeout\n"); 47 + 48 + /* Advance timeline from 0 -> 1 */ 49 + ret = sw_sync_timeline_inc(timeline, 1); 50 + ASSERT(ret == 0, "Failure advancing timeline\n"); 51 + 52 + /* Wait on fence until timeout */ 53 + ret = sync_wait(fence, 0); 54 + ASSERT(ret == 0, "Failure waiting on fence until timeout\n"); 55 + 56 + /* Signal the fence */ 57 + ret = sw_sync_timeline_inc(timeline, 4); 58 + ASSERT(ret == 0, "Failure signaling the fence\n"); 59 + 60 + /* Wait successfully */ 61 + ret = sync_wait(fence, 0); 62 + ASSERT(ret > 0, "Failure waiting on fence\n"); 63 + 64 + /* Go even further, and confirm wait still succeeds */ 65 + ret = sw_sync_timeline_inc(timeline, 10); 66 + ASSERT(ret == 0, "Failure going further\n"); 67 + ret = sync_wait(fence, 0); 68 + ASSERT(ret > 0, "Failure waiting ahead\n"); 69 + 70 + sw_sync_fence_destroy(fence); 71 + sw_sync_timeline_destroy(timeline); 72 + 73 + return 0; 74 + } 75 + 76 + int test_fence_one_timeline_merge(void) 77 + { 78 + int a, b, c, d, valid; 79 + int timeline = sw_sync_timeline_create(); 80 + 81 + /* create fence a,b,c and then merge them all into fence d */ 82 + a = sw_sync_fence_create(timeline, "allocFence", 1); 83 + b = sw_sync_fence_create(timeline, "allocFence", 2); 84 + c = sw_sync_fence_create(timeline, "allocFence", 3); 85 + 86 + valid = sw_sync_fence_is_valid(a) && 87 + sw_sync_fence_is_valid(b) && 88 + sw_sync_fence_is_valid(c); 89 + ASSERT(valid, "Failure allocating fences\n"); 90 + 91 + d = sync_merge("mergeFence", b, a); 92 + d = sync_merge("mergeFence", c, d); 93 + valid = sw_sync_fence_is_valid(d); 94 + ASSERT(valid, "Failure merging fences\n"); 95 + 96 + /* confirm all fences have one active point (even d) */ 97 + ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1, 98 + "a has too many active fences!\n"); 99 + ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1, 100 + "b has too many active fences!\n"); 101 + ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1, 102 + "c has too many active fences!\n"); 103 + ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1, 104 + "d has too many active fences!\n"); 105 + 106 + /* confirm that d is not signaled until the max of a,b,c */ 107 + sw_sync_timeline_inc(timeline, 1); 108 + ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_SIGNALED) == 1, 109 + "a did not signal!\n"); 110 + ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 1, 111 + "d signaled too early!\n"); 112 + 113 + sw_sync_timeline_inc(timeline, 1); 114 + ASSERT(sync_fence_count_with_status(b, FENCE_STATUS_SIGNALED) == 1, 115 + "b did not signal!\n"); 116 + ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 1, 117 + "d signaled too early!\n"); 118 + 119 + sw_sync_timeline_inc(timeline, 1); 120 + ASSERT(sync_fence_count_with_status(c, FENCE_STATUS_SIGNALED) == 1, 121 + "c did not signal!\n"); 122 + ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 0 && 123 + sync_fence_count_with_status(d, FENCE_STATUS_SIGNALED) == 1, 124 + "d did not signal!\n"); 125 + 126 + sw_sync_fence_destroy(d); 127 + sw_sync_fence_destroy(c); 128 + sw_sync_fence_destroy(b); 129 + sw_sync_fence_destroy(a); 130 + sw_sync_timeline_destroy(timeline); 131 + return 0; 132 + }
+3
tools/testing/selftests/sync/sync_test.c
··· 62 62 err += RUN_TEST(test_alloc_fence); 63 63 err += RUN_TEST(test_alloc_fence_negative); 64 64 65 + err += RUN_TEST(test_fence_one_timeline_wait); 66 + err += RUN_TEST(test_fence_one_timeline_merge); 67 + 65 68 if (err) 66 69 printf("[FAIL]\tsync errors: %d\n", err); 67 70 else
+4
tools/testing/selftests/sync/synctest.h
··· 44 44 int test_alloc_fence(void); 45 45 int test_alloc_fence_negative(void); 46 46 47 + /* Fence tests with one timeline */ 48 + int test_fence_one_timeline_wait(void); 49 + int test_fence_one_timeline_merge(void); 50 + 47 51 #endif