xref: /netbsd-src/external/bsd/jemalloc/dist/test/integration/slab_sizes.c (revision f8cf1a9151c7af1cb0bd8b09c13c66bca599c027)
1 #include "test/jemalloc_test.h"
2 
3 /* Note that this test relies on the unusual slab sizes set in slab_sizes.sh. */
4 
5 TEST_BEGIN(test_slab_sizes) {
6 	unsigned nbins;
7 	size_t page;
8 	size_t sizemib[4];
9 	size_t slabmib[4];
10 	size_t len;
11 
12 	len = sizeof(nbins);
13 	expect_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0,
14 	    "nbins mallctl failure");
15 
16 	len = sizeof(page);
17 	expect_d_eq(mallctl("arenas.page", &page, &len, NULL, 0), 0,
18 	    "page mallctl failure");
19 
20 	len = 4;
21 	expect_d_eq(mallctlnametomib("arenas.bin.0.size", sizemib, &len), 0,
22 	    "bin size mallctlnametomib failure");
23 
24 	len = 4;
25 	expect_d_eq(mallctlnametomib("arenas.bin.0.slab_size", slabmib, &len),
26 	    0, "slab size mallctlnametomib failure");
27 
28 	size_t biggest_slab_seen = 0;
29 
30 	for (unsigned i = 0; i < nbins; i++) {
31 		size_t bin_size;
32 		size_t slab_size;
33 		len = sizeof(size_t);
34 		sizemib[2] = i;
35 		slabmib[2] = i;
36 		expect_d_eq(mallctlbymib(sizemib, 4, (void *)&bin_size, &len,
37 		    NULL, 0), 0, "bin size mallctlbymib failure");
38 
39 		len = sizeof(size_t);
40 		expect_d_eq(mallctlbymib(slabmib, 4, (void *)&slab_size, &len,
41 		    NULL, 0), 0, "slab size mallctlbymib failure");
42 
43 		if (bin_size < 100) {
44 			/*
45 			 * Then we should be as close to 17 as possible.  Since
46 			 * not all page sizes are valid (because of bitmap
47 			 * limitations on the number of items in a slab), we
48 			 * should at least make sure that the number of pages
49 			 * goes up.
50 			 */
51 			expect_zu_ge(slab_size, biggest_slab_seen,
52 			    "Slab sizes should go up");
53 			biggest_slab_seen = slab_size;
54 		} else if (
55 		    (100 <= bin_size && bin_size < 128)
56 		    || (128 < bin_size && bin_size <= 200)) {
57 			expect_zu_eq(slab_size, page,
58 			    "Forced-small slabs should be small");
59 		} else if (bin_size == 128) {
60 			expect_zu_eq(slab_size, 2 * page,
61 			    "Forced-2-page slab should be 2 pages");
62 		} else if (200 < bin_size && bin_size <= 4096) {
63 			expect_zu_ge(slab_size, biggest_slab_seen,
64 			    "Slab sizes should go up");
65 			biggest_slab_seen = slab_size;
66 		}
67 	}
68 	/*
69 	 * For any reasonable configuration, 17 pages should be a valid slab
70 	 * size for 4096-byte items.
71 	 */
72 	expect_zu_eq(biggest_slab_seen, 17 * page, "Didn't hit page target");
73 }
74 TEST_END
75 
76 int
77 main(void) {
78 	return test(
79 	    test_slab_sizes);
80 }
81