]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
af-packet: improve threads selection logic
authorVictor Julien <victor@inliniac.net>
Fri, 1 Jul 2016 14:03:53 +0000 (16:03 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 6 Jul 2016 11:09:21 +0000 (13:09 +0200)
Only use RSS queue count when cluster_qm is used. Only use core count
when cluster_flow is used.

Use a local variable to simplify the check so that we don't have to deal
with the extra flags.

src/runmode-af-packet.c

index d230eabbba8fa693ad9ed9684cf4fa41fd3cdfe5..0de06c12b986a63061460a58da8f4818aab176b7 100644 (file)
@@ -122,6 +122,7 @@ void *ParseAFPConfig(const char *iface)
     int boolval;
     char *bpf_filter = NULL;
     char *out_iface = NULL;
+    int cluster_type = PACKET_FANOUT_HASH;
 
     if (iface == NULL) {
         return NULL;
@@ -138,7 +139,7 @@ void *ParseAFPConfig(const char *iface)
     (void) SC_ATOMIC_ADD(aconf->ref, 1);
     aconf->buffer_size = 0;
     aconf->cluster_id = 1;
-    aconf->cluster_type = PACKET_FANOUT_HASH | PACKET_FANOUT_FLAG_DEFRAG;
+    aconf->cluster_type = cluster_type | PACKET_FANOUT_FLAG_DEFRAG;
     aconf->promisc = 1;
     aconf->checksum_mode = CHECKSUM_VALIDATION_KERNEL;
     aconf->DerefFunc = AFPDerefConfig;
@@ -283,10 +284,12 @@ void *ParseAFPConfig(const char *iface)
     if (ConfGetChildValueWithDefault(if_root, if_default, "cluster-type", &tmpctype) != 1) {
         /* default to our safest choice: flow hashing + defrag enabled */
         aconf->cluster_type = PACKET_FANOUT_HASH | PACKET_FANOUT_FLAG_DEFRAG;
+        cluster_type = PACKET_FANOUT_HASH;
     } else if (strcmp(tmpctype, "cluster_round_robin") == 0) {
         SCLogConfig("Using round-robin cluster mode for AF_PACKET (iface %s)",
                 aconf->iface);
         aconf->cluster_type = PACKET_FANOUT_LB;
+        cluster_type = PACKET_FANOUT_LB;
     } else if (strcmp(tmpctype, "cluster_flow") == 0) {
         /* In hash mode, we also ask for defragmentation needed to
          * compute the hash */
@@ -301,22 +304,27 @@ void *ParseAFPConfig(const char *iface)
             defrag = PACKET_FANOUT_FLAG_DEFRAG;
         }
         aconf->cluster_type = PACKET_FANOUT_HASH | defrag;
+        cluster_type = PACKET_FANOUT_HASH;
     } else if (strcmp(tmpctype, "cluster_cpu") == 0) {
         SCLogConfig("Using cpu cluster mode for AF_PACKET (iface %s)",
                 aconf->iface);
         aconf->cluster_type = PACKET_FANOUT_CPU;
+        cluster_type = PACKET_FANOUT_CPU;
     } else if (strcmp(tmpctype, "cluster_qm") == 0) {
         SCLogConfig("Using queue based cluster mode for AF_PACKET (iface %s)",
                 aconf->iface);
         aconf->cluster_type = PACKET_FANOUT_QM;
+        cluster_type = PACKET_FANOUT_QM;
     } else if (strcmp(tmpctype, "cluster_random") == 0) {
         SCLogConfig("Using random based cluster mode for AF_PACKET (iface %s)",
                 aconf->iface);
         aconf->cluster_type = PACKET_FANOUT_RND;
+        cluster_type = PACKET_FANOUT_RND;
     } else if (strcmp(tmpctype, "cluster_rollover") == 0) {
         SCLogConfig("Using rollover based cluster mode for AF_PACKET (iface %s)",
                 aconf->iface);
         aconf->cluster_type = PACKET_FANOUT_ROLLOVER;
+        cluster_type = PACKET_FANOUT_ROLLOVER;
 
     } else {
         SCLogWarning(SC_ERR_INVALID_CLUSTER_TYPE,"invalid cluster-type %s",tmpctype);
@@ -401,17 +409,20 @@ finalize:
 
     /* try to automagically set the proper number of threads */
     if (aconf->threads == 0) {
-        int rss_queues;
-        aconf->threads = (int)UtilCpuGetNumProcessorsOnline();
-        /* Get the number of RSS queues and take the min */
-        rss_queues = GetIfaceRSSQueuesNum(iface);
-        if (rss_queues > 0) {
-            if (rss_queues < aconf->threads) {
+        /* for cluster_flow use core count */
+        if (cluster_type == PACKET_FANOUT_HASH) {
+            aconf->threads = (int)UtilCpuGetNumProcessorsOnline();
+            SCLogPerf("%u cores, so using %u threads", aconf->threads, aconf->threads);
+
+        /* for cluster_qm use RSS queue count */
+        } else if (cluster_type == PACKET_FANOUT_QM) {
+            int rss_queues = GetIfaceRSSQueuesNum(iface);
+            if (rss_queues > 0) {
                 aconf->threads = rss_queues;
-                SCLogInfo("More cores than RSS queues, using %d threads "
-                        "for interface %s", aconf->threads, iface);
+                SCLogPerf("%d RSS queues, so using %u threads", rss_queues, aconf->threads);
             }
         }
+
         if (aconf->threads) {
             SCLogPerf("Using %d AF_PACKET threads for interface %s",
                     aconf->threads, iface);