diff mbox series

[ovs-dev] ovn-northd: Hash pipeline as a digit.

Message ID 20210824211520.1034341-1-i.maximets@ovn.org
State Accepted
Headers show
Series [ovs-dev] ovn-northd: Hash pipeline as a digit. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes fail github build: failed

Commit Message

Ilya Maximets Aug. 24, 2021, 9:15 p.m. UTC
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 <i.maximets@ovn.org>
---
 lib/ovn-util.c      | 14 ++++++++++----
 lib/ovn-util.h      |  8 +++++++-
 northd/ovn-northd.c |  8 +-------
 3 files changed, 18 insertions(+), 12 deletions(-)

Comments

Mark Michelson Aug. 27, 2021, 5:07 p.m. UTC | #1
Simple enough, works for me.

Acked-by: Mark Michelson <mmichels@redhat.com>

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 <i.maximets@ovn.org>
> ---
>   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);
>   
>
Numan Siddique Aug. 27, 2021, 9:25 p.m. UTC | #2
On Fri, Aug 27, 2021 at 1:08 PM Mark Michelson <mmichels@redhat.com> wrote:
>
> Simple enough, works for me.
>
> Acked-by: Mark Michelson <mmichels@redhat.com>

Thanks.  I applied this patch to the main branch.

Numan

>
> 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 <i.maximets@ovn.org>
> > ---
> >   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
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox series

Patch

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);