commit e6c42dc: [Project] Fix issues with mempool alloc/free
Vsevolod Stakhov
vsevolod at highsecure.ru
Mon Dec 23 18:49:10 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-12-23 15:54:19 +0000
URL: https://github.com/rspamd/rspamd/commit/e6c42dc71175916c01074f5605afc5b3257fe725
[Project] Fix issues with mempool alloc/free
---
src/libutil/mem_pool.c | 30 +++++++++++++++---------------
src/libutil/mem_pool_internal.h | 3 +--
2 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c
index c6a5a4900..54113b265 100644
--- a/src/libutil/mem_pool.c
+++ b/src/libutil/mem_pool.c
@@ -234,7 +234,6 @@ rspamd_mempool_chain_new (gsize size, enum rspamd_mempool_chain_type pool_type)
chain->pos = align_ptr (chain->begin, MIN_MEM_ALIGNMENT);
chain->slice_size = total_size - sizeof (struct _pool_chain);
- chain->lock = NULL;
return chain;
}
@@ -365,11 +364,11 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
new_pool = (rspamd_mempool_t *)mem_chunk;
new_pool->priv = (struct rspamd_mempool_specific *)(mem_chunk +
sizeof (rspamd_mempool_t));
+ /* Zere memory for specific and for the first chain */
memset (new_pool->priv, 0, sizeof (struct rspamd_mempool_specific) +
sizeof (struct _pool_chain));
- new_pool->priv->entry = rspamd_mempool_get_entry (loc);
-
+ new_pool->priv->entry = entry;
new_pool->priv->elt_len = size;
if (tag) {
@@ -392,18 +391,20 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
/* Now we can attach one chunk to speed up simple allocations */
struct _pool_chain *nchain;
- nchain = (struct _pool_chain *)mem_chunk + sizeof (rspamd_mempool_t) +
- sizeof (struct rspamd_mempool_specific);
- nchain->slice_size = size;
+ nchain = (struct _pool_chain *)
+ (mem_chunk +
+ sizeof (rspamd_mempool_t) +
+ sizeof (struct rspamd_mempool_specific));
guchar *unaligned = mem_chunk +
sizeof (rspamd_mempool_t) +
sizeof (struct rspamd_mempool_specific) +
sizeof (struct _pool_chain);
- nchain->begin = align_ptr (unaligned, MIN_MEM_ALIGNMENT);
nchain->slice_size = size;
- nchain->pos = nchain->begin;
+ nchain->begin = unaligned;
+ nchain->slice_size = size;
+ nchain->pos = align_ptr (unaligned, MIN_MEM_ALIGNMENT);
new_pool->priv->pools[RSPAMD_MEMPOOL_NORMAL] = nchain;
new_pool->priv->used_memory = size;
@@ -698,11 +699,7 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
POOL_MTX_LOCK ();
- cur = NULL;
-
- if (pool->priv->pools[RSPAMD_MEMPOOL_NORMAL] != NULL) {
- cur = pool->priv->pools[RSPAMD_MEMPOOL_NORMAL];
- }
+ cur = pool->priv->pools[RSPAMD_MEMPOOL_NORMAL];
if (cur && mempool_entries) {
pool->priv->entry->elts[pool->priv->entry->cur_elts].leftover =
@@ -737,7 +734,10 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
munmap ((void *)cur, len);
}
else {
- free (cur); /* Not g_free as we use system allocator */
+ /* The last pool is special, it is a part of the initial chunk */
+ if (cur->next != NULL) {
+ free (cur); /* Not g_free as we use system allocator */
+ }
}
}
}
@@ -758,7 +758,7 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
g_atomic_int_inc (&mem_pool_stat->pools_freed);
POOL_MTX_UNLOCK ();
- g_free (pool);
+ free (pool); /* allocated by posix_memalign */
}
void
diff --git a/src/libutil/mem_pool_internal.h b/src/libutil/mem_pool_internal.h
index e7a5ecaf2..c96287a68 100644
--- a/src/libutil/mem_pool_internal.h
+++ b/src/libutil/mem_pool_internal.h
@@ -72,8 +72,7 @@ struct rspamd_mempool_specific {
struct _pool_chain {
guint8 *begin; /**< begin of pool chain block */
guint8 *pos; /**< current start of free space in block */
- gsize slice_size; /**< length of block */
- rspamd_mempool_mutex_t *lock;
+ gsize slice_size; /**< length of block */
struct _pool_chain *next;
};
More information about the Commits
mailing list