const uint32_t sq_len = FlowSpareGetPoolSize();
const uint32_t spare_perc = sq_len * 100 / flow_config.prealloc;
/* see if we still have enough spare flows */
- if (spare_perc < 90) {
+ if (spare_perc < 90 || spare_perc > 110) {
FlowSparePoolUpdate(sq_len);
}
}
{
const int64_t todo = (int64_t)flow_config.prealloc - (int64_t)size;
if (todo < 0) {
- // remove
+ /* remove one block at most at a time */
+ uint32_t to_remove = (uint32_t)(todo * -1) / 10;
+ if (to_remove < flow_spare_pool_block_size)
+ return;
+
+ FlowSparePool *p = NULL;
+ SCMutexLock(&flow_spare_pool_m);
+ p = flow_spare_pool;
+ if (p != NULL) {
+ flow_spare_pool = p->next;
+ flow_spare_pool_flow_cnt -= p->queue.len;
+ }
+ SCMutexUnlock(&flow_spare_pool_m);
+
+ if (p != NULL) {
+ Flow *f;
+ while ((f = FlowQueuePrivateGetFromTop(&p->queue))) {
+ FlowFree(f);
+ }
+ SCFree(p);
+ }
+
} else if (todo > 0) {
FlowSparePool *head = NULL, *tail = NULL;