1363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross/* 2363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * Copyright (C) 2013 The Android Open Source Project 3363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * 4363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * you may not use this file except in compliance with the License. 6363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * You may obtain a copy of the License at 7363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * 8363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * http://www.apache.org/licenses/LICENSE-2.0 9363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * 10363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * Unless required by applicable law or agreed to in writing, software 11363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * See the License for the specific language governing permissions and 14363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross * limitations under the License. 15363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross */ 16363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 17363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include <sys/mman.h> 18363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 19363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include <gtest/gtest.h> 20363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 21363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include <ion/ion.h> 22363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 23363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross#include "ion_test_fixture.h" 24363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 25363441b120aa7ff4ec7c639bac099e775c2ace69Colin Crossclass Map : public IonAllHeapsTest { 26363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}; 27363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 28363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapHandle) 29363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 30363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 31363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 32363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 33363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 34363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 35363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ion_user_handle_t handle = 0; 36363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 37363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, 0, &handle)); 38363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(handle != 0); 39363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 40363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 41363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross unsigned char *ptr = NULL; 42363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_map(m_ionFd, handle, size, PROT_READ | PROT_WRITE, MAP_SHARED, 0, &ptr, &map_fd)); 43363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 44363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 45363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 46363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(map_fd)); 47363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 48363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_free(m_ionFd, handle)); 49363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 50363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr, 0xaa, size); 51363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 52363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, size)); 53363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 54363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 55363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 56363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 57363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapFd) 58363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 59363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 60363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 61363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 62363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 63363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 64363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 65363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 66363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &map_fd)); 67363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 68363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 69363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross void *ptr; 70363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 71363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 72363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 73363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(map_fd)); 74363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 75363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr, 0xaa, size); 76363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 77363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, size)); 78363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 79363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 80363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 81363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 82363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapOffset) 83363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 84363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 85363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 86363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 87363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 88363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc_fd(m_ionFd, PAGE_SIZE * 2, 0, heapMask, 0, &map_fd)); 89363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 90363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 91363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross unsigned char *ptr; 92363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = (unsigned char *)mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 93363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 94363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 95363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr, 0, PAGE_SIZE); 96363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr + PAGE_SIZE, 0xaa, PAGE_SIZE); 97363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 98363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, PAGE_SIZE * 2)); 99363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 100363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = (unsigned char *)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, PAGE_SIZE); 101363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 102363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 103363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(ptr[0], 0xaa); 104363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(ptr[PAGE_SIZE - 1], 0xaa); 105363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 106363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, PAGE_SIZE)); 107363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 108363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(map_fd)); 109363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 110363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 111363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 112363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapCached) 113363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 114363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 115363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 116363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 117363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 118363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 119363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 120363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross unsigned int flags = ION_FLAG_CACHED; 121363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 122363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, flags, &map_fd)); 123363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 124363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 125363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross void *ptr; 126363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 127363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 128363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 129363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(map_fd)); 130363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 131363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr, 0xaa, size); 132363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 133363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, size)); 134363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 135363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 136363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 137363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 138363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Map, MapCachedNeedsSync) 139363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 140363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 141363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 142363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 143363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 144363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 145363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 146363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross unsigned int flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC; 147363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 148363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, flags, &map_fd)); 149363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 150363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 151363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross void *ptr; 152363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 153363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 154363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 155363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(map_fd)); 156363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 157363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr, 0xaa, size); 158363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 159363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, size)); 160363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 161363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 162363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 163