Lines Matching refs:ctx
163 static uint32_t malloc_lock(struct malloc_ctx *ctx) in malloc_lock() argument
165 return cpu_spin_lock_xsave(&ctx->spinlock); in malloc_lock()
168 static void malloc_unlock(struct malloc_ctx *ctx, uint32_t exceptions) in malloc_unlock() argument
170 cpu_spin_unlock_xrestore(&ctx->spinlock, exceptions); in malloc_unlock()
175 static uint32_t malloc_lock(struct malloc_ctx *ctx __unused) in malloc_lock()
180 static void malloc_unlock(struct malloc_ctx *ctx __unused, in malloc_unlock()
198 static void print_oom(size_t req_size __maybe_unused, void *ctx __maybe_unused) in print_oom()
201 EMSG("Memory allocation failed: size %zu context %p", req_size, ctx); in print_oom()
209 struct malloc_ctx *ctx) in raw_malloc_return_hook() argument
211 if (ctx->poolset.totalloc > ctx->mstats.max_allocated) in raw_malloc_return_hook()
212 ctx->mstats.max_allocated = ctx->poolset.totalloc; in raw_malloc_return_hook()
215 ctx->mstats.num_alloc_fail++; in raw_malloc_return_hook()
216 print_oom(requested_size, ctx); in raw_malloc_return_hook()
217 if (requested_size > ctx->mstats.biggest_alloc_fail) { in raw_malloc_return_hook()
218 ctx->mstats.biggest_alloc_fail = requested_size; in raw_malloc_return_hook()
219 ctx->mstats.biggest_alloc_fail_used = in raw_malloc_return_hook()
220 ctx->poolset.totalloc; in raw_malloc_return_hook()
225 static void gen_malloc_reset_stats(struct malloc_ctx *ctx) in gen_malloc_reset_stats() argument
227 uint32_t exceptions = malloc_lock(ctx); in gen_malloc_reset_stats()
229 ctx->mstats.max_allocated = 0; in gen_malloc_reset_stats()
230 ctx->mstats.num_alloc_fail = 0; in gen_malloc_reset_stats()
231 ctx->mstats.biggest_alloc_fail = 0; in gen_malloc_reset_stats()
232 ctx->mstats.biggest_alloc_fail_used = 0; in gen_malloc_reset_stats()
233 malloc_unlock(ctx, exceptions); in gen_malloc_reset_stats()
241 static void gen_malloc_get_stats(struct malloc_ctx *ctx, in gen_malloc_get_stats() argument
244 uint32_t exceptions = malloc_lock(ctx); in gen_malloc_get_stats()
246 memcpy_unchecked(stats, &ctx->mstats, sizeof(*stats)); in gen_malloc_get_stats()
247 stats->allocated = ctx->poolset.totalloc; in gen_malloc_get_stats()
248 malloc_unlock(ctx, exceptions); in gen_malloc_get_stats()
259 struct malloc_ctx *ctx ) in raw_malloc_return_hook() argument
262 print_oom(requested_size, ctx); in raw_malloc_return_hook()
268 static void raw_malloc_validate_pools(struct malloc_ctx *ctx) in raw_malloc_validate_pools() argument
272 for (n = 0; n < ctx->pool_len; n++) in raw_malloc_validate_pools()
273 bpoolv(ctx->pool[n].buf); in raw_malloc_validate_pools()
276 static void raw_malloc_validate_pools(struct malloc_ctx *ctx __unused) in raw_malloc_validate_pools()
286 static void bpool_foreach_iterator_init(struct malloc_ctx *ctx, in bpool_foreach_iterator_init() argument
290 iterator->next_buf = BFH(ctx->pool[0].buf); in bpool_foreach_iterator_init()
323 static bool bpool_foreach(struct malloc_ctx *ctx, in bpool_foreach() argument
336 if ((iterator->pool_idx + 1) >= ctx->pool_len) in bpool_foreach()
340 iterator->next_buf = BFH(ctx->pool[iterator->pool_idx].buf); in bpool_foreach()
345 #define BPOOL_FOREACH(ctx, iterator, bp) \ argument
346 for (bpool_foreach_iterator_init((ctx),(iterator)); \
347 bpool_foreach((ctx),(iterator), (bp));)
350 size_t pl_size, struct malloc_ctx *ctx) in raw_memalign() argument
358 raw_malloc_validate_pools(ctx); in raw_memalign()
368 ptr = bget(alignment, hdr_size, s, &ctx->poolset); in raw_memalign()
370 raw_malloc_return_hook(ptr, pl_size, ctx); in raw_memalign()
376 struct malloc_ctx *ctx) in raw_malloc() argument
382 return raw_memalign(hdr_size, ftr_size, SizeQ, pl_size, ctx); in raw_malloc()
385 void raw_free(void *ptr, struct malloc_ctx *ctx, bool wipe) in raw_free() argument
387 raw_malloc_validate_pools(ctx); in raw_free()
390 brel(ptr, &ctx->poolset, wipe); in raw_free()
394 size_t pl_size, struct malloc_ctx *ctx) in raw_calloc() argument
399 raw_malloc_validate_pools(ctx); in raw_calloc()
411 ptr = bgetz(0, hdr_size, s, &ctx->poolset); in raw_calloc()
413 raw_malloc_return_hook(ptr, pl_nmemb * pl_size, ctx); in raw_calloc()
419 size_t pl_size, struct malloc_ctx *ctx) in raw_realloc() argument
430 raw_malloc_validate_pools(ctx); in raw_realloc()
436 p = bgetr(ptr, 0, 0, s, &ctx->poolset); in raw_realloc()
438 raw_malloc_return_hook(p, pl_size, ctx); in raw_realloc()
511 static void *gen_mdbg_malloc(struct malloc_ctx *ctx, const char *fname, in gen_mdbg_malloc() argument
515 uint32_t exceptions = malloc_lock(ctx); in gen_mdbg_malloc()
523 mdbg_get_ftr_size(size), size, ctx); in gen_mdbg_malloc()
529 malloc_unlock(ctx, exceptions); in gen_mdbg_malloc()
539 static void gen_mdbg_free(struct malloc_ctx *ctx, void *ptr, bool wipe) in gen_mdbg_free() argument
548 raw_free(hdr, ctx, wipe); in gen_mdbg_free()
560 static void *gen_mdbg_calloc(struct malloc_ctx *ctx, const char *fname, int lineno, in gen_mdbg_calloc() argument
564 uint32_t exceptions = malloc_lock(ctx); in gen_mdbg_calloc()
568 ctx); in gen_mdbg_calloc()
573 malloc_unlock(ctx, exceptions); in gen_mdbg_calloc()
577 static void *gen_mdbg_realloc_unlocked(struct malloc_ctx *ctx, const char *fname, in gen_mdbg_realloc_unlocked() argument
587 mdbg_get_ftr_size(size), size, ctx); in gen_mdbg_realloc_unlocked()
595 static void *gen_mdbg_realloc(struct malloc_ctx *ctx, const char *fname, in gen_mdbg_realloc() argument
599 uint32_t exceptions = malloc_lock(ctx); in gen_mdbg_realloc()
601 p = gen_mdbg_realloc_unlocked(ctx, fname, lineno, ptr, size); in gen_mdbg_realloc()
602 malloc_unlock(ctx, exceptions); in gen_mdbg_realloc()
606 #define realloc_unlocked(ctx, ptr, size) \ argument
607 gen_mdbg_realloc_unlocked(ctx, __FILE__, __LINE__, (ptr), (size))
609 static void *gen_mdbg_memalign(struct malloc_ctx *ctx, const char *fname, in gen_mdbg_memalign() argument
613 uint32_t exceptions = malloc_lock(ctx); in gen_mdbg_memalign()
616 alignment, size, ctx); in gen_mdbg_memalign()
621 malloc_unlock(ctx, exceptions); in gen_mdbg_memalign()
635 static void gen_mdbg_check(struct malloc_ctx *ctx, int bufdump) in gen_mdbg_check() argument
639 uint32_t exceptions = malloc_lock(ctx); in gen_mdbg_check()
641 raw_malloc_validate_pools(ctx); in gen_mdbg_check()
643 BPOOL_FOREACH(ctx, &itr, &b) { in gen_mdbg_check()
659 malloc_unlock(ctx, exceptions); in gen_mdbg_check()
742 static void *realloc_unlocked(struct malloc_ctx *ctx, void *ptr, in realloc_unlocked() argument
745 return raw_realloc(ptr, 0, 0, size, ctx); in realloc_unlocked()
786 static void gen_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len) in gen_malloc_add_pool() argument
804 if (!ctx->pool_len && (end - start) < MALLOC_INITIAL_POOL_MIN_SIZE) { in gen_malloc_add_pool()
809 exceptions = malloc_lock(ctx); in gen_malloc_add_pool()
812 bpool((void *)start, end - start, &ctx->poolset); in gen_malloc_add_pool()
813 l = ctx->pool_len + 1; in gen_malloc_add_pool()
814 p = realloc_unlocked(ctx, ctx->pool, sizeof(struct malloc_pool) * l); in gen_malloc_add_pool()
816 ctx->pool = p; in gen_malloc_add_pool()
817 ctx->pool[ctx->pool_len].buf = (void *)start; in gen_malloc_add_pool()
818 ctx->pool[ctx->pool_len].len = end - start; in gen_malloc_add_pool()
820 ctx->mstats.size += ctx->pool[ctx->pool_len].len; in gen_malloc_add_pool()
822 ctx->pool_len = l; in gen_malloc_add_pool()
823 malloc_unlock(ctx, exceptions); in gen_malloc_add_pool()
826 static bool gen_malloc_buffer_is_within_alloced(struct malloc_ctx *ctx, in gen_malloc_buffer_is_within_alloced() argument
834 uint32_t exceptions = malloc_lock(ctx); in gen_malloc_buffer_is_within_alloced()
836 raw_malloc_validate_pools(ctx); in gen_malloc_buffer_is_within_alloced()
842 BPOOL_FOREACH(ctx, &itr, &b) { in gen_malloc_buffer_is_within_alloced()
857 malloc_unlock(ctx, exceptions); in gen_malloc_buffer_is_within_alloced()
862 static bool gen_malloc_buffer_overlaps_heap(struct malloc_ctx *ctx, in gen_malloc_buffer_overlaps_heap() argument
869 uint32_t exceptions = malloc_lock(ctx); in gen_malloc_buffer_overlaps_heap()
871 raw_malloc_validate_pools(ctx); in gen_malloc_buffer_overlaps_heap()
873 for (n = 0; n < ctx->pool_len; n++) { in gen_malloc_buffer_overlaps_heap()
874 uintptr_t pool_start = (uintptr_t)ctx->pool[n].buf; in gen_malloc_buffer_overlaps_heap()
875 uintptr_t pool_end = pool_start + ctx->pool[n].len; in gen_malloc_buffer_overlaps_heap()
889 malloc_unlock(ctx, exceptions); in gen_malloc_buffer_overlaps_heap()
898 void raw_malloc_init_ctx(struct malloc_ctx *ctx) in raw_malloc_init_ctx() argument
900 memset(ctx, 0, sizeof(*ctx)); in raw_malloc_init_ctx()
901 ctx->poolset.freelist.ql.flink = &ctx->poolset.freelist; in raw_malloc_init_ctx()
902 ctx->poolset.freelist.ql.blink = &ctx->poolset.freelist; in raw_malloc_init_ctx()
905 void raw_malloc_add_pool(struct malloc_ctx *ctx, void *buf, size_t len) in raw_malloc_add_pool() argument
907 gen_malloc_add_pool(ctx, buf, len); in raw_malloc_add_pool()
911 void raw_malloc_get_stats(struct malloc_ctx *ctx, struct malloc_stats *stats) in raw_malloc_get_stats() argument
913 gen_malloc_get_stats(ctx, stats); in raw_malloc_get_stats()