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#include "ion_test_fixture.h" 23363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 24363441b120aa7ff4ec7c639bac099e775c2ace69Colin Crossclass Allocate : public IonAllHeapsTest { 25363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross}; 26363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 27363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Allocate, Allocate) 28363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 29363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 30363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 31363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 32363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 33363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 34363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ion_user_handle_t handle = 0; 35363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, 0, &handle)); 36363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(handle != 0); 37363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_free(m_ionFd, handle)); 38363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 39363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 40363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 41363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 42363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Allocate, AllocateCached) 43363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 44363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 45363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 46363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 47363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 48363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 49363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ion_user_handle_t handle = 0; 50363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, ION_FLAG_CACHED, &handle)); 51363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(handle != 0); 52363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_free(m_ionFd, handle)); 53363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 54363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 55363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 56363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 57363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Allocate, AllocateCachedNeedsSync) 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 ion_user_handle_t handle = 0; 65363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, ION_FLAG_CACHED_NEEDS_SYNC, &handle)); 66363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(handle != 0); 67363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_free(m_ionFd, handle)); 68363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 69363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 70363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 71363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 72363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Allocate, RepeatedAllocate) 73363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 74363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 75363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 76363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (size_t size : allocationSizes) { 77363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 78363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "size " << size); 79363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ion_user_handle_t handle = 0; 80363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 81363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int i = 0; i < 1024; i++) { 82363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "iteration " << i); 83363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, 0, &handle)); 84363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(handle != 0); 85363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_free(m_ionFd, handle)); 86363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 87363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 88363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 89363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 90363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 91363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Allocate, Zeroed) 92363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 93363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross void *zeroes = calloc(4096, 1); 94363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 95363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 96363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 97363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int fds[16]; 98363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int i = 0; i < 16; i++) { 99363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 100363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 101363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc_fd(m_ionFd, 4096, 0, heapMask, 0, &map_fd)); 102363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 103363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 104363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross void *ptr = NULL; 105363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, map_fd, 0); 106363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 107363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 108363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross memset(ptr, 0xaa, 4096); 109363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 110363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, 4096)); 111363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross fds[i] = map_fd; 112363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 113363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 114363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int i = 0; i < 16; i++) { 115363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(fds[i])); 116363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 117363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 118363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int newIonFd = ion_open(); 119363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross int map_fd = -1; 120363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 121363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, ion_alloc_fd(newIonFd, 4096, 0, heapMask, 0, &map_fd)); 122363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_GE(map_fd, 0); 123363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 124363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross void *ptr = NULL; 125363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, map_fd, 0); 126363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_TRUE(ptr != NULL); 127363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 128363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, memcmp(ptr, zeroes, 4096)); 129363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 130363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, munmap(ptr, 4096)); 131363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(0, close(map_fd)); 132363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 133363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 134363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross free(zeroes); 135363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 136363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 137363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross 138363441b120aa7ff4ec7c639bac099e775c2ace69Colin CrossTEST_F(Allocate, Large) 139363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross{ 140363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross for (unsigned int heapMask : m_allHeaps) { 141363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 142363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ion_user_handle_t handle = 0; 143363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross ASSERT_EQ(-ENOMEM, ion_alloc(m_ionFd, 3UL*1024*1024*1024, 0, heapMask, 0, &handle)); 144363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross } 145363441b120aa7ff4ec7c639bac099e775c2ace69Colin Cross} 146