|
|
887953 |
From 3cc901acea41632df0c342639c4292c10bd90964 Mon Sep 17 00:00:00 2001
|
|
|
887953 |
From: Mohit Agrawal <moagrawa@redhat.com>
|
|
|
887953 |
Date: Tue, 18 Dec 2018 15:39:14 +0530
|
|
|
887953 |
Subject: [PATCH 487/493] mem-pool: add tracking of mem_pool that requested the
|
|
|
887953 |
allocation
|
|
|
887953 |
|
|
|
887953 |
This renames the current 'struct mem_pool' to 'struct mem_pool_shared'.
|
|
|
887953 |
The mem_pool_shared is globally allocated and not specific for
|
|
|
887953 |
particular objects.
|
|
|
887953 |
|
|
|
887953 |
A new 'struct mem_pool' gets allocated when mem_pool_new() is called. It
|
|
|
887953 |
points to the mem_pool_shared that handles the actual allocation
|
|
|
887953 |
requests. The 'struct mem_pool' is only used for accounting of the
|
|
|
887953 |
objects that the caller requested and free'd.
|
|
|
887953 |
|
|
|
887953 |
All of these changes will be used to collect all the memory pools a
|
|
|
887953 |
glusterfs_ctx_t is consuming, so that statedumps can be collected per
|
|
|
887953 |
context.
|
|
|
887953 |
|
|
|
887953 |
> Updates: #307
|
|
|
887953 |
> Change-Id: I6355d3f0251c928e0bbfc71be3431307c6f3a3da
|
|
|
887953 |
> Signed-off-by: Niels de Vos <ndevos@redhat.com>
|
|
|
887953 |
> Reviewed-on: https://review.gluster.org/18073
|
|
|
887953 |
> Smoke: Gluster Build System <jenkins@build.gluster.org>
|
|
|
887953 |
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
|
|
|
887953 |
> Reviewed-by: Amar Tumballi <amarts@redhat.com>
|
|
|
887953 |
> Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
|
|
|
887953 |
> Cherry picked from commit 2645e730b79b44fc035170657e43bb52f3e855c5
|
|
|
887953 |
|
|
|
887953 |
Change-Id: I6cce6284e4553c6ca59a90ad124c23c950db3148
|
|
|
887953 |
BUG: 1648893
|
|
|
887953 |
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
|
|
887953 |
|
|
|
887953 |
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
|
|
887953 |
Change-Id: I363d71152b1dd17eca53d9c327fcdf2f26c0fb61
|
|
|
887953 |
Reviewed-on: https://code.engineering.redhat.com/gerrit/158930
|
|
|
887953 |
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
|
887953 |
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
|
|
887953 |
---
|
|
|
887953 |
libglusterfs/src/mem-pool.c | 69 +++++++++++++++++++++++++++-----------------
|
|
|
887953 |
libglusterfs/src/mem-pool.h | 20 +++++++++++--
|
|
|
887953 |
libglusterfs/src/mem-types.h | 2 --
|
|
|
887953 |
3 files changed, 60 insertions(+), 31 deletions(-)
|
|
|
887953 |
|
|
|
887953 |
diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c
|
|
|
887953 |
index 8ff261c..a8a9347 100644
|
|
|
887953 |
--- a/libglusterfs/src/mem-pool.c
|
|
|
887953 |
+++ b/libglusterfs/src/mem-pool.c
|
|
|
887953 |
@@ -14,15 +14,6 @@
|
|
|
887953 |
#include <stdlib.h>
|
|
|
887953 |
#include <stdarg.h>
|
|
|
887953 |
|
|
|
887953 |
-#define GF_MEM_POOL_LIST_BOUNDARY (sizeof(struct list_head))
|
|
|
887953 |
-#define GF_MEM_POOL_PTR (sizeof(struct mem_pool*))
|
|
|
887953 |
-#define GF_MEM_POOL_PAD_BOUNDARY (GF_MEM_POOL_LIST_BOUNDARY + GF_MEM_POOL_PTR + sizeof(int))
|
|
|
887953 |
-#define mem_pool_chunkhead2ptr(head) ((head) + GF_MEM_POOL_PAD_BOUNDARY)
|
|
|
887953 |
-#define mem_pool_ptr2chunkhead(ptr) ((ptr) - GF_MEM_POOL_PAD_BOUNDARY)
|
|
|
887953 |
-#define is_mem_chunk_in_use(ptr) (*ptr == 1)
|
|
|
887953 |
-#define mem_pool_from_ptr(ptr) ((ptr) + GF_MEM_POOL_LIST_BOUNDARY)
|
|
|
887953 |
-
|
|
|
887953 |
-#define GLUSTERFS_ENV_MEM_ACCT_STR "GLUSTERFS_DISABLE_MEM_ACCT"
|
|
|
887953 |
|
|
|
887953 |
#include "unittest/unittest.h"
|
|
|
887953 |
#include "libglusterfs-messages.h"
|
|
|
887953 |
@@ -380,7 +371,7 @@ static pthread_mutex_t pool_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
887953 |
static struct list_head pool_threads;
|
|
|
887953 |
static pthread_mutex_t pool_free_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
887953 |
static struct list_head pool_free_threads;
|
|
|
887953 |
-static struct mem_pool pools[NPOOLS];
|
|
|
887953 |
+static struct mem_pool_shared pools[NPOOLS];
|
|
|
887953 |
static size_t pool_list_size;
|
|
|
887953 |
|
|
|
887953 |
#if !defined(GF_DISABLE_MEMPOOL)
|
|
|
887953 |
@@ -689,6 +680,8 @@ mem_pool_new_fn (unsigned long sizeof_type,
|
|
|
887953 |
unsigned long count, char *name)
|
|
|
887953 |
{
|
|
|
887953 |
unsigned int i;
|
|
|
887953 |
+ struct mem_pool *new = NULL;
|
|
|
887953 |
+ struct mem_pool_shared *pool = NULL;
|
|
|
887953 |
|
|
|
887953 |
if (!sizeof_type) {
|
|
|
887953 |
gf_msg_callingfn ("mem-pool", GF_LOG_ERROR, EINVAL,
|
|
|
887953 |
@@ -698,13 +691,27 @@ mem_pool_new_fn (unsigned long sizeof_type,
|
|
|
887953 |
|
|
|
887953 |
for (i = 0; i < NPOOLS; ++i) {
|
|
|
887953 |
if (sizeof_type <= AVAILABLE_SIZE(pools[i].power_of_two)) {
|
|
|
887953 |
- return &pools[i];
|
|
|
887953 |
+ pool = &pools[i];
|
|
|
887953 |
+ break;
|
|
|
887953 |
}
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
- gf_msg_callingfn ("mem-pool", GF_LOG_ERROR, EINVAL,
|
|
|
887953 |
- LG_MSG_INVALID_ARG, "invalid argument");
|
|
|
887953 |
- return NULL;
|
|
|
887953 |
+ if (!pool) {
|
|
|
887953 |
+ gf_msg_callingfn ("mem-pool", GF_LOG_ERROR, EINVAL,
|
|
|
887953 |
+ LG_MSG_INVALID_ARG, "invalid argument");
|
|
|
887953 |
+ return NULL;
|
|
|
887953 |
+ }
|
|
|
887953 |
+
|
|
|
887953 |
+ new = GF_CALLOC (sizeof (struct mem_pool), 1, gf_common_mt_mem_pool);
|
|
|
887953 |
+ if (!new)
|
|
|
887953 |
+ return NULL;
|
|
|
887953 |
+
|
|
|
887953 |
+ new->sizeof_type = sizeof_type;
|
|
|
887953 |
+ new->count = count;
|
|
|
887953 |
+ new->name = name;
|
|
|
887953 |
+ new->pool = pool;
|
|
|
887953 |
+
|
|
|
887953 |
+ return new;
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
void*
|
|
|
887953 |
@@ -721,7 +728,7 @@ mem_get0 (struct mem_pool *mem_pool)
|
|
|
887953 |
ptr = mem_get(mem_pool);
|
|
|
887953 |
|
|
|
887953 |
if (ptr) {
|
|
|
887953 |
- memset (ptr, 0, AVAILABLE_SIZE(mem_pool->power_of_two));
|
|
|
887953 |
+ memset (ptr, 0, AVAILABLE_SIZE(mem_pool->pool->power_of_two));
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
return ptr;
|
|
|
887953 |
@@ -784,7 +791,7 @@ mem_get_from_pool (struct mem_pool *mem_pool)
|
|
|
887953 |
return NULL;
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
- pt_pool = &pool_list->pools[mem_pool->power_of_two-POOL_SMALLEST];
|
|
|
887953 |
+ pt_pool = &pool_list->pools[mem_pool->pool->power_of_two-POOL_SMALLEST];
|
|
|
887953 |
|
|
|
887953 |
(void) pthread_spin_lock (&pool_list->lock);
|
|
|
887953 |
|
|
|
887953 |
@@ -802,7 +809,7 @@ mem_get_from_pool (struct mem_pool *mem_pool)
|
|
|
887953 |
} else {
|
|
|
887953 |
(void) pthread_spin_unlock (&pool_list->lock);
|
|
|
887953 |
GF_ATOMIC_INC (pt_pool->parent->allocs_stdc);
|
|
|
887953 |
- retval = malloc (1 << mem_pool->power_of_two);
|
|
|
887953 |
+ retval = malloc (1 << mem_pool->pool->power_of_two);
|
|
|
887953 |
}
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
@@ -810,7 +817,7 @@ mem_get_from_pool (struct mem_pool *mem_pool)
|
|
|
887953 |
retval->magic = GF_MEM_HEADER_MAGIC;
|
|
|
887953 |
retval->next = NULL;
|
|
|
887953 |
retval->pool_list = pool_list;
|
|
|
887953 |
- retval->power_of_two = mem_pool->power_of_two;
|
|
|
887953 |
+ retval->power_of_two = mem_pool->pool->power_of_two;
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
return retval;
|
|
|
887953 |
@@ -821,9 +828,10 @@ void *
|
|
|
887953 |
mem_get (struct mem_pool *mem_pool)
|
|
|
887953 |
{
|
|
|
887953 |
#if defined(GF_DISABLE_MEMPOOL)
|
|
|
887953 |
- return GF_CALLOC (1, AVAILABLE_SIZE (mem_pool->power_of_two),
|
|
|
887953 |
+ return GF_CALLOC (1, AVAILABLE_SIZE (mem_pool->pool->power_of_two),
|
|
|
887953 |
gf_common_mt_mem_pool);
|
|
|
887953 |
#else
|
|
|
887953 |
+ per_thread_pool_list_t *pool_list;
|
|
|
887953 |
pooled_obj_hdr_t *retval;
|
|
|
887953 |
|
|
|
887953 |
if (!mem_pool) {
|
|
|
887953 |
@@ -832,11 +840,22 @@ mem_get (struct mem_pool *mem_pool)
|
|
|
887953 |
return NULL;
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
+ pool_list = mem_get_pool_list ();
|
|
|
887953 |
+ if (!pool_list || pool_list->poison) {
|
|
|
887953 |
+ return NULL;
|
|
|
887953 |
+ }
|
|
|
887953 |
+
|
|
|
887953 |
retval = mem_get_from_pool (mem_pool);
|
|
|
887953 |
+
|
|
|
887953 |
if (!retval) {
|
|
|
887953 |
return NULL;
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
+ retval->magic = GF_MEM_HEADER_MAGIC;
|
|
|
887953 |
+ retval->pool = mem_pool;
|
|
|
887953 |
+ retval->pool_list = pool_list;
|
|
|
887953 |
+ retval->power_of_two = mem_pool->pool->power_of_two;
|
|
|
887953 |
+
|
|
|
887953 |
return retval + 1;
|
|
|
887953 |
#endif /* GF_DISABLE_MEMPOOL */
|
|
|
887953 |
}
|
|
|
887953 |
@@ -886,14 +905,12 @@ mem_put (void *ptr)
|
|
|
887953 |
void
|
|
|
887953 |
mem_pool_destroy (struct mem_pool *pool)
|
|
|
887953 |
{
|
|
|
887953 |
- if (!pool)
|
|
|
887953 |
- return;
|
|
|
887953 |
+ GF_FREE (pool);
|
|
|
887953 |
|
|
|
887953 |
/*
|
|
|
887953 |
- * Pools are now permanent, so this does nothing. Yes, this means we
|
|
|
887953 |
- * can keep allocating from a pool after calling mem_destroy on it, but
|
|
|
887953 |
- * that's kind of OK. All of the objects *in* the pool will eventually
|
|
|
887953 |
- * be freed via the pool-sweeper thread, and this way we don't have to
|
|
|
887953 |
- * add a lot of reference-counting complexity.
|
|
|
887953 |
+ * Pools are now permanent, so the mem_pool->pool is kept around. All
|
|
|
887953 |
+ * of the objects *in* the pool will eventually be freed via the
|
|
|
887953 |
+ * pool-sweeper thread, and this way we don't have to add a lot of
|
|
|
887953 |
+ * reference-counting complexity.
|
|
|
887953 |
*/
|
|
|
887953 |
}
|
|
|
887953 |
diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h
|
|
|
887953 |
index dfe1f9a..057d957 100644
|
|
|
887953 |
--- a/libglusterfs/src/mem-pool.h
|
|
|
887953 |
+++ b/libglusterfs/src/mem-pool.h
|
|
|
887953 |
@@ -204,18 +204,31 @@ out:
|
|
|
887953 |
return dup_mem;
|
|
|
887953 |
}
|
|
|
887953 |
|
|
|
887953 |
+/* kind of 'header' for the actual mem_pool_shared structure, this might make
|
|
|
887953 |
+ * it possible to dump some more details in a statedump */
|
|
|
887953 |
+struct mem_pool {
|
|
|
887953 |
+ unsigned long sizeof_type;
|
|
|
887953 |
+ unsigned long count;
|
|
|
887953 |
+ char *name;
|
|
|
887953 |
+
|
|
|
887953 |
+ struct mem_pool_shared *pool;
|
|
|
887953 |
+};
|
|
|
887953 |
+
|
|
|
887953 |
typedef struct pooled_obj_hdr {
|
|
|
887953 |
unsigned long magic;
|
|
|
887953 |
struct pooled_obj_hdr *next;
|
|
|
887953 |
struct per_thread_pool_list *pool_list;
|
|
|
887953 |
unsigned int power_of_two;
|
|
|
887953 |
+
|
|
|
887953 |
+ /* track the pool that was used to request this object */
|
|
|
887953 |
+ struct mem_pool *pool;
|
|
|
887953 |
} pooled_obj_hdr_t;
|
|
|
887953 |
|
|
|
887953 |
#define AVAILABLE_SIZE(p2) ((1 << (p2)) - sizeof(pooled_obj_hdr_t))
|
|
|
887953 |
|
|
|
887953 |
typedef struct per_thread_pool {
|
|
|
887953 |
- /* This never changes, so doesn't need a lock. */
|
|
|
887953 |
- struct mem_pool *parent;
|
|
|
887953 |
+ /* the pool that was used to request this allocation */
|
|
|
887953 |
+ struct mem_pool_shared *parent;
|
|
|
887953 |
/* Everything else is protected by our own lock. */
|
|
|
887953 |
pooled_obj_hdr_t *hot_list;
|
|
|
887953 |
pooled_obj_hdr_t *cold_list;
|
|
|
887953 |
@@ -243,7 +256,8 @@ typedef struct per_thread_pool_list {
|
|
|
887953 |
per_thread_pool_t pools[1];
|
|
|
887953 |
} per_thread_pool_list_t;
|
|
|
887953 |
|
|
|
887953 |
-struct mem_pool {
|
|
|
887953 |
+/* actual pool structure, shared between different mem_pools */
|
|
|
887953 |
+struct mem_pool_shared {
|
|
|
887953 |
unsigned int power_of_two;
|
|
|
887953 |
/*
|
|
|
887953 |
* Updates to these are *not* protected by a global lock, so races
|
|
|
887953 |
diff --git a/libglusterfs/src/mem-types.h b/libglusterfs/src/mem-types.h
|
|
|
887953 |
index 85cb5d2..64d0e90 100644
|
|
|
887953 |
--- a/libglusterfs/src/mem-types.h
|
|
|
887953 |
+++ b/libglusterfs/src/mem-types.h
|
|
|
887953 |
@@ -61,9 +61,7 @@ enum gf_common_mem_types_ {
|
|
|
887953 |
gf_common_mt_char,
|
|
|
887953 |
gf_common_mt_rbthash_table_t,
|
|
|
887953 |
gf_common_mt_rbthash_bucket,
|
|
|
887953 |
-#if defined(GF_DISABLE_MEMPOOL)
|
|
|
887953 |
gf_common_mt_mem_pool,
|
|
|
887953 |
-#endif
|
|
|
887953 |
gf_common_mt_long,
|
|
|
887953 |
gf_common_mt_rpcsvc_auth_list,
|
|
|
887953 |
gf_common_mt_rpcsvc_t,
|
|
|
887953 |
--
|
|
|
887953 |
1.8.3.1
|
|
|
887953 |
|