[snip] On Wed, Apr 23, 2014 at 06:28:54AM -0700, Tvrtko Ursulin wrote: > On 04/18/2014 12:18 AM, Volkin, Bradley D wrote: > > On Wed, Mar 19, 2014 at 04:13:06AM -0700, Tvrtko Ursulin wrote: > >> +static void **handle_ptr_map; > >> +static unsigned int num_handle_ptr_map; > > > > I'd prefer that we explicitly initialize at least num_handle_ptr_map. > > To zero, why? Partly because I just like explicitly initialized variables and partly because I forgot that static variables are *guaranteed* to be initialized to zero vs just-happen-to-be-zero :) You can leave it as is or change it, I'm fine either way. Thanks, Brad > > >> + > >> +static void add_handle_ptr(uint32_t handle, void *ptr) > >> +{ > >> + if (handle >= num_handle_ptr_map) { > >> + handle_ptr_map = realloc(handle_ptr_map, > >> + (handle + 1000) * sizeof(void*)); > >> + num_handle_ptr_map = handle + 1000; > >> + } > >> + > >> + handle_ptr_map[handle] = ptr; > >> +} > >> + > >> +static void *get_handle_ptr(uint32_t handle) > >> +{ > >> + return handle_ptr_map[handle]; > >> +} > >> + > >> +static void free_handle_ptr(uint32_t handle) > >> +{ > >> + igt_assert(handle < num_handle_ptr_map); > >> + igt_assert(handle_ptr_map[handle]); > >> + > >> + free(handle_ptr_map[handle]); > >> + handle_ptr_map[handle] = NULL; > >> +} > >> + > >> +static uint32_t create_userptr_bo(int fd, int size) > >> +{ > >> + void *ptr; > >> + uint32_t handle; > >> + int ret; > >> + > >> + ret = posix_memalign(&ptr, PAGE_SIZE, size); > >> + igt_assert(ret == 0); > >> + > >> + ret = gem_userptr(fd, (uint32_t *)ptr, size, 0, &handle); > >> + igt_assert(ret == 0); > >> + add_handle_ptr(handle, ptr); > >> + > >> + return handle; > >> +} > >> + > >> +static void free_userptr_bo(int fd, uint32_t handle) > >> +{ > >> + gem_close(fd, handle); > >> + free_handle_ptr(handle); > >> +} > >> + > >> +static int has_userptr(int fd) > >> +{ > >> + uint32_t handle = 0; > >> + void *ptr; > >> + uint32_t oldflags; > >> + int ret; > >> + > >> + assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0); > >> + oldflags = userptr_flags; > >> + gem_userptr_test_unsynchronized(); > >> + ret = gem_userptr(fd, ptr, PAGE_SIZE, 0, &handle); > >> + userptr_flags = oldflags; > >> + if (ret != 0) { > >> + free(ptr); > >> + return 0; > >> + } > >> + > >> + gem_close(fd, handle); > >> + free(ptr); > >> + > >> + return handle != 0; > >> +} > >> + > >> +static const unsigned int nr_bos[] = {0, 1, 10, 100, 1000}; > >> +static const unsigned int test_duration_sec = 3; > >> + > >> +static volatile unsigned int run_test; > >> + > >> +static void alarm_handler(int sig) > >> +{ > >> + assert(run_test == 1); > >> + run_test = 0; > >> +} > >> + > >> +static void start_test(unsigned int duration) > >> +{ > >> + run_test = 1; > >> + if (duration == 0) > >> + duration = test_duration_sec; > >> + signal(SIGALRM, alarm_handler); > >> + alarm(duration); > >> +} > >> + > >> +static void exchange_ptr(void *array, unsigned i, unsigned j) > >> +{ > >> + void **arr, *tmp; > >> + arr = (void **)array; > >> + > >> + tmp = arr[i]; > >> + arr[i] = arr[j]; > >> + arr[j] = tmp; > >> +} > >> + > >> +static void test_malloc_free(int random) > >> +{ > >> + unsigned long iter = 0; > >> + unsigned int i, tot = 1000; > >> + void *ptr[tot]; > >> + > >> + start_test(test_duration_sec); > >> + > >> + while (run_test) { > >> + for (i = 0; i < tot; i++) { > >> + ptr[i] = malloc(1000); > >> + assert(ptr[i]); > >> + } > >> + if (random) > >> + igt_permute_array(ptr, tot, exchange_ptr); > >> + for (i = 0; i < tot; i++) > >> + free(ptr[i]); > >> + iter++; > >> + } > >> + > >> + printf("%8lu iter/s\n", iter / test_duration_sec); > >> +} > >> + > >> +static void test_malloc_realloc_free(int random) > >> +{ > >> + unsigned long iter = 0; > >> + unsigned int i, tot = 1000; > >> + void *ptr[tot]; > >> + > >> + start_test(test_duration_sec); > >> + > >> + while (run_test) { > >> + for (i = 0; i < tot; i++) { > >> + ptr[i] = malloc(1000); > >> + assert(ptr[i]); > >> + } > >> + if (random) > >> + igt_permute_array(ptr, tot, exchange_ptr); > >> + for (i = 0; i < tot; i++) { > >> + ptr[i] = realloc(ptr[i], 2000); > >> + assert(ptr[i]); > >> + } > >> + if (random) > >> + igt_permute_array(ptr, tot, exchange_ptr); > >> + for (i = 0; i < tot; i++) > >> + free(ptr[i]); > >> + iter++; > >> + } > >> + > >> + printf("%8lu iter/s\n", iter / test_duration_sec); > >> +} > >> + > >> +static void test_mmap_unmap(int random) > >> +{ > >> + unsigned long iter = 0; > >> + unsigned int i, tot = 1000; > >> + void *ptr[tot]; > >> + > >> + start_test(test_duration_sec); > >> + > >> + while (run_test) { > >> + for (i = 0; i < tot; i++) { > >> + ptr[i] = mmap(NULL, 1000, PROT_READ | PROT_WRITE, > >> + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); > >> + assert(ptr[i] != MAP_FAILED); > >> + } > >> + if (random) > >> + igt_permute_array(ptr, tot, exchange_ptr); > >> + for (i = 0; i < tot; i++) > >> + munmap(ptr[i], 1000); > >> + iter++; > >> + } > >> + > >> + printf("%8lu iter/s\n", iter / test_duration_sec); > >> +} > >> + > >> +static void test_ptr_read(void *ptr) > >> +{ > >> + unsigned long iter = 0; > >> + volatile unsigned long *p; > >> + unsigned long i, loops; > >> + register unsigned long v; > >> + > >> + loops = sizeof(linear) / sizeof(unsigned long) / 4; > >> + > >> + start_test(test_duration_sec); > >> + > >> + while (run_test) { > >> + p = (unsigned long *)ptr; > >> + for (i = 0; i < loops; i++) { > >> + v = *p++; > >> + v = *p++; > >> + v = *p++; > >> + v = *p++; > >> + } > >> + iter++; > >> + } > >> + > >> + printf("%8lu MB/s\n", iter / test_duration_sec * sizeof(linear) / 1000000); > >> +} > >> + > >> +static void test_ptr_write(void *ptr) > >> +{ > >> + unsigned long iter = 0; > >> + volatile unsigned long *p; > >> + register unsigned long i, loops; > >> + > >> + loops = sizeof(linear) / sizeof(unsigned long) / 4; > >> + > >> + start_test(test_duration_sec); > >> + > >> + while (run_test) { > >> + p = (unsigned long *)ptr; > >> + for (i = 0; i < loops; i++) { > >> + *p++ = i; > >> + *p++ = i; > >> + *p++ = i; > >> + *p++ = i; > >> + } > >> + iter++; > >> + } > >> + > >> + printf("%8lu MB/s\n", iter / test_duration_sec * sizeof(linear) / 1000000); > >> +} > >> + > >> +static void test_impact(int fd) > >> +{ > >> + unsigned int total = sizeof(nr_bos) / sizeof(nr_bos[0]); > >> + unsigned int subtest, i; > >> + uint32_t handles[nr_bos[total-1]]; > >> + void *ptr; > >> + char buffer[sizeof(linear)]; > >> + > >> + for (subtest = 0; subtest < total; subtest++) { > >> + for (i = 0; i < nr_bos[subtest]; i++) > >> + handles[i] = create_userptr_bo(fd, sizeof(linear)); > >> + > >> + if (nr_bos[subtest] > 0) > >> + ptr = get_handle_ptr(handles[0]); > >> + else > >> + ptr = buffer; > >> + > >> + printf("ptr-read, %5u bos = ", nr_bos[subtest]); > >> + test_ptr_read(ptr); > >> + > >> + printf("ptr-write %5u bos = ", nr_bos[subtest]); > >> + test_ptr_write(ptr); > >> + > >> + printf("malloc-free, %5u bos = ", nr_bos[subtest]); > >> + test_malloc_free(0); > >> + printf("malloc-free-random %5u bos = ", nr_bos[subtest]); > >> + test_malloc_free(1); > >> + > >> + printf("malloc-realloc-free, %5u bos = ", nr_bos[subtest]); > >> + test_malloc_realloc_free(0); > >> + printf("malloc-realloc-free-random, %5u bos = ", nr_bos[subtest]); > >> + test_malloc_realloc_free(1); > >> + > >> + printf("mmap-unmap, %5u bos = ", nr_bos[subtest]); > >> + test_mmap_unmap(0); > >> + printf("mmap-unmap-random, %5u bos = ", nr_bos[subtest]); > >> + test_mmap_unmap(1); > >> + > >> + for (i = 0; i < nr_bos[subtest]; i++) > >> + free_userptr_bo(fd, handles[i]); > >> + } > >> +} > >> + > >> +static void test_single(int fd) > >> +{ > >> + char *ptr, *bo_ptr; > >> + uint32_t handle = 0; > >> + unsigned long iter = 0; > >> + int ret; > >> + unsigned long map_size = sizeof(linear) + PAGE_SIZE - 1; > >> + > >> + ptr = mmap(NULL, map_size, PROT_READ | PROT_WRITE, > >> + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); > >> + assert(ptr != MAP_FAILED); > >> + > >> + bo_ptr = (char *)(((unsigned long)ptr + (PAGE_SIZE - 1)) > >> + & ~(PAGE_SIZE - 1)); > > > > You might add an ALIGN macro in this file or a suitable header. A couple of > > .c files in lib/ individually define one already. > > OK, will add that in the patch series. > > Thanks for the review! > > Regards, > > Tvrtko > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx