MEDIUM: pools: add a new flag to avoid rounding pool size up

Usually it's desirable to merge similarly sized pools, which is the
reason why their size is rounded up to the next multiple of 16. But
for the buffers this is problematic because we add the size of
struct buffer to the user-requested size, and the rounding results
in 8 extra bytes that are usable in the end. So the user gets more
bytes than asked for, and in case of SSL it results in short writes
for the extra bytes that are sent above multiples of 16 kB.

So we add a new flag MEM_F_EXACT to request that the size is not
rounded up when creating the entry. Thus it doesn't disable merging.
This commit is contained in:
Willy Tarreau 2016-01-25 02:19:13 +01:00
parent 999f643ed2
commit 581bf81d34
2 changed files with 8 additions and 3 deletions

View File

@ -33,6 +33,7 @@
#else #else
#define MEM_F_SHARED 0 #define MEM_F_SHARED 0
#endif #endif
#define MEM_F_EXACT 0x2
/* reserve an extra void* at the end of a pool for linking */ /* reserve an extra void* at the end of a pool for linking */
#ifdef DEBUG_MEMORY_POOLS #ifdef DEBUG_MEMORY_POOLS

View File

@ -24,7 +24,9 @@ int mem_poison_byte = -1;
/* Try to find an existing shared pool with the same characteristics and /* Try to find an existing shared pool with the same characteristics and
* returns it, otherwise creates this one. NULL is returned if no memory * returns it, otherwise creates this one. NULL is returned if no memory
* is available for a new creation. * is available for a new creation. Two flags are supported :
* - MEM_F_SHARED to indicate that the pool may be shared with other users
* - MEM_F_EXACT to indicate that the size must not be rounded up
*/ */
struct pool_head *create_pool(char *name, unsigned int size, unsigned int flags) struct pool_head *create_pool(char *name, unsigned int size, unsigned int flags)
{ {
@ -41,8 +43,10 @@ struct pool_head *create_pool(char *name, unsigned int size, unsigned int flags)
* so that the visible parts outside are not affected. * so that the visible parts outside are not affected.
*/ */
align = 16; if (!(flags & MEM_F_EXACT)) {
size = ((size + POOL_EXTRA + align - 1) & -align) - POOL_EXTRA; align = 16;
size = ((size + POOL_EXTRA + align - 1) & -align) - POOL_EXTRA;
}
start = &pools; start = &pools;
pool = NULL; pool = NULL;