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