When a chunk was retrieved via get_best_trash_chunk() or
alloc_best_trash_chunk(), it was not possible to get a large chunk when the
original buffer was a constant 0-sized buffer, independently on size of data
pointed by it.
With this patch, we relaxe the test. It is now possible to get a large
chunks from a 0-sized buffer if it points on large data. Indeed, in that
case, it means that data are hosted in a large buffer, so it is safe to get
a large chunk if possible.
This patch should be backported to 3.4 after a period of observation.
*/
static forceinline struct buffer *alloc_best_trash_chunk(const struct buffer *buf, size_t size)
{
- if (pool_head_large_trash && buf->size == pool_head_large_trash->size)
+ if (pool_head_large_trash && (buf->size == pool_head_large_trash->size || buf->data > pool_head_trash->size))
return alloc_trash_chunk_sz(size);
else if (size <= pool_head_trash->size)
return alloc_trash_chunk();
*/
struct buffer *get_best_trash_chunk(const struct buffer *buf, size_t size)
{
- if (large_trash_size && buf->size == large_trash_size)
+ if (large_trash_size && (buf->size == large_trash_size || buf->data > trash_size))
return get_trash_chunk_sz(size);
else if (size <= trash_size)
return get_trash_chunk();