Simple enough, works for me.

Acked-by: Mark Michelson <[email protected]>

On 8/24/21 5:15 PM, Ilya Maximets wrote:
Currently pipeline is hashed as a string ("egress" or "ingress"),
and this seems wasteful.  Hashing it as a digit (P_IN or P_OUT)
to eliminate one call to hash_string() for every generated logical
flow.

In my testing this saves 1.5 - 3 % of a processing time.

Signed-off-by: Ilya Maximets <[email protected]>
---
  lib/ovn-util.c      | 14 ++++++++++----
  lib/ovn-util.h      |  8 +++++++-
  northd/ovn-northd.c |  8 +-------
  3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/lib/ovn-util.c b/lib/ovn-util.c
index 3805923c8..683ca37d9 100644
--- a/lib/ovn-util.c
+++ b/lib/ovn-util.c
@@ -523,11 +523,18 @@ ovn_is_known_nb_lsp_type(const char *type)
      return false;
  }
  
+static enum ovn_pipeline
+ovn_pipeline_from_name(const char *pipeline)
+{
+    return pipeline[0] == 'i' ? P_IN : P_OUT;
+}
+
  uint32_t
  sbrec_logical_flow_hash(const struct sbrec_logical_flow *lf)
  {
      const struct sbrec_datapath_binding *ld = lf->logical_datapath;
-    uint32_t hash = ovn_logical_flow_hash(lf->table_id, lf->pipeline,
+    uint32_t hash = ovn_logical_flow_hash(lf->table_id,
+                                          ovn_pipeline_from_name(lf->pipeline),
                                            lf->priority, lf->match,
                                            lf->actions);
@@ -535,12 +542,11 @@ sbrec_logical_flow_hash(const struct sbrec_logical_flow *lf)
  }
uint32_t
-ovn_logical_flow_hash(uint8_t table_id, const char *pipeline,
+ovn_logical_flow_hash(uint8_t table_id, enum ovn_pipeline pipeline,
                        uint16_t priority,
                        const char *match, const char *actions)
  {
-    size_t hash = hash_2words((table_id << 16) | priority, 0);
-    hash = hash_string(pipeline, hash);
+    size_t hash = hash_2words((table_id << 16) | priority, pipeline);
      hash = hash_string(match, hash);
      return hash_string(actions, hash);
  }
diff --git a/lib/ovn-util.h b/lib/ovn-util.h
index 9935cad34..b0bc70a16 100644
--- a/lib/ovn-util.h
+++ b/lib/ovn-util.h
@@ -102,8 +102,14 @@ const char *db_table_usage(struct ds *tables,
bool ovn_is_known_nb_lsp_type(const char *type); +/* The two pipelines in an OVN logical flow table. */
+enum ovn_pipeline {
+    P_IN,                       /* Ingress pipeline. */
+    P_OUT                       /* Egress pipeline. */
+};
+
  uint32_t sbrec_logical_flow_hash(const struct sbrec_logical_flow *);
-uint32_t ovn_logical_flow_hash(uint8_t table_id, const char *pipeline,
+uint32_t ovn_logical_flow_hash(uint8_t table_id, enum ovn_pipeline pipeline,
                                 uint16_t priority,
                                 const char *match, const char *actions);
  uint32_t ovn_logical_flow_hash_datapath(const struct uuid *logical_datapath,
diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
index a9a3987b8..b22cf5388 100644
--- a/northd/ovn-northd.c
+++ b/northd/ovn-northd.c
@@ -120,12 +120,6 @@ static const char *ssl_ca_cert_file;
  
  /* Pipeline stages. */
-/* The two pipelines in an OVN logical flow table. */
-enum ovn_pipeline {
-    P_IN,                       /* Ingress pipeline. */
-    P_OUT                       /* Egress pipeline. */
-};
-
  /* The two purposes for which ovn-northd uses OVN logical datapaths. */
  enum ovn_datapath_type {
      DP_SWITCH,                  /* OVN logical switch. */
@@ -4412,7 +4406,7 @@ ovn_lflow_add_at(struct hmap *lflow_map, struct 
ovn_datapath *od,
      uint32_t hash;
hash = ovn_logical_flow_hash(ovn_stage_get_table(stage),
-                                 ovn_stage_get_pipeline_name(stage),
+                                 ovn_stage_get_pipeline(stage),
                                   priority, match,
                                   actions);

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to