]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: pool: include freq_ctr.h and remove locally duplicated functions
authorWilly Tarreau <w@1wt.eu>
Mon, 1 Jun 2020 10:35:03 +0000 (12:35 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 11 Jun 2020 08:18:56 +0000 (10:18 +0200)
In memory.h we had to reimplement the swrate* functions just because of
a broken circular dependency around freq_ctr.h. Now that this one is
solved, let's get rid of this copy and use the original ones instead.

include/common/memory.h
src/memory.c

index d5b3191b9b10ceeb9e6e963d390d0708bb2dd296..88119a00385db083d45d62517b3291c3dd221a58 100644 (file)
@@ -29,6 +29,7 @@
 #include <unistd.h>
 
 #include <haproxy/api.h>
+#include <haproxy/freq_ctr.h>
 #include <haproxy/list.h>
 #include <haproxy/thread.h>
 
@@ -57,6 +58,8 @@
 
 #define MAX_BASE_POOLS 32
 
+#define POOL_AVG_SAMPLES 1024
+
 struct pool_cache_head {
        struct list list;    /* head of objects in this pool */
        size_t size;         /* size of an object */
@@ -181,48 +184,10 @@ static inline ssize_t pool_get_index(const struct pool_head *pool)
        return idx;
 }
 
-/* The two functions below were copied from freq_ctr.h's swrate_add, impossible
- * to use here due to include dependency hell again!
- */
-#define POOL_AVG_SAMPLES 1024
-
-static inline unsigned int pool_avg_add(unsigned int *sum, unsigned int v)
-{
-       unsigned int new_sum, old_sum;
-       unsigned int n = POOL_AVG_SAMPLES;
-
-       old_sum = *sum;
-       do {
-               new_sum = old_sum - (old_sum + n - 1) / n + v;
-       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum));
-       return new_sum;
-}
-
-/* make the new value <v> count for 1/4 of the total sum */
-static inline unsigned int pool_avg_bump(unsigned int *sum, unsigned int v)
-{
-       unsigned int new_sum, old_sum;
-       unsigned int n = POOL_AVG_SAMPLES;
-
-       old_sum = *sum;
-       do {
-               new_sum = old_sum - (old_sum + 3) / 4;
-               new_sum += (n * v + 3) / 4;
-       } while (!_HA_ATOMIC_CAS(sum, &old_sum, new_sum));
-       return new_sum;
-}
-
-static inline unsigned int pool_avg(unsigned int sum)
-{
-       unsigned int n = POOL_AVG_SAMPLES;
-
-       return (sum + n - 1) / n;
-}
-
 /* returns true if the pool is considered to have too many free objects */
 static inline int pool_is_crowded(const struct pool_head *pool)
 {
-       return pool->allocated >= pool_avg(pool->needed_avg + pool->needed_avg / 4) &&
+       return pool->allocated >= swrate_avg(pool->needed_avg + pool->needed_avg / 4, POOL_AVG_SAMPLES) &&
               (int)(pool->allocated - pool->used) >= pool->minavail;
 }
 
@@ -351,7 +316,7 @@ static inline void __pool_free(struct pool_head *pool, void *ptr)
                } while (!_HA_ATOMIC_CAS(&pool->free_list, &free_list, ptr));
                __ha_barrier_atomic_store();
        }
-       pool_avg_add(&pool->needed_avg, pool->used);
+       swrate_add(&pool->needed_avg, POOL_AVG_SAMPLES, pool->used);
 }
 
 /* frees an object to the local cache, possibly pushing oldest objects to the
@@ -566,7 +531,7 @@ static inline void pool_free(struct pool_head *pool, void *ptr)
                        *POOL_LINK(pool, ptr) = (void *)pool->free_list;
                        pool->free_list = (void *)ptr;
                }
-               pool_avg_add(&pool->needed_avg, pool->used);
+               swrate_add(&pool->needed_avg, POOL_AVG_SAMPLES, pool->used);
                HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock);
 #else  /* release the entry for real to detect use after free */
                /* ensure we crash on double free or free of a const area*/
@@ -575,7 +540,7 @@ static inline void pool_free(struct pool_head *pool, void *ptr)
                HA_SPIN_LOCK(POOL_LOCK, &pool->lock);
                pool->allocated--;
                pool->used--;
-               pool_avg_add(&pool->needed_avg, pool->used);
+               swrate_add(&pool->needed_avg, POOL_AVG_SAMPLES, pool->used);
                HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock);
 #endif /* DEBUG_UAF */
        }
index a0e57c7d891e52caba145b9a7cc511157abaefe5..453160562400243ad5e1b8940573a6b502ed35a1 100644 (file)
@@ -170,7 +170,7 @@ void *__pool_refill_alloc(struct pool_head *pool, unsigned int avail)
                        return NULL;
                }
 
-               pool_avg_bump(&pool->needed_avg, pool->allocated);
+               swrate_add_scaled(&pool->needed_avg, POOL_AVG_SAMPLES, pool->allocated, POOL_AVG_SAMPLES/4);
 
                ptr = malloc(size + POOL_EXTRA);
                if (!ptr) {
@@ -338,7 +338,7 @@ void *__pool_refill_alloc(struct pool_head *pool, unsigned int avail)
                        return NULL;
                }
 
-               pool_avg_bump(&pool->needed_avg, pool->allocated);
+               swrate_add_scaled(&pool->needed_avg, POOL_AVG_SAMPLES, pool->allocated, POOL_AVG_SAMPLES/4);
                HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock);
                ptr = pool_alloc_area(pool->size + POOL_EXTRA);
 #ifdef DEBUG_MEMORY_POOLS
@@ -486,7 +486,7 @@ void dump_pools_to_trash()
                chunk_appendf(&trash, "  - Pool %s (%u bytes) : %u allocated (%u bytes), %u used, needed_avg %u, %u failures, %u users, @%p=%02d%s\n",
                         entry->name, entry->size, entry->allocated,
                         entry->size * entry->allocated, entry->used,
-                        pool_avg(entry->needed_avg), entry->failed,
+                        swrate_avg(entry->needed_avg, POOL_AVG_SAMPLES), entry->failed,
                         entry->users, entry, (int)pool_get_index(entry),
                         (entry->flags & MEM_F_SHARED) ? " [SHARED]" : "");