xref: /xnu-11215.1.10/tests/big_map_test.c (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
1*8d741a5dSApple OSS Distributions #include <darwintest.h>
2*8d741a5dSApple OSS Distributions #include <dispatch/dispatch.h>
3*8d741a5dSApple OSS Distributions #include <execinfo.h>
4*8d741a5dSApple OSS Distributions #include <pthread.h>
5*8d741a5dSApple OSS Distributions #include <ptrauth.h>
6*8d741a5dSApple OSS Distributions #include <mach/mach.h>
7*8d741a5dSApple OSS Distributions #include <stdalign.h>
8*8d741a5dSApple OSS Distributions #include <sys/mman.h>
9*8d741a5dSApple OSS Distributions #include <sys/sysctl.h>
10*8d741a5dSApple OSS Distributions 
11*8d741a5dSApple OSS Distributions 
12*8d741a5dSApple OSS Distributions static const off_t gb = 1024 * 1024 * 1024;
13*8d741a5dSApple OSS Distributions 
14*8d741a5dSApple OSS Distributions static void
get_release_type(char * release_type,size_t release_type_len)15*8d741a5dSApple OSS Distributions get_release_type(char *release_type, size_t release_type_len)
16*8d741a5dSApple OSS Distributions {
17*8d741a5dSApple OSS Distributions 	int ret;
18*8d741a5dSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(ret = sysctlbyname("kern.osreleasetype", release_type, &release_type_len, NULL, 0), "sysctlbyname kern.osreleasetype");
19*8d741a5dSApple OSS Distributions }
20*8d741a5dSApple OSS Distributions 
21*8d741a5dSApple OSS Distributions static int64_t
get_hw_memsize(int64_t memsize)22*8d741a5dSApple OSS Distributions get_hw_memsize(int64_t memsize)
23*8d741a5dSApple OSS Distributions {
24*8d741a5dSApple OSS Distributions 	int ret;
25*8d741a5dSApple OSS Distributions 	size_t size = sizeof(memsize);
26*8d741a5dSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(ret = sysctlbyname("hw.memsize", &memsize, &size, NULL, 0), "sysctlbyname hw.memsize");
27*8d741a5dSApple OSS Distributions 
28*8d741a5dSApple OSS Distributions 	return memsize;
29*8d741a5dSApple OSS Distributions }
30*8d741a5dSApple OSS Distributions 
31*8d741a5dSApple OSS Distributions T_DECL(big_map_test,
32*8d741a5dSApple OSS Distributions     "Test that loads large blobs into memory up to 60 percent of gigs available.",
33*8d741a5dSApple OSS Distributions     T_META_ASROOT(true),
34*8d741a5dSApple OSS Distributions     T_META_CHECK_LEAKS(false))
35*8d741a5dSApple OSS Distributions {
36*8d741a5dSApple OSS Distributions 	int fd;
37*8d741a5dSApple OSS Distributions 	int64_t memsize = 0;
38*8d741a5dSApple OSS Distributions 	size_t release_type_len = 256;
39*8d741a5dSApple OSS Distributions 	char release_type[release_type_len];
40*8d741a5dSApple OSS Distributions 	const char required_release_type[] = "Darwin Cloud";
41*8d741a5dSApple OSS Distributions 
42*8d741a5dSApple OSS Distributions 	get_release_type(release_type, release_type_len);
43*8d741a5dSApple OSS Distributions 	if (strstr(release_type, required_release_type) == NULL) {
44*8d741a5dSApple OSS Distributions 		T_SKIP("Attempted to run on non psOS release type, skipping...");
45*8d741a5dSApple OSS Distributions 	}
46*8d741a5dSApple OSS Distributions 
47*8d741a5dSApple OSS Distributions 	memsize = get_hw_memsize(memsize);
48*8d741a5dSApple OSS Distributions 	float max_memory_gib = ((float)memsize / (float)gb) * .6;
49*8d741a5dSApple OSS Distributions 
50*8d741a5dSApple OSS Distributions 	if (max_memory_gib <= 11) {
51*8d741a5dSApple OSS Distributions 		T_SKIP("Not enough memory on device atleast (11GBs required), skipping...");
52*8d741a5dSApple OSS Distributions 	}
53*8d741a5dSApple OSS Distributions 
54*8d741a5dSApple OSS Distributions 	char file_path[] = "/tmp/bigfile.XXXXXX";
55*8d741a5dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(fd = mkstemp(file_path), NULL);
56*8d741a5dSApple OSS Distributions 	for (int gigs = 1; gigs <= max_memory_gib; gigs++) {
57*8d741a5dSApple OSS Distributions 		size_t bytes = gigs * gb;
58*8d741a5dSApple OSS Distributions 
59*8d741a5dSApple OSS Distributions 		T_LOG("trying %zu bytes (%d GB)\n", bytes, gigs);
60*8d741a5dSApple OSS Distributions 
61*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_POSIX_SUCCESS(ftruncate(fd, bytes), "ftruncate");
62*8d741a5dSApple OSS Distributions 
63*8d741a5dSApple OSS Distributions 		void *p = mmap(NULL, bytes, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);
64*8d741a5dSApple OSS Distributions 
65*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_NE(p, MAP_FAILED, "map");
66*8d741a5dSApple OSS Distributions 
67*8d741a5dSApple OSS Distributions 		T_QUIET; T_ASSERT_POSIX_SUCCESS(munmap(p, bytes), "munmap");
68*8d741a5dSApple OSS Distributions 	}
69*8d741a5dSApple OSS Distributions }
70