From: Victor Julien Date: Sun, 3 Nov 2019 09:02:18 +0000 (+0100) Subject: threading: optimize error handling in main packet loop X-Git-Tag: suricata-6.0.0-beta1~819 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85cf34118989a8b253cb66edc8659d1d2bc1f86a;p=thirdparty%2Fsuricata.git threading: optimize error handling in main packet loop --- diff --git a/src/tm-threads.h b/src/tm-threads.h index 5770f2c026..4157d728bc 100644 --- a/src/tm-threads.h +++ b/src/tm-threads.h @@ -148,66 +148,58 @@ TmSlot *TmThreadGetFirstTmSlotForPartialPattern(const char *); uint32_t TmThreadCountThreadsByTmmFlags(uint8_t flags); +static inline void TmThreadsSlotProcessPktFail(ThreadVars *tv, TmSlot *s, Packet *p) +{ + TmqhOutputPacketpool(tv, p); + for (TmSlot *slot = s; slot != NULL; slot = slot->slot_next) { + SCMutexLock(&slot->slot_post_pq.mutex_q); + TmqhReleasePacketsToPacketPool(&slot->slot_post_pq); + SCMutexUnlock(&slot->slot_post_pq.mutex_q); + } + TmThreadsSetFlag(tv, THV_FAILED); +} + /** * \brief Process the rest of the functions (if any) and queue. */ static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet *p) { - TmEcode r = TM_ECODE_OK; - if (s == NULL) { tv->tmqh_out(tv, p); - return r; + return TM_ECODE_OK; } - if (TmThreadsSlotVarRun(tv, p, s) == TM_ECODE_FAILED) { - TmqhOutputPacketpool(tv, p); - TmSlot *slot = s; - while (slot != NULL) { - SCMutexLock(&slot->slot_post_pq.mutex_q); - TmqhReleasePacketsToPacketPool(&slot->slot_post_pq); - SCMutexUnlock(&slot->slot_post_pq.mutex_q); + TmEcode r = TmThreadsSlotVarRun(tv, p, s); + if (unlikely(r == TM_ECODE_FAILED)) { + TmThreadsSlotProcessPktFail(tv, s, p); + return TM_ECODE_FAILED; + } - slot = slot->slot_next; - } - TmThreadsSetFlag(tv, THV_FAILED); - r = TM_ECODE_FAILED; + tv->tmqh_out(tv, p); - } else { - tv->tmqh_out(tv, p); + /* post process pq */ + for (TmSlot *slot = s; slot != NULL; slot = slot->slot_next) { + if (slot->slot_post_pq.top != NULL) { + while (1) { + SCMutexLock(&slot->slot_post_pq.mutex_q); + Packet *extra_p = PacketDequeue(&slot->slot_post_pq); + SCMutexUnlock(&slot->slot_post_pq.mutex_q); - /* post process pq */ - TmSlot *slot = s; - while (slot != NULL) { - if (slot->slot_post_pq.top != NULL) { - while (1) { - SCMutexLock(&slot->slot_post_pq.mutex_q); - Packet *extra_p = PacketDequeue(&slot->slot_post_pq); - SCMutexUnlock(&slot->slot_post_pq.mutex_q); + if (extra_p == NULL) + break; - if (extra_p == NULL) + if (slot->slot_next != NULL) { + r = TmThreadsSlotVarRun(tv, extra_p, slot->slot_next); + if (r == TM_ECODE_FAILED) { + TmThreadsSlotProcessPktFail(tv, slot, extra_p); break; - - if (slot->slot_next != NULL) { - r = TmThreadsSlotVarRun(tv, extra_p, slot->slot_next); - if (r == TM_ECODE_FAILED) { - SCMutexLock(&slot->slot_post_pq.mutex_q); - TmqhReleasePacketsToPacketPool(&slot->slot_post_pq); - SCMutexUnlock(&slot->slot_post_pq.mutex_q); - - TmqhOutputPacketpool(tv, extra_p); - TmThreadsSetFlag(tv, THV_FAILED); - break; - } } - tv->tmqh_out(tv, extra_p); } - } /* if (slot->slot_post_pq.top != NULL) */ - slot = slot->slot_next; - } /* while (slot != NULL) */ + tv->tmqh_out(tv, extra_p); + } + } /* if (slot->slot_post_pq.top != NULL) */ } - - return r; + return TM_ECODE_OK; } /**