Skip to content

Commit 985c0d1

Browse files
[libc][mincore] use correct page_size for test (#73984)
1 parent 8123fd9 commit 985c0d1

File tree

2 files changed

+49
-30
lines changed

2 files changed

+49
-30
lines changed

libc/test/src/sys/mman/linux/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,6 @@ add_libc_unittest(
7676
libc.src.sys.mman.munmap
7777
libc.src.sys.mman.madvise
7878
libc.src.sys.mman.mincore
79+
libc.src.unistd.sysconf
7980
libc.test.UnitTest.ErrnoSetterMatcher
8081
)

libc/test/src/sys/mman/linux/mincore_test.cpp

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
#include "src/sys/mman/mincore.h"
1212
#include "src/sys/mman/mmap.h"
1313
#include "src/sys/mman/munmap.h"
14+
#include "src/unistd/sysconf.h"
1415
#include "test/UnitTest/ErrnoSetterMatcher.h"
1516
#include "test/UnitTest/LibcTest.h"
1617
#include "test/UnitTest/Test.h"
1718

18-
#include <linux/param.h> // For EXEC_PAGESIZE
1919
#include <sys/mman.h>
20+
#include <unistd.h> // For sysconf.
2021

2122
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
2223
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
@@ -28,88 +29,105 @@ TEST(LlvmLibcMincoreTest, UnMappedMemory) {
2829
EXPECT_THAT(res, Fails(ENOMEM, -1));
2930
}
3031

32+
// It is always possible to find an aligned boundary if we allocate page sized
33+
// memory.
34+
static char *aligned_addr(void *addr, size_t alignment) {
35+
char *byte_addr = static_cast<char *>(addr);
36+
uintptr_t addr_val = reinterpret_cast<uintptr_t>(addr);
37+
uintptr_t offset =
38+
addr_val % alignment == 0 ? 0 : alignment - (addr_val % alignment);
39+
return byte_addr + offset;
40+
}
41+
3142
TEST(LlvmLibcMincoreTest, InvalidVec) {
32-
void *addr = LIBC_NAMESPACE::mmap(nullptr, 4 * EXEC_PAGESIZE, PROT_READ,
43+
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
44+
void *addr = LIBC_NAMESPACE::mmap(nullptr, 5 * page_size, PROT_READ,
3345
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
3446
EXPECT_NE(addr, MAP_FAILED);
35-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % EXEC_PAGESIZE, 0ul);
47+
// Since we allocated 5 pages, we can find an aligned boundary after which
48+
// there are at least 4 pages
49+
char *aligned = aligned_addr(addr, page_size);
3650
libc_errno = 0;
37-
int res = LIBC_NAMESPACE::mincore(addr, 1, nullptr);
51+
int res = LIBC_NAMESPACE::mincore(aligned, 1, nullptr);
3852
EXPECT_THAT(res, Fails(EFAULT, -1));
39-
void *area =
40-
LIBC_NAMESPACE::mmap(nullptr, EXEC_PAGESIZE, PROT_READ | PROT_WRITE,
41-
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
53+
void *area = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ | PROT_WRITE,
54+
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
4255
EXPECT_NE(area, MAP_FAILED);
43-
unsigned char *ptr = static_cast<unsigned char *>(area) + EXEC_PAGESIZE - 3;
44-
res = LIBC_NAMESPACE::mincore(addr, 4 * EXEC_PAGESIZE, ptr);
56+
unsigned char *ptr = static_cast<unsigned char *>(area) + page_size - 3;
57+
res = LIBC_NAMESPACE::mincore(aligned, 4 * page_size, ptr);
4558
EXPECT_THAT(res, Fails(EFAULT, -1));
46-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, EXEC_PAGESIZE), Succeeds());
47-
EXPECT_THAT(LIBC_NAMESPACE::munmap(area, 2), Succeeds());
59+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, 5 * page_size), Succeeds());
60+
EXPECT_THAT(LIBC_NAMESPACE::munmap(area, page_size), Succeeds());
4861
}
4962

5063
TEST(LlvmLibcMincoreTest, UnalignedAddr) {
51-
void *addr = LIBC_NAMESPACE::mmap(nullptr, EXEC_PAGESIZE, PROT_READ,
64+
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
65+
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ,
5266
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
5367
EXPECT_NE(addr, MAP_FAILED);
54-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % EXEC_PAGESIZE, 0ul);
68+
char *aligned = aligned_addr(addr, page_size);
5569
libc_errno = 0;
56-
int res = LIBC_NAMESPACE::mincore(static_cast<char *>(addr) + 1, 1, nullptr);
70+
int res = LIBC_NAMESPACE::mincore(aligned + 1, 1, nullptr);
5771
EXPECT_THAT(res, Fails(EINVAL, -1));
58-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, EXEC_PAGESIZE), Succeeds());
72+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
5973
}
6074

6175
TEST(LlvmLibcMincoreTest, NoError) {
62-
void *addr = LIBC_NAMESPACE::mmap(nullptr, EXEC_PAGESIZE, PROT_READ,
76+
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
77+
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ,
6378
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
6479
EXPECT_NE(addr, MAP_FAILED);
65-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % EXEC_PAGESIZE, 0ul);
80+
char *aligned = aligned_addr(addr, page_size);
6681
unsigned char vec;
6782
libc_errno = 0;
68-
int res = LIBC_NAMESPACE::mincore(addr, 1, &vec);
83+
int res = LIBC_NAMESPACE::mincore(aligned, 1, &vec);
6984
EXPECT_THAT(res, Succeeds());
70-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, EXEC_PAGESIZE), Succeeds());
85+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
7186
}
7287

7388
TEST(LlvmLibcMincoreTest, NegativeLength) {
74-
void *addr = LIBC_NAMESPACE::mmap(nullptr, EXEC_PAGESIZE, PROT_READ,
89+
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
90+
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ,
7591
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
7692
EXPECT_NE(addr, MAP_FAILED);
77-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % EXEC_PAGESIZE, 0ul);
93+
char *aligned = aligned_addr(addr, page_size);
7894
unsigned char vec;
7995
libc_errno = 0;
80-
int res = LIBC_NAMESPACE::mincore(addr, -1, &vec);
96+
int res = LIBC_NAMESPACE::mincore(aligned, -1, &vec);
8197
EXPECT_THAT(res, Fails(ENOMEM, -1));
82-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, EXEC_PAGESIZE), Succeeds());
98+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
8399
}
84100

85101
TEST(LlvmLibcMincoreTest, PageOut) {
86102
unsigned char vec;
103+
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
104+
// allocate 2 pages since we need to page out page_size bytes
87105
void *addr =
88-
LIBC_NAMESPACE::mmap(nullptr, EXEC_PAGESIZE, PROT_READ | PROT_WRITE,
106+
LIBC_NAMESPACE::mmap(nullptr, 2 * page_size, PROT_READ | PROT_WRITE,
89107
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
90108
EXPECT_NE(addr, MAP_FAILED);
91-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % EXEC_PAGESIZE, 0ul);
109+
char *aligned = aligned_addr(addr, page_size);
92110

93111
// touch the page
94112
{
95-
static_cast<char *>(addr)[0] = 0;
113+
aligned[0] = 0;
96114
libc_errno = 0;
97-
int res = LIBC_NAMESPACE::mincore(addr, 1, &vec);
115+
int res = LIBC_NAMESPACE::mincore(aligned, 1, &vec);
98116
EXPECT_EQ(vec & 1u, 1u);
99117
EXPECT_THAT(res, Succeeds());
100118
}
101119

102120
// page out the memory
103121
{
104122
libc_errno = 0;
105-
EXPECT_THAT(LIBC_NAMESPACE::madvise(addr, EXEC_PAGESIZE, MADV_DONTNEED),
123+
EXPECT_THAT(LIBC_NAMESPACE::madvise(aligned, page_size, MADV_DONTNEED),
106124
Succeeds());
107125

108126
libc_errno = 0;
109-
int res = LIBC_NAMESPACE::mincore(addr, EXEC_PAGESIZE, &vec);
127+
int res = LIBC_NAMESPACE::mincore(aligned, 1, &vec);
110128
EXPECT_EQ(vec & 1u, 0u);
111129
EXPECT_THAT(res, Succeeds());
112130
}
113131

114-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, EXEC_PAGESIZE), Succeeds());
132+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, 2 * page_size), Succeeds());
115133
}

0 commit comments

Comments
 (0)