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", &current, &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