diff options
author | Russell King <rmk+cubox@arm.linux.org.uk> | 2013-12-08 21:29:56 +0000 |
---|---|---|
committer | Russell King <rmk@arm.linux.org.uk> | 2013-12-08 22:02:42 +0000 |
commit | 6f2e8ec4c736fbffe3d0e0f1ec07f453910441a1 (patch) | |
tree | 3adfc685d5addab0a3d7a609a0d620b0046a6bee /bmm_test.c | |
parent | dcad449e26e81b71e4a498dc5bfaf014a5566acd (diff) |
This is a complete redesign and rewrite of libbmm. This implementation
is based upon dma_bufs - where a dma_buf is a kernel-side buffer which
can be passed to and from other subsystems. libbmm becomes a provider
of dma_bufs - it permits userspace to allocate such things.
When a dma_buf is allocated, userspace is handed a file descriptor
which is unique to this buffer. This file descriptor can then be
passed into other subsystems, which can then request access to this
buffer.
The file descriptor supports very few operations - it can be mmap()d to
provide userspace access to the buffer, and it can be closed when it is
no longer required. Internally in the kernel, dma_bufs are reference
counted, so the dma_buf will only be freed when the last user gives up
its reference.
Diffstat (limited to 'bmm_test.c')
-rw-r--r-- | bmm_test.c | 324 |
1 files changed, 0 insertions, 324 deletions
diff --git a/bmm_test.c b/bmm_test.c deleted file mode 100644 index ceadf9c..0000000 --- a/bmm_test.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - * bmm_test.c - * - * Buffer Management Module - * - * User test application - * - * Li Li (lea.li@marvell.com) - - *(C) Copyright 2007 Marvell International Ltd. - * All Rights Reserved - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <signal.h> -#include <unistd.h> -#include <sys/wait.h> -#include <sys/types.h> -#include <sys/time.h> -#include "bmm_lib.h" - -static int debug = 0; - -int test_count = 0; -int pass_count = 0; -int fail_count = 0; - -#define PRINT_TEST_NAME printf("Testing %d: %s()\n", test_count++, __FUNCTION__) -#define PRINT_TEST_RESULT(x) \ - do { \ - if(!x) \ - pass_count++, printf("\tPassed.\n"); \ - else \ - fail_count++, printf("\tFailed.\n"); \ - } while(0) -#define PRINT_TEST_RESULTS() printf("Passed/Failed = %d/%d\n", pass_count, fail_count) - -static int test_bmm_init(void) -{ - int ret; - - PRINT_TEST_NAME; - - ret = bmm_init(); - printf("\tbmm_init() return %d\n", ret); - - return (ret <= 0); -} - -static int test_bmm_get_space(void) -{ - unsigned long total_size; - unsigned long free_size; - - PRINT_TEST_NAME; - - total_size = bmm_get_total_space(); - free_size = bmm_get_free_space(); - - printf("\tbmm_get_total_space() return %ldKB\n", total_size/1024); - printf("\tbmm_get_free_space() return %ldKB\n", free_size/1024); - - return (total_size <= 0 || total_size != free_size); -} - -static int test_bmm_malloc(unsigned long size, int attr) -{ - void *vaddr; - unsigned long allocated_size1, free_size1; - unsigned long allocated_size2, free_size2; - unsigned long allocated_size3, free_size3; - int off = 0; - PRINT_TEST_NAME; - - allocated_size1 = bmm_get_allocated_space(); - free_size1 = bmm_get_free_space(); - vaddr = bmm_malloc(size, attr); - if(vaddr == NULL) { - printf("\tno enough memory\n"); - return -1; - } - for(off = 0; off < size; off += 1024*1024){ - unsigned long get_paddr = bmm_get_paddr(vaddr+off); - void *get_vaddr = bmm_get_vaddr(get_paddr); - int get_attr = bmm_get_mem_attr(get_vaddr); - printf("\toff = 0x%x, vaddr=0x%p, get_vaddr=0x%p, get_paddr=0x%08lx\n", off, vaddr+off, get_vaddr, get_paddr); - printf("\tset_attr=0x%x, get_attr=0x%x\n", attr, get_attr); - if(vaddr+off != get_vaddr) - return -1; - } - - allocated_size2 = bmm_get_allocated_space(); - free_size2 = bmm_get_free_space(); - bmm_free(vaddr); - allocated_size3 = bmm_get_allocated_space(); - free_size3 = bmm_get_free_space(); - - printf("\tbmm_malloc(%ldKB) return 0x%08lx\n", size/1024, (unsigned long)vaddr); - printf("\tbmm_get_allocated_space() return %ldKB %ldKB %ldKB\n", - allocated_size1/1024, allocated_size2/1024, allocated_size3/1024); - printf("\tbmm_get_free_space() return %ldKB %ldKB %ldKB\n", - free_size1/1024, free_size2/1024, free_size3/1024); - - return ( - allocated_size2 - allocated_size1 != size || - allocated_size1 != allocated_size3 || - free_size1 - free_size2 != size || - free_size1 != free_size3); -} - -static long gettickcount(void) -{ - struct timeval g_tv; - struct timezone g_tz; - - gettimeofday(&g_tv, &g_tz); - - return g_tv.tv_sec * 1000000 + g_tv.tv_usec; -} - -static int test_bmm_flush_user(unsigned long size) -{ - char *src; - long t1 = 0, t2 = 0; - - PRINT_TEST_NAME; - - src = malloc(size); - if (src == NULL) { - printf("\tno enough memory\n"); - return -1; - } - t1 = gettickcount(); - bmm_flush_user(src, size, BMM_DMA_TO_DEVICE); - t2 = gettickcount(); - printf("bmm_flush_user 0x%lx memory cost %ldusec\n", size, t2-t1); - free(src); - - src = bmm_malloc(size, BMM_ATTR_DEFAULT); - if (src == NULL) { - printf("\tno enough memory\n"); - return -1; - } - t1 = gettickcount(); - bmm_flush_cache_range(src, size, BMM_DMA_TO_DEVICE); - t2 = gettickcount(); - printf("bmm_flush_cache_range 0x%lx memory cost %ldusec\n", size, t2-t1); - bmm_free(src); - - return 0; -} - -static int test_bmm_share(unsigned long size) -{ - char *src; - char *dst; - unsigned long psrc; - unsigned long pdst; - unsigned long i; - unsigned long off, len; - unsigned long free_size1; - unsigned long free_size2; - unsigned long free_size3; - int ret = 0; - int pid = 0; - int pid1 = 0; - int pid2 = 0; - int ret1 = 0; - int ret2 = 0; - - PRINT_TEST_NAME; - - free_size1 = bmm_get_free_space(); - src = bmm_malloc(size, BMM_ATTR_DEFAULT); - memset(src, 0, size); - free_size2 = bmm_get_free_space(); - if(src == NULL) { - printf("\tno enough memory\n"); - return -1; - } - psrc = bmm_get_paddr(src); - printf("\tFork 3 sub processes...\n"); - pid1 = fork(); - if(pid1 != 0) { - pid2 = fork(); - if(pid2 != 0) { - off = 0; - len = size; - dst = bmm_attach(psrc + off, len); - for(i=0; i<size; i++) - src[i] = i; - bmm_flush_cache(src, BMM_DMA_TO_DEVICE); - sleep(1); - kill(0, SIGCONT); - waitpid(pid2, &ret2, 0); - waitpid(pid1, &ret1, 0); - ret2 = WEXITSTATUS(ret2) ? -1 : 0; - ret1 = WEXITSTATUS(ret1) ? -1 : 0; - pid = 0; - } else { - raise(SIGSTOP); - off = 4096; - len = 4096; - dst = bmm_attach(psrc + off, len); - pid = 1; - } - } else { - pid2 = fork(); - if(pid2 != 0) { - raise(SIGSTOP); - off = size / 4; - len = size / 2; - dst = bmm_attach(psrc + off, len); - waitpid(pid2, &ret2, 0); - ret2 = WEXITSTATUS(ret2) ? -1 : 0; - pid = 2; - } else { - raise(SIGSTOP); - off = size - 4096; - len = 4096; - dst = bmm_attach(psrc + off, len); - pid = 3; - } - } - - pdst = bmm_get_paddr(dst); - if(pdst == psrc + off) - printf("\t[%d] pdst(0x%08lx) == psrc(0x%08lx) + off(%lx)\n", pid, pdst, psrc, off); - else - printf("\t[%d] Error: pdst(0x%08lx) != psrc(0x%08lx) + off(%lx)\n", pid, pdst, psrc, off); - - bmm_flush_cache(dst, BMM_DMA_FROM_DEVICE); - for(i=0; i<len; i++) { - if(dst[i] != (char)(off+i)) { - ret--; - if(debug) - printf("\t[%d] [%ld+%ld]: %d != %d\n", pid, off, i, dst[i], (char)(off+i)); - else - break; - } - } - - bmm_detach(dst, len); - - printf("\t[%d] bmm_share(%ldKB/%ld-%ld) = %d\n", pid, size/1024, off, len, ret); - - if(pid1 == 0 || pid2 == 0) - exit(ret); - - bmm_free(src); - free_size3 = bmm_get_free_space(); - - printf("\t[%d] bmm_get_free_space() return %ldKB %ldKB %ldKB\n", - pid, free_size1/1024, free_size2/1024, free_size3/1024); - - if(ret || ret1 || ret2) - return ret + ret1 + ret2; - - printf("\tShare content OK. Checking free space...\n"); - - return (free_size1 - free_size2 != size || free_size1 != free_size3); -} - -int main(int argc, char * argv[]) -{ - int ret; - unsigned long i, n; - pid_t pid = getpid(); - - if(argc > 1) { - debug = 1; - if(!strcmp(argv[1], "dump")) { - ret = test_bmm_get_space(); - PRINT_TEST_RESULT(ret); - bmm_dump(); - return 0; - } - } - - printf("%s running with pid=%d/%x\n", argv[0], pid, pid); - - if(debug) - bmm_dump(); - - ret = test_bmm_init(); - PRINT_TEST_RESULT(ret); - - ret = test_bmm_get_space(); - PRINT_TEST_RESULT(ret); - - n = 8; - for(i=1; i<=n; i++) { - ret = test_bmm_malloc(i*1024*1024, BMM_ATTR_DEFAULT); - PRINT_TEST_RESULT(ret); - } - for(i=n; i>=1; i--) { - ret = test_bmm_malloc(i*1024*1024, BMM_ATTR_NONCACHED); - PRINT_TEST_RESULT(ret); - } - - n = 8; - for(i=1; i<=n; i++) { - ret = test_bmm_share(i*1024*1024); - PRINT_TEST_RESULT(ret); - } - - n = 1; - ret = test_bmm_flush_user(n*1024*1024); - PRINT_TEST_RESULT(ret); - PRINT_TEST_RESULTS(); - - if(debug) - bmm_dump(); - - bmm_exit(); - - if(debug) - bmm_dump(); - - return 0; -} - |