1#include "test/jemalloc_test.h" 2 3TEST_BEGIN(test_small_extent_size) 4{ 5 unsigned nbins, i; 6 size_t sz, extent_size; 7 size_t mib[4]; 8 size_t miblen = sizeof(mib) / sizeof(size_t); 9 10 /* 11 * Iterate over all small size classes, get their extent sizes, and 12 * verify that the quantized size is the same as the extent size. 13 */ 14 15 sz = sizeof(unsigned); 16 assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &sz, NULL, 0), 0, 17 "Unexpected mallctl failure"); 18 19 assert_d_eq(mallctlnametomib("arenas.bin.0.slab_size", mib, &miblen), 0, 20 "Unexpected mallctlnametomib failure"); 21 for (i = 0; i < nbins; i++) { 22 mib[2] = i; 23 sz = sizeof(size_t); 24 assert_d_eq(mallctlbymib(mib, miblen, (void *)&extent_size, &sz, 25 NULL, 0), 0, "Unexpected mallctlbymib failure"); 26 assert_zu_eq(extent_size, 27 extent_size_quantize_floor(extent_size), 28 "Small extent quantization should be a no-op " 29 "(extent_size=%zu)", extent_size); 30 assert_zu_eq(extent_size, 31 extent_size_quantize_ceil(extent_size), 32 "Small extent quantization should be a no-op " 33 "(extent_size=%zu)", extent_size); 34 } 35} 36TEST_END 37 38TEST_BEGIN(test_large_extent_size) 39{ 40 bool cache_oblivious; 41 unsigned nlextents, i; 42 size_t sz, extent_size_prev, ceil_prev; 43 size_t mib[4]; 44 size_t miblen = sizeof(mib) / sizeof(size_t); 45 46 /* 47 * Iterate over all large size classes, get their extent sizes, and 48 * verify that the quantized size is the same as the extent size. 49 */ 50 51 sz = sizeof(bool); 52 assert_d_eq(mallctl("config.cache_oblivious", (void *)&cache_oblivious, 53 &sz, NULL, 0), 0, "Unexpected mallctl failure"); 54 55 sz = sizeof(unsigned); 56 assert_d_eq(mallctl("arenas.nlextents", (void *)&nlextents, &sz, NULL, 57 0), 0, "Unexpected mallctl failure"); 58 59 assert_d_eq(mallctlnametomib("arenas.lextent.0.size", mib, &miblen), 0, 60 "Unexpected mallctlnametomib failure"); 61 for (i = 0; i < nlextents; i++) { 62 size_t lextent_size, extent_size, floor, ceil; 63 64 mib[2] = i; 65 sz = sizeof(size_t); 66 assert_d_eq(mallctlbymib(mib, miblen, (void *)&lextent_size, 67 &sz, NULL, 0), 0, "Unexpected mallctlbymib failure"); 68 extent_size = cache_oblivious ? lextent_size + PAGE : 69 lextent_size; 70 floor = extent_size_quantize_floor(extent_size); 71 ceil = extent_size_quantize_ceil(extent_size); 72 73 assert_zu_eq(extent_size, floor, 74 "Extent quantization should be a no-op for precise size " 75 "(lextent_size=%zu, extent_size=%zu)", lextent_size, 76 extent_size); 77 assert_zu_eq(extent_size, ceil, 78 "Extent quantization should be a no-op for precise size " 79 "(lextent_size=%zu, extent_size=%zu)", lextent_size, 80 extent_size); 81 82 if (i > 0) { 83 assert_zu_eq(extent_size_prev, 84 extent_size_quantize_floor(extent_size - PAGE), 85 "Floor should be a precise size"); 86 if (extent_size_prev < ceil_prev) { 87 assert_zu_eq(ceil_prev, extent_size, 88 "Ceiling should be a precise size " 89 "(extent_size_prev=%zu, ceil_prev=%zu, " 90 "extent_size=%zu)", extent_size_prev, 91 ceil_prev, extent_size); 92 } 93 } 94 if (i + 1 < nlextents) { 95 extent_size_prev = floor; 96 ceil_prev = extent_size_quantize_ceil(extent_size + 97 PAGE); 98 } 99 } 100} 101TEST_END 102 103TEST_BEGIN(test_monotonic) 104{ 105#define SZ_MAX ZU(4 * 1024 * 1024) 106 unsigned i; 107 size_t floor_prev, ceil_prev; 108 109 floor_prev = 0; 110 ceil_prev = 0; 111 for (i = 1; i <= SZ_MAX >> LG_PAGE; i++) { 112 size_t extent_size, floor, ceil; 113 114 extent_size = i << LG_PAGE; 115 floor = extent_size_quantize_floor(extent_size); 116 ceil = extent_size_quantize_ceil(extent_size); 117 118 assert_zu_le(floor, extent_size, 119 "Floor should be <= (floor=%zu, extent_size=%zu, ceil=%zu)", 120 floor, extent_size, ceil); 121 assert_zu_ge(ceil, extent_size, 122 "Ceiling should be >= (floor=%zu, extent_size=%zu, " 123 "ceil=%zu)", floor, extent_size, ceil); 124 125 assert_zu_le(floor_prev, floor, "Floor should be monotonic " 126 "(floor_prev=%zu, floor=%zu, extent_size=%zu, ceil=%zu)", 127 floor_prev, floor, extent_size, ceil); 128 assert_zu_le(ceil_prev, ceil, "Ceiling should be monotonic " 129 "(floor=%zu, extent_size=%zu, ceil_prev=%zu, ceil=%zu)", 130 floor, extent_size, ceil_prev, ceil); 131 132 floor_prev = floor; 133 ceil_prev = ceil; 134 } 135} 136TEST_END 137 138int 139main(void) 140{ 141 return (test( 142 test_small_extent_size, 143 test_large_extent_size, 144 test_monotonic)); 145} 146