From 1bd2d592532008a1e1579a08cc8f7b18cf26c3a0 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Sat, 24 Jul 2010 10:40:52 +0200 Subject: [PATCH] Merge decode and stream threads in RunModeIdsPcapAuto like in the file runmode. Fix these runmodes not adhering to the cpu affinity setting if CUDA is compiled in. --- src/runmodes.c | 180 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 145 insertions(+), 35 deletions(-) diff --git a/src/runmodes.c b/src/runmodes.c index a443b8436c..8d1396d888 100644 --- a/src/runmodes.c +++ b/src/runmodes.c @@ -2104,7 +2104,125 @@ int RunModeIdsPcapAuto(DetectEngineCtx *de_ctx, char *iface) { exit(EXIT_FAILURE); } - ThreadVars *tv_decode1 = TmThreadCreatePacketHandler("Decode1","pickup-queue","simple","decode-queue1","simple","1slot"); +#if defined(__SC_CUDA_SUPPORT__) + if (PatternMatchDefaultMatcher() == MPM_B2G_CUDA) { + ThreadVars *tv_decode1 = TmThreadCreatePacketHandler("Decode", + "pickup-queue", "simple", + "decode-queue1", "simple", + "1slot"); + if (tv_decode1 == NULL) { + printf("ERROR: TmThreadsCreate failed for Decode1\n"); + exit(EXIT_FAILURE); + } + tm_module = TmModuleGetByName("DecodePcap"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName DecodePcap failed\n"); + exit(EXIT_FAILURE); + } + Tm1SlotSetFunc(tv_decode1, tm_module, NULL); + + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_decode1, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); + } + + if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { + printf("ERROR: TmThreadSpawn failed\n"); + exit(EXIT_FAILURE); + } + + ThreadVars *tv_cuda_PB = TmThreadCreate("CUDA_PB", + "decode-queue1", "simple", + "cuda-pb-queue1", "simple", + "custom", SCCudaPBTmThreadsSlot1, 0); + if (tv_cuda_PB == NULL) { + printf("ERROR: TmThreadsCreate failed for CUDA_PB\n"); + exit(EXIT_FAILURE); + } + tv_cuda_PB->type = TVT_PPT; + + tm_module = TmModuleGetByName("CudaPacketBatcher"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName CudaPacketBatcher failed\n"); + exit(EXIT_FAILURE); + } + Tm1SlotSetFunc(tv_cuda_PB, tm_module, (void *)de_ctx); + + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_cuda_PB, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_cuda_PB, PRIO_MEDIUM); + } + + if (TmThreadSpawn(tv_cuda_PB) != TM_ECODE_OK) { + printf("ERROR: TmThreadSpawn failed\n"); + exit(EXIT_FAILURE); + } + + ThreadVars *tv_stream1 = TmThreadCreatePacketHandler("Stream1", + "cuda-pb-queue1", "simple", + "stream-queue1", "simple", + "1slot"); + if (tv_stream1 == NULL) { + printf("ERROR: TmThreadsCreate failed for Stream1\n"); + exit(EXIT_FAILURE); + } + tm_module = TmModuleGetByName("StreamTcp"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName StreamTcp failed\n"); + exit(EXIT_FAILURE); + } + Tm1SlotSetFunc(tv_stream1,tm_module,NULL); + + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_stream1, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_stream1, PRIO_MEDIUM); + } + + if (TmThreadSpawn(tv_stream1) != TM_ECODE_OK) { + printf("ERROR: TmThreadSpawn failed\n"); + exit(EXIT_FAILURE); + } + } else { + ThreadVars *tv_decode1 = TmThreadCreatePacketHandler("Decode & Stream", + "pickup-queue", "simple", + "stream-queue1", "simple", + "varslot"); + if (tv_decode1 == NULL) { + printf("ERROR: TmThreadsCreate failed for Decode1\n"); + exit(EXIT_FAILURE); + } + tm_module = TmModuleGetByName("DecodePcapFile"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName DecodePcap failed\n"); + exit(EXIT_FAILURE); + } + TmVarSlotSetFuncAppend(tv_decode1,tm_module,NULL); + + tm_module = TmModuleGetByName("StreamTcp"); + if (tm_module == NULL) { + printf("ERROR: TmModuleGetByName StreamTcp failed\n"); + exit(EXIT_FAILURE); + } + TmVarSlotSetFuncAppend(tv_decode1,tm_module,NULL); + + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_decode1, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); + } + + if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { + printf("ERROR: TmThreadSpawn failed\n"); + exit(EXIT_FAILURE); + } + } +#else +//#if 0 + //ThreadVars *tv_decode1 = TmThreadCreatePacketHandler("Decode & Stream","pickup-queue","simple","packetpool","packetpool","varslot"); + ThreadVars *tv_decode1 = TmThreadCreatePacketHandler("Decode & Stream","pickup-queue","simple","stream-queue1","simple","varslot"); if (tv_decode1 == NULL) { printf("ERROR: TmThreadsCreate failed for Decode1\n"); exit(EXIT_FAILURE); @@ -2114,42 +2232,26 @@ int RunModeIdsPcapAuto(DetectEngineCtx *de_ctx, char *iface) { printf("ERROR: TmModuleGetByName DecodePcap failed\n"); exit(EXIT_FAILURE); } - Tm1SlotSetFunc(tv_decode1,tm_module,NULL); - - if (threading_set_cpu_affinity) { - TmThreadSetCPUAffinity(tv_decode1, 0); - if (ncpus > 1) - TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); - } - - if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { - printf("ERROR: TmThreadSpawn failed\n"); - exit(EXIT_FAILURE); - } + TmVarSlotSetFuncAppend(tv_decode1,tm_module,NULL); - ThreadVars *tv_stream1 = TmThreadCreatePacketHandler("Stream1","decode-queue1","simple","stream-queue1","simple","1slot"); - if (tv_stream1 == NULL) { - printf("ERROR: TmThreadsCreate failed for Stream1\n"); - exit(EXIT_FAILURE); - } tm_module = TmModuleGetByName("StreamTcp"); if (tm_module == NULL) { printf("ERROR: TmModuleGetByName StreamTcp failed\n"); exit(EXIT_FAILURE); } - Tm1SlotSetFunc(tv_stream1,tm_module,NULL); + TmVarSlotSetFuncAppend(tv_decode1,tm_module,NULL); if (threading_set_cpu_affinity) { - TmThreadSetCPUAffinity(tv_stream1, 0); + TmThreadSetCPUAffinity(tv_decode1, 0); if (ncpus > 1) - TmThreadSetThreadPriority(tv_stream1, PRIO_MEDIUM); + TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); } - if (TmThreadSpawn(tv_stream1) != TM_ECODE_OK) { + if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { printf("ERROR: TmThreadSpawn failed\n"); exit(EXIT_FAILURE); } - +#endif /* start with cpu 1 so that if we're creating an odd number of detect * threads we're not creating the most on CPU0. */ if (ncpus > 0) @@ -2326,9 +2428,11 @@ int RunModeFilePcapAuto(DetectEngineCtx *de_ctx, char *file) { } Tm1SlotSetFunc(tv_decode1, tm_module, NULL); - TmThreadSetCPUAffinity(tv_decode1, 0); - if (ncpus > 1) - TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_decode1, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); + } if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { printf("ERROR: TmThreadSpawn failed\n"); @@ -2352,9 +2456,11 @@ int RunModeFilePcapAuto(DetectEngineCtx *de_ctx, char *file) { } Tm1SlotSetFunc(tv_cuda_PB, tm_module, (void *)de_ctx); - TmThreadSetCPUAffinity(tv_cuda_PB, 0); - if (ncpus > 1) - TmThreadSetThreadPriority(tv_cuda_PB, PRIO_MEDIUM); + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_cuda_PB, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_cuda_PB, PRIO_MEDIUM); + } if (TmThreadSpawn(tv_cuda_PB) != TM_ECODE_OK) { printf("ERROR: TmThreadSpawn failed\n"); @@ -2376,9 +2482,11 @@ int RunModeFilePcapAuto(DetectEngineCtx *de_ctx, char *file) { } Tm1SlotSetFunc(tv_stream1,tm_module,NULL); - TmThreadSetCPUAffinity(tv_stream1, 0); - if (ncpus > 1) - TmThreadSetThreadPriority(tv_stream1, PRIO_MEDIUM); + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_stream1, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_stream1, PRIO_MEDIUM); + } if (TmThreadSpawn(tv_stream1) != TM_ECODE_OK) { printf("ERROR: TmThreadSpawn failed\n"); @@ -2407,9 +2515,11 @@ int RunModeFilePcapAuto(DetectEngineCtx *de_ctx, char *file) { } TmVarSlotSetFuncAppend(tv_decode1,tm_module,NULL); - TmThreadSetCPUAffinity(tv_decode1, 0); - if (ncpus > 1) - TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); + if (threading_set_cpu_affinity) { + TmThreadSetCPUAffinity(tv_decode1, 0); + if (ncpus > 1) + TmThreadSetThreadPriority(tv_decode1, PRIO_MEDIUM); + } if (TmThreadSpawn(tv_decode1) != TM_ECODE_OK) { printf("ERROR: TmThreadSpawn failed\n");