10a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans#include "test/jemalloc_test.h" 20a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 30a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_summary) 40a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 50a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t *cactive; 60a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t sz, allocated, active, mapped; 70a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 80a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 90a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(cactive); 100a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.cactive", &cactive, &sz, NULL, 0), expected, 110a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() result"); 120a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 130a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(size_t); 140a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.allocated", &allocated, &sz, NULL, 0), 150a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexpected mallctl() result"); 160a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.active", &active, &sz, NULL, 0), expected, 170a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() result"); 180a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.mapped", &mapped, &sz, NULL, 0), expected, 190a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() result"); 200a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 210a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 220a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_le(active, *cactive, 230a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "active should be no larger than cactive"); 240a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_le(allocated, active, 250a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "allocated should be no larger than active"); 260a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_le(active, mapped, 270a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "active should be no larger than mapped"); 280a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 290a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 300a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 310a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 320a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_chunks) 330a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 342b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans size_t current, high; 352b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans uint64_t total; 362b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans size_t sz; 370a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 380a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 392b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans sz = sizeof(size_t); 400a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.chunks.current", ¤t, &sz, NULL, 0), 410a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexpected mallctl() result"); 422b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans sz = sizeof(uint64_t); 430a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.chunks.total", &total, &sz, NULL, 0), 440a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexpected mallctl() result"); 452b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans sz = sizeof(size_t); 460a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.chunks.high", &high, &sz, NULL, 0), expected, 470a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() result"); 480a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 490a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 500a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_le(current, high, 510a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "current should be no larger than high"); 522b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans assert_u64_le((uint64_t)high, total, 530a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "high should be no larger than total"); 540a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 550a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 560a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 570a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 580a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_huge) 590a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 600a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans void *p; 610a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans uint64_t epoch; 620a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t allocated; 6312141150fdbda57651a53ae2fe0edaea4891d814Jason Evans uint64_t nmalloc, ndalloc, nrequests; 640a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t sz; 650a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 660a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 670a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans p = mallocx(arena_maxclass+1, 0); 680a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 690a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 700a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 710a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 720a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 730a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(size_t); 7412141150fdbda57651a53ae2fe0edaea4891d814Jason Evans assert_d_eq(mallctl("stats.arenas.0.huge.allocated", &allocated, &sz, 7512141150fdbda57651a53ae2fe0edaea4891d814Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 760a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(uint64_t); 7712141150fdbda57651a53ae2fe0edaea4891d814Jason Evans assert_d_eq(mallctl("stats.arenas.0.huge.nmalloc", &nmalloc, &sz, NULL, 7812141150fdbda57651a53ae2fe0edaea4891d814Jason Evans 0), expected, "Unexpected mallctl() result"); 7912141150fdbda57651a53ae2fe0edaea4891d814Jason Evans assert_d_eq(mallctl("stats.arenas.0.huge.ndalloc", &ndalloc, &sz, NULL, 8012141150fdbda57651a53ae2fe0edaea4891d814Jason Evans 0), expected, "Unexpected mallctl() result"); 8112141150fdbda57651a53ae2fe0edaea4891d814Jason Evans assert_d_eq(mallctl("stats.arenas.0.huge.nrequests", &nrequests, &sz, 8212141150fdbda57651a53ae2fe0edaea4891d814Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 830a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 840a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 850a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_gt(allocated, 0, 860a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "allocated should be greater than zero"); 870a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_ge(nmalloc, ndalloc, 880a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmalloc should be at least as large as ndalloc"); 8912141150fdbda57651a53ae2fe0edaea4891d814Jason Evans assert_u64_le(nmalloc, nrequests, 9012141150fdbda57651a53ae2fe0edaea4891d814Jason Evans "nmalloc should no larger than nrequests"); 910a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 920a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 930a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans dallocx(p, 0); 940a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 950a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 960a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 970a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_arenas_summary) 980a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 990a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans unsigned arena; 100ef84392d32f38dfce00852217999f5859cadda5aMike Hommey void *little, *large; 1010a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans uint64_t epoch; 1020a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t sz; 1030a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 1040a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t mapped; 1050a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans uint64_t npurge, nmadvise, purged; 1060a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1070a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans arena = 0; 1080a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 1090a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 0, "Unexpected mallctl() failure"); 1100a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 111ef84392d32f38dfce00852217999f5859cadda5aMike Hommey little = mallocx(SMALL_MAXCLASS, 0); 112ef84392d32f38dfce00852217999f5859cadda5aMike Hommey assert_ptr_not_null(little, "Unexpected mallocx() failure"); 1130a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans large = mallocx(arena_maxclass, 0); 1140a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_ptr_not_null(large, "Unexpected mallocx() failure"); 1150a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1160a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, 1170a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 1180a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1190a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 1200a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 1210a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1220a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(size_t); 1230a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.mapped", &mapped, &sz, NULL, 0), 1240a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexepected mallctl() result"); 1250a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(uint64_t); 1260a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge, &sz, NULL, 0), 1270a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexepected mallctl() result"); 1280a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.nmadvise", &nmadvise, &sz, NULL, 0), 1290a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexepected mallctl() result"); 1300a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.purged", &purged, &sz, NULL, 0), 1310a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans expected, "Unexepected mallctl() result"); 1320a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1330a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 1347d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans assert_u64_gt(npurge, 0, 1357d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "At least one purge should have occurred"); 1360a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_le(nmadvise, purged, 1370a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmadvise should be no greater than purged"); 1380a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 1390a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 140ef84392d32f38dfce00852217999f5859cadda5aMike Hommey dallocx(little, 0); 1410a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans dallocx(large, 0); 1420a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 1430a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 1440a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1457d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evansvoid * 1467d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evansthd_start(void *arg) 1477d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans{ 1487d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans 1497d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans return (NULL); 1507d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans} 1517d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans 1527d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evansstatic void 1537d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evansno_lazy_lock(void) 1547d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans{ 1557d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans thd_t thd; 1567d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans 1577d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans thd_create(&thd, thd_start, NULL); 1587d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans thd_join(thd, NULL); 1597d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans} 1607d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans 1610a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_arenas_small) 1620a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 1630a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans unsigned arena; 1640a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans void *p; 1650a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t sz, allocated; 1660a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans uint64_t epoch, nmalloc, ndalloc, nrequests; 1670a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 1680a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1697d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans no_lazy_lock(); /* Lazy locking would dodge tcache testing. */ 1707d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans 1710a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans arena = 0; 1720a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 1730a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 0, "Unexpected mallctl() failure"); 1740a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1750a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans p = mallocx(SMALL_MAXCLASS, 0); 1760a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 1770a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 17835f1bc4e4bd14e07257f6eddbbbcf0c01b52ba5cJason Evans assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0), 17935f1bc4e4bd14e07257f6eddbbbcf0c01b52ba5cJason Evans config_tcache ? 0 : ENOENT, "Unexpected mallctl() result"); 18035f1bc4e4bd14e07257f6eddbbbcf0c01b52ba5cJason Evans 1810a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 1820a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 1830a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1840a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(size_t); 1850a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.small.allocated", &allocated, &sz, 1860a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 1870a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(uint64_t); 1880a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.small.nmalloc", &nmalloc, &sz, 1890a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 1900a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.small.ndalloc", &ndalloc, &sz, 1910a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 1920a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.small.nrequests", &nrequests, &sz, 1930a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 1940a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 1950a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 1960a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_gt(allocated, 0, 19735f1bc4e4bd14e07257f6eddbbbcf0c01b52ba5cJason Evans "allocated should be greater than zero"); 1980a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nmalloc, 0, 1990a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmalloc should be no greater than zero"); 2000a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_ge(nmalloc, ndalloc, 2010a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmalloc should be at least as large as ndalloc"); 2020a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nrequests, 0, 20335f1bc4e4bd14e07257f6eddbbbcf0c01b52ba5cJason Evans "nrequests should be greater than zero"); 2040a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 2050a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2060a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans dallocx(p, 0); 2070a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 2080a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 2090a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2100a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_arenas_large) 2110a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 2120a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans unsigned arena; 2130a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans void *p; 2140a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans size_t sz, allocated; 2150a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans uint64_t epoch, nmalloc, ndalloc, nrequests; 2160a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 2170a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2180a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans arena = 0; 2190a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 2200a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 0, "Unexpected mallctl() failure"); 2210a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2220a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans p = mallocx(arena_maxclass, 0); 2230a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 2240a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2250a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 2260a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 2270a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2280a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(size_t); 2290a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.large.allocated", &allocated, &sz, 2300a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2310a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(uint64_t); 2320a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.large.nmalloc", &nmalloc, &sz, 2330a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2340a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.large.ndalloc", &ndalloc, &sz, 2350a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2360a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.large.nrequests", &nrequests, &sz, 2370a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2380a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2390a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 2400a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_gt(allocated, 0, 2417d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "allocated should be greater than zero"); 2420a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_gt(nmalloc, 0, 2437d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "nmalloc should be greater than zero"); 2440a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_ge(nmalloc, ndalloc, 2450a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmalloc should be at least as large as ndalloc"); 2460a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_gt(nrequests, 0, 2477d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "nrequests should be greater than zero"); 2480a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 2490a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2500a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans dallocx(p, 0); 2510a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 2520a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 2530a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2540a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_arenas_bins) 2550a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 2560a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans unsigned arena; 2570a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans void *p; 2582b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans size_t sz, allocated, curruns; 2590a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans uint64_t epoch, nmalloc, ndalloc, nrequests, nfills, nflushes; 2602b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans uint64_t nruns, nreruns; 2610a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 2620a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2630a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans arena = 0; 2640a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 2650a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 0, "Unexpected mallctl() failure"); 2660a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2670a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans p = mallocx(arena_bin_info[0].reg_size, 0); 2680a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 2690a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2700a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0), 2710a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans config_tcache ? 0 : ENOENT, "Unexpected mallctl() result"); 2720a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2730a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 2740a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 2750a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2760a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(size_t); 2770a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.allocated", &allocated, &sz, 2780a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2790a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans sz = sizeof(uint64_t); 2800a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.nmalloc", &nmalloc, &sz, 2810a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2820a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.ndalloc", &ndalloc, &sz, 2830a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2840a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.nrequests", &nrequests, &sz, 2850a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2860a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2870a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.nfills", &nfills, &sz, 2880a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), config_tcache ? expected : ENOENT, 2890a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() result"); 2900a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.nflushes", &nflushes, &sz, 2910a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), config_tcache ? expected : ENOENT, 2920a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() result"); 2930a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 2940a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.nruns", &nruns, &sz, 2950a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2960a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", &nreruns, &sz, 2970a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 2982b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans sz = sizeof(size_t); 2990a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", &curruns, &sz, 3000a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 3010a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3020a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 3030a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_zu_gt(allocated, 0, 3047d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "allocated should be greater than zero"); 3050a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nmalloc, 0, 3067d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "nmalloc should be greater than zero"); 3070a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_ge(nmalloc, ndalloc, 3080a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmalloc should be at least as large as ndalloc"); 3090a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nrequests, 0, 3107d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "nrequests should be greater than zero"); 3110a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_tcache) { 3120a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nfills, 0, 3137d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "At least one fill should have occurred"); 3140a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nflushes, 0, 3157d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "At least one flush should have occurred"); 3160a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 3177d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans assert_u64_gt(nruns, 0, 3187d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "At least one run should have been allocated"); 3192b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans assert_zu_gt(curruns, 0, 3207d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "At least one run should be currently allocated"); 3210a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 3220a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3230a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans dallocx(p, 0); 3240a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 3250a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 3260a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3270a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_BEGIN(test_stats_arenas_lruns) 3280a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 3290a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans unsigned arena; 3300a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans void *p; 3312b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans uint64_t epoch, nmalloc, ndalloc, nrequests; 3322b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans size_t curruns, sz; 3330a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans int expected = config_stats ? 0 : ENOENT; 3340a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3350a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans arena = 0; 3360a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 3370a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 0, "Unexpected mallctl() failure"); 3380a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3390a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans p = mallocx(SMALL_MAXCLASS+1, 0); 3400a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_ptr_not_null(p, "Unexpected mallocx() failure"); 3410a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3420a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 3430a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "Unexpected mallctl() failure"); 3440a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3452b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans sz = sizeof(uint64_t); 3460a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", &nmalloc, &sz, 3470a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 3480a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", &ndalloc, &sz, 3490a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 3500a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests", &nrequests, &sz, 3510a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 3522b51a3e9e9bfebf081d25dfa92f3cd89e4a8ed73Jason Evans sz = sizeof(size_t); 3530a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", &curruns, &sz, 3540a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans NULL, 0), expected, "Unexpected mallctl() result"); 3550a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3560a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans if (config_stats) { 3570a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nmalloc, 0, 3587d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "nmalloc should be greater than zero"); 3590a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_ge(nmalloc, ndalloc, 3600a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans "nmalloc should be at least as large as ndalloc"); 3610a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(nrequests, 0, 3627d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "nrequests should be greater than zero"); 3630a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans assert_u64_gt(curruns, 0, 3647d8fea987182fe2ee17eb5c1c6f3ae620f82beb0Jason Evans "At least one run should be currently allocated"); 3650a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans } 3660a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3670a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans dallocx(p, 0); 3680a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 3690a8696658f8135ae39eeb86e57f7cecc01144894Jason EvansTEST_END 3700a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3710a8696658f8135ae39eeb86e57f7cecc01144894Jason Evansint 3720a8696658f8135ae39eeb86e57f7cecc01144894Jason Evansmain(void) 3730a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans{ 3740a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans 3750a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans return (test( 3760a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_summary, 3770a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_chunks, 3780a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_huge, 3790a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_arenas_summary, 3800a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_arenas_small, 3810a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_arenas_large, 3820a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_arenas_bins, 3830a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans test_stats_arenas_lruns)); 3840a8696658f8135ae39eeb86e57f7cecc01144894Jason Evans} 385