summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmitry.antipov@linaro.org>2012-12-13 14:05:32 +0400
committerDmitry Antipov <dmitry.antipov@linaro.org>2012-12-13 14:05:32 +0400
commitdb6bcc4716e55a7de011112598193e711be0d6b8 (patch)
treefbb4ff550080bea16e16e626d43529cc3b32abf7
parent2b9fc2cd8ef210207b3bee3f068a2608d0a6611b (diff)
downloadlinaro-android-kernel-test-db6bcc4716e55a7de011112598193e711be0d6b8.tar.gz
Add test case for ASHMEM_PURGE_ALL_CACHES ioctl.
-rw-r--r--ashmemtest-basic/ashmemtest.c40
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;
}