diff options
author | Qinfan Wu <wqfish@fb.com> | 2014-07-21 17:23:36 (GMT) |
---|---|---|
committer | Qinfan Wu <wqfish@fb.com> | 2014-08-12 16:50:00 (GMT) |
commit | a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5 (patch) | |
tree | 9e95378e5d059d974fa328d34e16369c8fb3cf91 /src/arena.c | |
parent | 04d60a132beed9e8c33f73b94fb9251b919073c8 (diff) | |
download | jemalloc-a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5.zip jemalloc-a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5.tar.gz jemalloc-a244e5078e8505978b5f63cfe6dcb3c9d63d2cb5.tar.bz2 |
Add dirty page counting for debug
Diffstat (limited to 'src/arena.c')
-rw-r--r-- | src/arena.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/arena.c b/src/arena.c index 3397731..3cf1abf 100644 --- a/src/arena.c +++ b/src/arena.c @@ -923,11 +923,33 @@ arena_maybe_purge(arena_t *arena) static arena_chunk_t * chunks_dirty_iter_cb(arena_chunk_tree_t *tree, arena_chunk_t *chunk, void *arg) { - size_t *ndirty = (size_t *)arg; + size_t *ndirty = (size_t *)arg; - assert(chunk->ndirty != 0); - *ndirty += chunk->ndirty; - return (NULL); + assert(chunk->ndirty != 0); + *ndirty += chunk->ndirty; + return (NULL); +} + +static size_t +arena_dirty_count(arena_t *arena) +{ + size_t ndirty = 0; + arena_chunk_map_t *mapelm; + arena_chunk_t *chunk; + size_t pageind, npages; + + ql_foreach(mapelm, &arena->runs_dirty, dr_link) { + chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm); + pageind = arena_mapelm_to_pageind(mapelm); + assert(arena_mapbits_allocated_get(chunk, pageind) == 0); + assert(arena_mapbits_large_get(chunk, pageind) == 0); + assert(arena_mapbits_dirty_get(chunk, pageind) != 0); + npages = arena_mapbits_unallocated_size_get(chunk, pageind) >> + LG_PAGE; + ndirty += npages; + } + + return (ndirty); } static size_t @@ -1134,6 +1156,9 @@ arena_purge(arena_t *arena, bool all) arena_chunk_dirty_iter(&arena->chunks_dirty, NULL, chunks_dirty_iter_cb, (void *)&ndirty); assert(ndirty == arena->ndirty); + + ndirty = arena_dirty_count(arena); + assert(ndirty == arena->ndirty); } assert(arena->ndirty > arena->npurgatory || all); assert((arena->nactive >> opt_lg_dirty_mult) < (arena->ndirty - |