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