diff options
author | Dmitry Antipov <dmitry.antipov@linaro.org> | 2012-12-13 14:05:32 +0400 |
---|---|---|
committer | Dmitry Antipov <dmitry.antipov@linaro.org> | 2012-12-13 14:05:32 +0400 |
commit | db6bcc4716e55a7de011112598193e711be0d6b8 (patch) | |
tree | fbb4ff550080bea16e16e626d43529cc3b32abf7 | |
parent | 2b9fc2cd8ef210207b3bee3f068a2608d0a6611b (diff) | |
download | linaro-android-kernel-test-db6bcc4716e55a7de011112598193e711be0d6b8.tar.gz |
Add test case for ASHMEM_PURGE_ALL_CACHES ioctl.
-rw-r--r-- | ashmemtest-basic/ashmemtest.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/ashmemtest-basic/ashmemtest.c b/ashmemtest-basic/ashmemtest.c index 23d83d1..0b27b2d 100644 --- a/ashmemtest-basic/ashmemtest.c +++ b/ashmemtest-basic/ashmemtest.c @@ -481,6 +481,45 @@ void ashmem_prot (char *ashmemdev, size_t pagesize) printf ("%d [%s]: test passed\n", testno, __func__); } +void ashmem_purge (char *ashmemdev, size_t pagesize) +{ + void *mem; + struct ashmem_pin pin; + int i, fd, ret, size = pagesize * 16; + + testno++; + + /* allocate 16 pages */ + fd = test_open (ashmemdev, O_RDWR); + ret = ioctl (fd, ASHMEM_SET_SIZE, size); + if (ret < 0) + fatal (errno, "can't allocate %ld-bytes read-only region"); + mem = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (mem == MAP_FAILED) + fatal (errno, "can't map ashmem region"); + /* unpin all odd pages */ + for (i = 1; i < 16; i += 2) { + pin.offset = i * pagesize; + pin.len = pagesize; + ret = ioctl (fd, ASHMEM_UNPIN, &pin); + if (ret < 0) + fatal (errno, "can't unpin page %d of 16", i); + } + /* purge should release 8 pages */ + ret = ioctl (fd, ASHMEM_PURGE_ALL_CACHES); + if (ret != 8) { + if (ret < 0) + fatal (errno, "can't purge caches"); + else + fatal (0, "purge %d pages, but expect 8", ret); + } + if (munmap (mem, size)) + fatal (errno, "can't unmap ashmem region"); + test_close (fd); + + printf ("%d [%s]: test passed\n", testno, __func__); +} + int main(int argc, char *argv[]) { char ashmemdev[64]; @@ -495,5 +534,6 @@ int main(int argc, char *argv[]) ashmem_size (ashmemdev, pagesize); ashmem_mmap (ashmemdev, pagesize); ashmem_prot (ashmemdev, pagesize); + ashmem_purge (ashmemdev, pagesize); return 0; } |