flow: spare pool return optimization

In case small blocks of flows are returned, try to merge
them with existing small list head. Add full block as second
in the list as with the rest of the code.
pull/8945/head
Victor Julien 2 years ago
parent afbd4162f2
commit 5b160d274c

@ -126,13 +126,50 @@ void FlowSparePoolReturnFlows(FlowQueuePrivate *fqp)
p->queue = *fqp;
SCMutexLock(&flow_spare_pool_m);
p->next = flow_spare_pool;
flow_spare_pool = p;
flow_spare_pool_flow_cnt += fqp->len;
if (flow_spare_pool != NULL) {
if (p->queue.len == flow_spare_pool_block_size) {
/* full block insert */
if (flow_spare_pool->queue.len < flow_spare_pool_block_size) {
p->next = flow_spare_pool->next;
flow_spare_pool->next = p;
p = NULL;
} else {
p->next = flow_spare_pool;
flow_spare_pool = p;
p = NULL;
}
} else {
/* incomplete block insert */
if (p->queue.len + flow_spare_pool->queue.len <= flow_spare_pool_block_size) {
FlowQueuePrivateAppendPrivate(&flow_spare_pool->queue, &p->queue);
/* free 'p' outside of lock below */
} else {
// put smallest first
if (p->queue.len < flow_spare_pool->queue.len) {
p->next = flow_spare_pool;
flow_spare_pool = p;
} else {
p->next = flow_spare_pool->next;
flow_spare_pool->next = p;
}
p = NULL;
}
}
} else {
p->next = flow_spare_pool;
flow_spare_pool = p;
p = NULL;
}
SCMutexUnlock(&flow_spare_pool_m);
FlowQueuePrivate empty = { NULL, NULL, 0 };
*fqp = empty;
if (p != NULL)
SCFree(p);
}
FlowQueuePrivate FlowSpareGetFromPool(void)

Loading…
Cancel
Save