This looks correct, OK florian
btw. I had some trouble fining getpool(), OK for the style(9) fix?
diff --git malloc.c malloc.c
index d5a651c7dea..b30ee820cf1 100644
--- malloc.c
+++ malloc.c
@@ -260,8 +260,8 @@ hash(void *p)
return sum;
}
-static inline
-struct dir_info *getpool(void)
+static inline struct dir_info *
+getpool(void)
{
if (!mopts.malloc_mt)
return mopts.malloc_pool[0];
On Thu, Dec 06, 2018 at 11:30:03AM +0100, Otto Moerbeek wrote:
> Hi,
>
> This simpifies the lock dance when a free is done for a pointer not in
> "my pool". Should reduce lock contention.
>
> Please review & test, especially with multithread heavy apps.
>
> -Otto
>
> Index: malloc.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v
> retrieving revision 1.255
> diff -u -p -r1.255 malloc.c
> --- malloc.c 27 Nov 2018 17:29:55 -0000 1.255
> +++ malloc.c 6 Dec 2018 10:26:56 -0000
> @@ -1309,14 +1309,14 @@ findpool(void *p, struct dir_info *argpo
> }
>
> static void
> -ofree(struct dir_info *argpool, void *p, int clear, int check, size_t argsz)
> +ofree(struct dir_info **argpool, void *p, int clear, int check, size_t argsz)
> {
> struct region_info *r;
> struct dir_info *pool;
> char *saved_function;
> size_t sz;
>
> - r = findpool(p, argpool, &pool, &saved_function);
> + r = findpool(p, *argpool, &pool, &saved_function);
>
> REALSIZE(sz, r);
> if (check) {
> @@ -1405,12 +1405,9 @@ ofree(struct dir_info *argpool, void *p,
> }
> }
>
> - if (argpool != pool) {
> - pool->active--;
> + if (*argpool != pool) {
> pool->func = saved_function;
> - _MALLOC_UNLOCK(pool->mutex);
> - _MALLOC_LOCK(argpool->mutex);
> - argpool->active++;
> + *argpool = pool;
> }
> }
>
> @@ -1433,7 +1430,7 @@ free(void *ptr)
> malloc_recurse(d);
> return;
> }
> - ofree(d, ptr, 0, 0, 0);
> + ofree(&d, ptr, 0, 0, 0);
> d->active--;
> _MALLOC_UNLOCK(d->mutex);
> errno = saved_errno;
> @@ -1471,7 +1468,7 @@ freezero(void *ptr, size_t sz)
> malloc_recurse(d);
> return;
> }
> - ofree(d, ptr, 1, 1, sz);
> + ofree(&d, ptr, 1, 1, sz);
> d->active--;
> _MALLOC_UNLOCK(d->mutex);
> errno = saved_errno;
> @@ -1479,7 +1476,7 @@ freezero(void *ptr, size_t sz)
> DEF_WEAK(freezero);
>
> static void *
> -orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f)
> +orealloc(struct dir_info **argpool, void *p, size_t newsz, void *f)
> {
> struct region_info *r;
> struct dir_info *pool;
> @@ -1490,14 +1487,14 @@ orealloc(struct dir_info *argpool, void
> uint32_t chunknum;
>
> if (p == NULL)
> - return omalloc(argpool, newsz, 0, f);
> + return omalloc(*argpool, newsz, 0, f);
>
> if (newsz >= SIZE_MAX - mopts.malloc_guard - MALLOC_PAGESIZE) {
> errno = ENOMEM;
> return NULL;
> }
>
> - r = findpool(p, argpool, &pool, &saved_function);
> + r = findpool(p, *argpool, &pool, &saved_function);
>
> REALSIZE(oldsz, r);
> if (mopts.chunk_canaries && oldsz <= MALLOC_MAXCHUNK) {
> @@ -1631,7 +1628,7 @@ gotit:
> }
> if (newsz != 0 && oldsz != 0)
> memcpy(q, p, oldsz < newsz ? oldsz : newsz);
> - ofree(pool, p, 0, 0, 0);
> + ofree(&pool, p, 0, 0, 0);
> ret = q;
> } else {
> /* oldsz == newsz */
> @@ -1641,12 +1638,9 @@ gotit:
> ret = p;
> }
> done:
> - if (argpool != pool) {
> - pool->active--;
> + if (*argpool != pool) {
> pool->func = saved_function;
> - _MALLOC_UNLOCK(pool->mutex);
> - _MALLOC_LOCK(argpool->mutex);
> - argpool->active++;
> + *argpool = pool;
> }
> return ret;
> }
> @@ -1669,7 +1663,7 @@ realloc(void *ptr, size_t size)
> malloc_recurse(d);
> return NULL;
> }
> - r = orealloc(d, ptr, size, CALLER);
> + r = orealloc(&d, ptr, size, CALLER);
>
> d->active--;
> _MALLOC_UNLOCK(d->mutex);
> @@ -1730,7 +1724,7 @@ calloc(size_t nmemb, size_t size)
> /*DEF_STRONG(calloc);*/
>
> static void *
> -orecallocarray(struct dir_info *argpool, void *p, size_t oldsize,
> +orecallocarray(struct dir_info **argpool, void *p, size_t oldsize,
> size_t newsize, void *f)
> {
> struct region_info *r;
> @@ -1740,12 +1734,12 @@ orecallocarray(struct dir_info *argpool,
> size_t sz;
>
> if (p == NULL)
> - return omalloc(argpool, newsize, 1, f);
> + return omalloc(*argpool, newsize, 1, f);
>
> if (oldsize == newsize)
> return p;
>
> - r = findpool(p, argpool, &pool, &saved_function);
> + r = findpool(p, *argpool, &pool, &saved_function);
>
> REALSIZE(sz, r);
> if (sz <= MALLOC_MAXCHUNK) {
> @@ -1772,15 +1766,12 @@ orecallocarray(struct dir_info *argpool,
> } else
> memcpy(newptr, p, newsize);
>
> - ofree(pool, p, 1, 0, oldsize);
> + ofree(&pool, p, 1, 0, oldsize);
>
> done:
> - if (argpool != pool) {
> - pool->active--;
> + if (*argpool != pool) {
> pool->func = saved_function;
> - _MALLOC_UNLOCK(pool->mutex);
> - _MALLOC_LOCK(argpool->mutex);
> - argpool->active++;
> + *argpool = pool;
> }
>
> return newptr;
> @@ -1883,7 +1874,7 @@ recallocarray(void *ptr, size_t oldnmemb
> return NULL;
> }
>
> - r = orecallocarray(d, ptr, oldsize, newsize, CALLER);
> + r = orecallocarray(&d, ptr, oldsize, newsize, CALLER);
>
> d->active--;
> _MALLOC_UNLOCK(d->mutex);
>
--
I'm not entirely sure you are real.