xref: /xnu-12377.41.6/tests/skmem_sysctl_test.c (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1*bbb1b6f9SApple OSS Distributions #include <stdlib.h>
2*bbb1b6f9SApple OSS Distributions #include <sys/types.h>
3*bbb1b6f9SApple OSS Distributions #include <sys/sysctl.h>
4*bbb1b6f9SApple OSS Distributions #include <skywalk/os_skywalk_private.h>
5*bbb1b6f9SApple OSS Distributions 
6*bbb1b6f9SApple OSS Distributions #include <darwintest.h>
7*bbb1b6f9SApple OSS Distributions 
8*bbb1b6f9SApple OSS Distributions 
9*bbb1b6f9SApple OSS Distributions /*
10*bbb1b6f9SApple OSS Distributions  * Get all entries in the kernel oid, by calling sysctlbyname twice.
11*bbb1b6f9SApple OSS Distributions  */
12*bbb1b6f9SApple OSS Distributions static int
sysctl_get_all(const char * oid_name,void ** buffer,size_t * len,void * newp,size_t newlen)13*bbb1b6f9SApple OSS Distributions sysctl_get_all(const char *oid_name, void **buffer, size_t *len, void *newp,
14*bbb1b6f9SApple OSS Distributions     size_t newlen)
15*bbb1b6f9SApple OSS Distributions {
16*bbb1b6f9SApple OSS Distributions 	int ret;
17*bbb1b6f9SApple OSS Distributions 
18*bbb1b6f9SApple OSS Distributions 	*buffer = NULL;
19*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(ret = sysctlbyname(oid_name, NULL, len, NULL, 0),
20*bbb1b6f9SApple OSS Distributions 	    NULL);
21*bbb1b6f9SApple OSS Distributions 	if (*len == 0) {
22*bbb1b6f9SApple OSS Distributions 		/* There's no entry in this oid. */
23*bbb1b6f9SApple OSS Distributions 		*buffer = NULL;
24*bbb1b6f9SApple OSS Distributions 		return 0;
25*bbb1b6f9SApple OSS Distributions 	}
26*bbb1b6f9SApple OSS Distributions 	T_EXPECT_NOTNULL(*buffer = malloc(*len), NULL);
27*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(ret = sysctlbyname(oid_name, *buffer, len, newp,
28*bbb1b6f9SApple OSS Distributions 	    newlen), NULL);
29*bbb1b6f9SApple OSS Distributions 	if (ret != 0) {
30*bbb1b6f9SApple OSS Distributions 		if (errno == ENOMEM) {
31*bbb1b6f9SApple OSS Distributions 			free(*buffer);
32*bbb1b6f9SApple OSS Distributions 			*buffer = NULL;
33*bbb1b6f9SApple OSS Distributions 		}
34*bbb1b6f9SApple OSS Distributions 	}
35*bbb1b6f9SApple OSS Distributions 	return 0;
36*bbb1b6f9SApple OSS Distributions }
37*bbb1b6f9SApple OSS Distributions 
38*bbb1b6f9SApple OSS Distributions /*
39*bbb1b6f9SApple OSS Distributions  * Get the given amount of data (*len) from the kernel oid, which has total_size
40*bbb1b6f9SApple OSS Distributions  * amount of data.
41*bbb1b6f9SApple OSS Distributions  */
42*bbb1b6f9SApple OSS Distributions static int
sysctl_get(const char * oid_name,void ** buffer,size_t * len,size_t total_size)43*bbb1b6f9SApple OSS Distributions sysctl_get(const char *oid_name, void **buffer, size_t *len, size_t total_size)
44*bbb1b6f9SApple OSS Distributions {
45*bbb1b6f9SApple OSS Distributions 	int ret;
46*bbb1b6f9SApple OSS Distributions 
47*bbb1b6f9SApple OSS Distributions 	ret = sysctlbyname(oid_name, *buffer, len, NULL, 0);
48*bbb1b6f9SApple OSS Distributions 	/*
49*bbb1b6f9SApple OSS Distributions 	 * If we ask for less than what the kernel has, sysctlbyname for
50*bbb1b6f9SApple OSS Distributions 	 * SK_STATS_ARENA, SK_STATS_REGION, and SK_STATS_CACHE will return -1
51*bbb1b6f9SApple OSS Distributions 	 * and set errno to ENOMEM.
52*bbb1b6f9SApple OSS Distributions 	 * If we ask for more than what the kernel has, sysctlbyname for the
53*bbb1b6f9SApple OSS Distributions 	 * aforementioned oids will return 0 and set the *len to the size
54*bbb1b6f9SApple OSS Distributions 	 * mantinated by the kernel.
55*bbb1b6f9SApple OSS Distributions 	 */
56*bbb1b6f9SApple OSS Distributions 	if (*len < total_size) {
57*bbb1b6f9SApple OSS Distributions 		T_ASSERT_EQ(ret, -1, NULL);
58*bbb1b6f9SApple OSS Distributions 		T_ASSERT_EQ(errno, ENOMEM, NULL);
59*bbb1b6f9SApple OSS Distributions 	} else {
60*bbb1b6f9SApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(ret, NULL);
61*bbb1b6f9SApple OSS Distributions 		T_ASSERT_EQ(*len, total_size, NULL);
62*bbb1b6f9SApple OSS Distributions 	}
63*bbb1b6f9SApple OSS Distributions 
64*bbb1b6f9SApple OSS Distributions 	return ret;
65*bbb1b6f9SApple OSS Distributions }
66*bbb1b6f9SApple OSS Distributions 
67*bbb1b6f9SApple OSS Distributions T_DECL(skmem_arena_sysctl_get_all, "Get all entries in kern.skywalk.stats.arena")
68*bbb1b6f9SApple OSS Distributions {
69*bbb1b6f9SApple OSS Distributions 	void *buffer;
70*bbb1b6f9SApple OSS Distributions 	size_t len;
71*bbb1b6f9SApple OSS Distributions 
72*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get_all(SK_STATS_ARENA, &buffer, &len, NULL, 0);
73*bbb1b6f9SApple OSS Distributions }
74*bbb1b6f9SApple OSS Distributions 
75*bbb1b6f9SApple OSS Distributions T_DECL(skmem_region_sysctl_get_all, "Get all entries in kern.skywalk.stats.region")
76*bbb1b6f9SApple OSS Distributions {
77*bbb1b6f9SApple OSS Distributions 	void *buffer;
78*bbb1b6f9SApple OSS Distributions 	size_t len;
79*bbb1b6f9SApple OSS Distributions 
80*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get_all(SK_STATS_REGION, &buffer, &len, NULL, 0);
81*bbb1b6f9SApple OSS Distributions }
82*bbb1b6f9SApple OSS Distributions 
83*bbb1b6f9SApple OSS Distributions T_DECL(skmem_cache_sysctl_get_all, "Get all entries in kern.skywalk.stats.cache")
84*bbb1b6f9SApple OSS Distributions {
85*bbb1b6f9SApple OSS Distributions 	void *buffer;
86*bbb1b6f9SApple OSS Distributions 	size_t len;
87*bbb1b6f9SApple OSS Distributions 
88*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get_all(SK_STATS_CACHE, &buffer, &len, NULL, 0);
89*bbb1b6f9SApple OSS Distributions }
90*bbb1b6f9SApple OSS Distributions 
91*bbb1b6f9SApple OSS Distributions T_DECL(skmem_arena_sysctl_get_single, "Get a single entry in kern.skywalk.stats.arena")
92*bbb1b6f9SApple OSS Distributions {
93*bbb1b6f9SApple OSS Distributions 	void *buffer;
94*bbb1b6f9SApple OSS Distributions 	size_t len;
95*bbb1b6f9SApple OSS Distributions 	size_t total_size;
96*bbb1b6f9SApple OSS Distributions 
97*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(sysctlbyname(SK_STATS_ARENA, NULL, &total_size,
98*bbb1b6f9SApple OSS Distributions 	    NULL, 0), NULL);
99*bbb1b6f9SApple OSS Distributions 	len = sizeof(struct sk_stats_arena);
100*bbb1b6f9SApple OSS Distributions 	buffer = malloc(len);
101*bbb1b6f9SApple OSS Distributions 
102*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size of %s: %zu\n", SK_STATS_ARENA, total_size);
103*bbb1b6f9SApple OSS Distributions 	T_LOG("Size of single entry: %zu\n", len);
104*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get(SK_STATS_ARENA, &buffer, &len, total_size);
105*bbb1b6f9SApple OSS Distributions }
106*bbb1b6f9SApple OSS Distributions 
107*bbb1b6f9SApple OSS Distributions T_DECL(skmem_region_sysctl_get_single, "Get a single entry in kern.skywalk.stats.region")
108*bbb1b6f9SApple OSS Distributions {
109*bbb1b6f9SApple OSS Distributions 	void *buffer;
110*bbb1b6f9SApple OSS Distributions 	size_t len;
111*bbb1b6f9SApple OSS Distributions 	size_t total_size;
112*bbb1b6f9SApple OSS Distributions 
113*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(sysctlbyname(SK_STATS_REGION, NULL, &total_size,
114*bbb1b6f9SApple OSS Distributions 	    NULL, 0), NULL);
115*bbb1b6f9SApple OSS Distributions 	len = sizeof(struct sk_stats_region);
116*bbb1b6f9SApple OSS Distributions 	buffer = malloc(len);
117*bbb1b6f9SApple OSS Distributions 
118*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size of %s: %zu\n", SK_STATS_REGION, total_size);
119*bbb1b6f9SApple OSS Distributions 	T_LOG("Size of single entry: %zu\n", len);
120*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get(SK_STATS_REGION, &buffer, &len, total_size);
121*bbb1b6f9SApple OSS Distributions }
122*bbb1b6f9SApple OSS Distributions 
123*bbb1b6f9SApple OSS Distributions T_DECL(skmem_cache_sysctl_get_single, "Get a single entry in kern.skywalk.stats.cache")
124*bbb1b6f9SApple OSS Distributions {
125*bbb1b6f9SApple OSS Distributions 	void *buffer;
126*bbb1b6f9SApple OSS Distributions 	size_t len;
127*bbb1b6f9SApple OSS Distributions 	size_t total_size;
128*bbb1b6f9SApple OSS Distributions 
129*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(sysctlbyname(SK_STATS_CACHE, NULL, &total_size,
130*bbb1b6f9SApple OSS Distributions 	    NULL, 0), NULL);
131*bbb1b6f9SApple OSS Distributions 	len = sizeof(struct sk_stats_cache);
132*bbb1b6f9SApple OSS Distributions 	buffer = malloc(len);
133*bbb1b6f9SApple OSS Distributions 
134*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size of %s: %zu\n", SK_STATS_CACHE, total_size);
135*bbb1b6f9SApple OSS Distributions 	T_LOG("Size of single entry: %zu\n", len);
136*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get(SK_STATS_CACHE, &buffer, &len, total_size);
137*bbb1b6f9SApple OSS Distributions }
138*bbb1b6f9SApple OSS Distributions 
139*bbb1b6f9SApple OSS Distributions T_DECL(skmem_arena_sysctl_get_over, "Ask for more entries than kern.skywalk.stats.arena")
140*bbb1b6f9SApple OSS Distributions {
141*bbb1b6f9SApple OSS Distributions 	void *buffer;
142*bbb1b6f9SApple OSS Distributions 	size_t len;
143*bbb1b6f9SApple OSS Distributions 	size_t total_size;
144*bbb1b6f9SApple OSS Distributions 
145*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(sysctlbyname(SK_STATS_ARENA, NULL, &total_size,
146*bbb1b6f9SApple OSS Distributions 	    NULL, 0), NULL);
147*bbb1b6f9SApple OSS Distributions 	len = total_size + sizeof(struct sk_stats_arena);
148*bbb1b6f9SApple OSS Distributions 	buffer = malloc(len);
149*bbb1b6f9SApple OSS Distributions 
150*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size of %s: %zu\n", SK_STATS_ARENA, total_size);
151*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size + single entry: %zu\n", len);
152*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get(SK_STATS_ARENA, &buffer, &len, total_size);
153*bbb1b6f9SApple OSS Distributions }
154*bbb1b6f9SApple OSS Distributions 
155*bbb1b6f9SApple OSS Distributions T_DECL(skmem_region_sysctl_get_over, "Ask for more entries than kern.skywalk.stats.region")
156*bbb1b6f9SApple OSS Distributions {
157*bbb1b6f9SApple OSS Distributions 	void *buffer;
158*bbb1b6f9SApple OSS Distributions 	size_t len;
159*bbb1b6f9SApple OSS Distributions 	size_t total_size;
160*bbb1b6f9SApple OSS Distributions 
161*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(sysctlbyname(SK_STATS_REGION, NULL, &total_size,
162*bbb1b6f9SApple OSS Distributions 	    NULL, 0), NULL);
163*bbb1b6f9SApple OSS Distributions 	len = total_size + sizeof(struct sk_stats_region);
164*bbb1b6f9SApple OSS Distributions 	buffer = malloc(len);
165*bbb1b6f9SApple OSS Distributions 
166*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size of %s: %zu\n", SK_STATS_REGION, total_size);
167*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size + single entry: %zu\n", len);
168*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get(SK_STATS_REGION, &buffer, &len, total_size);
169*bbb1b6f9SApple OSS Distributions }
170*bbb1b6f9SApple OSS Distributions 
171*bbb1b6f9SApple OSS Distributions T_DECL(skmem_cache_sysctl_get_over, "Ask for more entries than kern.skywalk.stats.cache")
172*bbb1b6f9SApple OSS Distributions {
173*bbb1b6f9SApple OSS Distributions 	void *buffer;
174*bbb1b6f9SApple OSS Distributions 	size_t len;
175*bbb1b6f9SApple OSS Distributions 	size_t total_size;
176*bbb1b6f9SApple OSS Distributions 
177*bbb1b6f9SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(sysctlbyname(SK_STATS_CACHE, NULL, &total_size,
178*bbb1b6f9SApple OSS Distributions 	    NULL, 0), NULL);
179*bbb1b6f9SApple OSS Distributions 	len = total_size + sizeof(struct sk_stats_cache);
180*bbb1b6f9SApple OSS Distributions 	buffer = malloc(len);
181*bbb1b6f9SApple OSS Distributions 
182*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size of %s: %zu\n", SK_STATS_CACHE, total_size);
183*bbb1b6f9SApple OSS Distributions 	T_LOG("Total size + single entry: %zu\n", len);
184*bbb1b6f9SApple OSS Distributions 	(void) sysctl_get(SK_STATS_CACHE, &buffer, &len, total_size);
185*bbb1b6f9SApple OSS Distributions }
186