summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRafael Antognolli <[email protected]>2018-11-28 16:36:41 -0800
committerRafael Antognolli <[email protected]>2019-01-17 15:05:58 -0800
commit27478ce00e3619e2d3e6809a6e953295e8d651de (patch)
tree064b6436a95ee41543416a0ba7fcc2bb37252acf /src
parent4149d41f2e4ea02ca86975d25ab160e69bf0f8e5 (diff)
anv/tests: Fix block_pool_no_free test.
There were 2 problems with this test. First it was comparing highest, which was -1, with an uint32_t. So the current value would never be higher than that, and the assert would always be false. It just never reached this point because of the next problem. It was always looking for the highest value of each thread and storing it in thread_max. So a test case like this wouldn't work: [Thread]: [Blocks] [0]: [0, 32, 64, 96] [1]: [128, 160, 192, 224] [2]: [256, 288, 320, 352] Not only that would skip values and iterate only over thread number 2, instead of walking through all of them, but thread_max was also initialized to -1. And then compared to unsigned blocks[i][next[i]. We fix that by getting the smallest value of each thread, and checking if it is lower than thread_min, which is initialized to INT32_MAX. And then we end up walking through all the blocks of all threads. We also change "blocks" to be int32_t instead of uint32_t, since in some places (alloc_blocks) it was already referenced as int32_t, and that fixes the comparison to -1. v2: - keep highest initialized to -1, and change blocks to be int32_t. Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/tests/block_pool_no_free.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/intel/vulkan/tests/block_pool_no_free.c b/src/intel/vulkan/tests/block_pool_no_free.c
index 17006dd3bc7..787abf05820 100644
--- a/src/intel/vulkan/tests/block_pool_no_free.c
+++ b/src/intel/vulkan/tests/block_pool_no_free.c
@@ -33,8 +33,8 @@ struct job {
pthread_t thread;
unsigned id;
struct anv_block_pool *pool;
- uint32_t blocks[BLOCKS_PER_THREAD];
- uint32_t back_blocks[BLOCKS_PER_THREAD];
+ int32_t blocks[BLOCKS_PER_THREAD];
+ int32_t back_blocks[BLOCKS_PER_THREAD];
} jobs[NUM_THREADS];
@@ -72,7 +72,7 @@ static void *alloc_blocks(void *_job)
return NULL;
}
-static void validate_monotonic(uint32_t **blocks)
+static void validate_monotonic(int32_t **blocks)
{
/* A list of indices, one per thread */
unsigned next[NUM_THREADS];
@@ -80,30 +80,30 @@ static void validate_monotonic(uint32_t **blocks)
int highest = -1;
while (true) {
- /* First, we find which thread has the highest next element */
- int thread_max = -1;
- int max_thread_idx = -1;
+ /* First, we find which thread has the lowest next element */
+ int32_t thread_min = INT32_MAX;
+ int min_thread_idx = -1;
for (unsigned i = 0; i < NUM_THREADS; i++) {
if (next[i] >= BLOCKS_PER_THREAD)
continue;
- if (thread_max < blocks[i][next[i]]) {
- thread_max = blocks[i][next[i]];
- max_thread_idx = i;
+ if (thread_min > blocks[i][next[i]]) {
+ thread_min = blocks[i][next[i]];
+ min_thread_idx = i;
}
}
/* The only way this can happen is if all of the next[] values are at
* BLOCKS_PER_THREAD, in which case, we're done.
*/
- if (thread_max == -1)
+ if (thread_min == INT32_MAX)
break;
/* That next element had better be higher than the previous highest */
- assert(blocks[max_thread_idx][next[max_thread_idx]] > highest);
+ assert(blocks[min_thread_idx][next[min_thread_idx]] > highest);
- highest = blocks[max_thread_idx][next[max_thread_idx]];
- next[max_thread_idx]++;
+ highest = blocks[min_thread_idx][next[min_thread_idx]];
+ next[min_thread_idx]++;
}
}
@@ -128,7 +128,7 @@ static void run_test()
pthread_join(jobs[i].thread, NULL);
/* Validate that the block allocations were monotonic */
- uint32_t *block_ptrs[NUM_THREADS];
+ int32_t *block_ptrs[NUM_THREADS];
for (unsigned i = 0; i < NUM_THREADS; i++)
block_ptrs[i] = jobs[i].blocks;
validate_monotonic(block_ptrs);