diff mbox series

[ovs-dev,v13,02/12] dpif-netdev: Split HWOL out to own header file.

Message ID 20210617161825.94741-3-cian.ferriter@intel.com
State Changes Requested
Headers show
Series DPIF Framework + Optimizations | expand

Commit Message

Ferriter, Cian June 17, 2021, 4:18 p.m. UTC
From: Harry van Haaren <harry.van.haaren@intel.com>

This commit moves the datapath lookup functions required for
hardware offload to a seperate file. This allows other DPIF
implementations to access the lookup functions, encouraging
code reuse.

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>

---

Cc: Gaetan Rivet <gaetanr@nvidia.com>
Cc: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>

v13:
- Minor code refactor to address review comments.
---
 lib/automake.mk                |  1 +
 lib/dpif-netdev-private-hwol.h | 63 ++++++++++++++++++++++++++++++++++
 lib/dpif-netdev.c              | 38 ++------------------
 3 files changed, 66 insertions(+), 36 deletions(-)
 create mode 100644 lib/dpif-netdev-private-hwol.h

Comments

Flavio Leitner June 18, 2021, 12:12 p.m. UTC | #1
Hello,

I have some comments inline.

On Thu, Jun 17, 2021 at 05:18:15PM +0100, Cian Ferriter wrote:
> From: Harry van Haaren <harry.van.haaren@intel.com>
> 
> This commit moves the datapath lookup functions required for
> hardware offload to a seperate file. This allows other DPIF
                        ^^^^^^^^

Spelling error.

> implementations to access the lookup functions, encouraging
> code reuse.
> 
> Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
> 
> ---
> 
> Cc: Gaetan Rivet <gaetanr@nvidia.com>
> Cc: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
> 
> v13:
> - Minor code refactor to address review comments.
> ---
>  lib/automake.mk                |  1 +
>  lib/dpif-netdev-private-hwol.h | 63 ++++++++++++++++++++++++++++++++++
>  lib/dpif-netdev.c              | 38 ++------------------
>  3 files changed, 66 insertions(+), 36 deletions(-)
>  create mode 100644 lib/dpif-netdev-private-hwol.h
> 
> diff --git a/lib/automake.mk b/lib/automake.mk
> index fdba3c6c0..3a33cdd5c 100644
> --- a/lib/automake.mk
> +++ b/lib/automake.mk
> @@ -115,6 +115,7 @@ lib_libopenvswitch_la_SOURCES = \
>  	lib/dpif-netdev-private-dfc.h \
>  	lib/dpif-netdev-private-dpcls.h \
>  	lib/dpif-netdev-private-flow.h \
> +	lib/dpif-netdev-private-hwol.h \
>  	lib/dpif-netdev-private-thread.h \
>  	lib/dpif-netdev-private.h \
>  	lib/dpif-netdev-perf.c \
> diff --git a/lib/dpif-netdev-private-hwol.h b/lib/dpif-netdev-private-hwol.h
> new file mode 100644
> index 000000000..b93297a74
> --- /dev/null
> +++ b/lib/dpif-netdev-private-hwol.h
> @@ -0,0 +1,63 @@
> +/*
> + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
> + * Copyright (c) 2021 Intel Corporation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at:
> + *
> + *     http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +#ifndef DPIF_NETDEV_PRIVATE_HWOL_H
> +#define DPIF_NETDEV_PRIVATE_HWOL_H 1
> +
> +#include "dpif-netdev-private-flow.h"
> +
> +#define MAX_FLOW_MARK       (UINT32_MAX - 1)
> +#define INVALID_FLOW_MARK   0
> +/* Zero flow mark is used to indicate the HW to remove the mark. A packet
> + * marked with zero mark is received in SW without a mark at all, so it
> + * cannot be used as a valid mark.
> + */
> +
> +struct megaflow_to_mark_data {
> +    const struct cmap_node node;
> +    ovs_u128 mega_ufid;
> +    uint32_t mark;
> +};
> +
> +struct flow_mark {
> +    struct cmap megaflow_to_mark;
> +    struct cmap mark_to_flow;
> +    struct id_pool *pool;
> +};
> +
> +/* allocated in dpif-netdev.c */
> +extern struct flow_mark flow_mark;
> +
> +static inline struct dp_netdev_flow *
> +mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd,
> +                  const uint32_t mark)
> +{
> +    struct dp_netdev_flow *flow;
> +
> +    CMAP_FOR_EACH_WITH_HASH (flow, mark_node, hash_int(mark, 0),
> +                             &flow_mark.mark_to_flow) {
> +        if (flow->mark == mark && flow->pmd_id == pmd->core_id &&
> +            flow->dead == false) {
> +            return flow;
> +        }
> +    }
> +
> +    return NULL;
> +}

Wouldn't this be better in a separate .c file? Because although the
structure flow_mark is here, it is allocated in dpif-netdev.c and
we have a fairly large function inline. This seems enough to start
a .c file to me.

Thanks,
fbl

> +
> +
> +#endif /* dpif-netdev-private-hwol.h */
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index affeeacdc..e913f4efc 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -18,6 +18,7 @@
>  #include "dpif-netdev.h"
>  #include "dpif-netdev-private.h"
>  #include "dpif-netdev-private-dfc.h"
> +#include "dpif-netdev-private-hwol.h"
>  
>  #include <ctype.h>
>  #include <errno.h>
> @@ -1953,26 +1954,8 @@ dp_netdev_pmd_find_dpcls(struct dp_netdev_pmd_thread *pmd,
>      return cls;
>  }
>  
> -#define MAX_FLOW_MARK       (UINT32_MAX - 1)
> -#define INVALID_FLOW_MARK   0
> -/* Zero flow mark is used to indicate the HW to remove the mark. A packet
> - * marked with zero mark is received in SW without a mark at all, so it
> - * cannot be used as a valid mark.
> - */
>  
> -struct megaflow_to_mark_data {
> -    const struct cmap_node node;
> -    ovs_u128 mega_ufid;
> -    uint32_t mark;
> -};
> -
> -struct flow_mark {
> -    struct cmap megaflow_to_mark;
> -    struct cmap mark_to_flow;
> -    struct id_pool *pool;
> -};
> -
> -static struct flow_mark flow_mark = {
> +struct flow_mark flow_mark = {
>      .megaflow_to_mark = CMAP_INITIALIZER,
>      .mark_to_flow = CMAP_INITIALIZER,
>  };
> @@ -2141,23 +2124,6 @@ flow_mark_flush(struct dp_netdev_pmd_thread *pmd)
>      }
>  }
>  
> -static struct dp_netdev_flow *
> -mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd,
> -                  const uint32_t mark)
> -{
> -    struct dp_netdev_flow *flow;
> -
> -    CMAP_FOR_EACH_WITH_HASH (flow, mark_node, hash_int(mark, 0),
> -                             &flow_mark.mark_to_flow) {
> -        if (flow->mark == mark && flow->pmd_id == pmd->core_id &&
> -            flow->dead == false) {
> -            return flow;
> -        }
> -    }
> -
> -    return NULL;
> -}
> -
>  static struct dp_flow_offload_item *
>  dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd,
>                               struct dp_netdev_flow *flow,
> -- 
> 2.32.0
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
Ferriter, Cian June 21, 2021, 4:10 p.m. UTC | #2
Hi Flavio,

Thanks for the review. My comments are inline,

Cian

> -----Original Message-----
> From: Flavio Leitner <fbl@sysclose.org>
> Sent: Friday 18 June 2021 13:12
> To: Ferriter, Cian <cian.ferriter@intel.com>
> Cc: ovs-dev@openvswitch.org; i.maximets@ovn.org
> Subject: Re: [ovs-dev] [v13 02/12] dpif-netdev: Split HWOL out to own header file.
> 
> 
> Hello,
> 
> I have some comments inline.
> 
> On Thu, Jun 17, 2021 at 05:18:15PM +0100, Cian Ferriter wrote:
> > From: Harry van Haaren <harry.van.haaren@intel.com>
> >
> > This commit moves the datapath lookup functions required for
> > hardware offload to a seperate file. This allows other DPIF
>                         ^^^^^^^^
> 
> Spelling error.
> 

Good spot, I'll fix this in the next version.

> > implementations to access the lookup functions, encouraging
> > code reuse.
> >
> > Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
> >
> > ---
> >
> > Cc: Gaetan Rivet <gaetanr@nvidia.com>
> > Cc: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
> >
> > v13:
> > - Minor code refactor to address review comments.
> > ---
> >  lib/automake.mk                |  1 +
> >  lib/dpif-netdev-private-hwol.h | 63 ++++++++++++++++++++++++++++++++++
> >  lib/dpif-netdev.c              | 38 ++------------------
> >  3 files changed, 66 insertions(+), 36 deletions(-)
> >  create mode 100644 lib/dpif-netdev-private-hwol.h
> >
> > diff --git a/lib/automake.mk b/lib/automake.mk
> > index fdba3c6c0..3a33cdd5c 100644
> > --- a/lib/automake.mk
> > +++ b/lib/automake.mk
> > @@ -115,6 +115,7 @@ lib_libopenvswitch_la_SOURCES = \
> >  	lib/dpif-netdev-private-dfc.h \
> >  	lib/dpif-netdev-private-dpcls.h \
> >  	lib/dpif-netdev-private-flow.h \
> > +	lib/dpif-netdev-private-hwol.h \
> >  	lib/dpif-netdev-private-thread.h \
> >  	lib/dpif-netdev-private.h \
> >  	lib/dpif-netdev-perf.c \
> > diff --git a/lib/dpif-netdev-private-hwol.h b/lib/dpif-netdev-private-hwol.h
> > new file mode 100644
> > index 000000000..b93297a74
> > --- /dev/null
> > +++ b/lib/dpif-netdev-private-hwol.h
> > @@ -0,0 +1,63 @@
> > +/*
> > + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
> > + * Copyright (c) 2021 Intel Corporation.
> > + *
> > + * Licensed under the Apache License, Version 2.0 (the "License");
> > + * you may not use this file except in compliance with the License.
> > + * You may obtain a copy of the License at:
> > + *
> > + *     http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +
> > +#ifndef DPIF_NETDEV_PRIVATE_HWOL_H
> > +#define DPIF_NETDEV_PRIVATE_HWOL_H 1
> > +
> > +#include "dpif-netdev-private-flow.h"
> > +
> > +#define MAX_FLOW_MARK       (UINT32_MAX - 1)
> > +#define INVALID_FLOW_MARK   0
> > +/* Zero flow mark is used to indicate the HW to remove the mark. A packet
> > + * marked with zero mark is received in SW without a mark at all, so it
> > + * cannot be used as a valid mark.
> > + */
> > +
> > +struct megaflow_to_mark_data {
> > +    const struct cmap_node node;
> > +    ovs_u128 mega_ufid;
> > +    uint32_t mark;
> > +};
> > +
> > +struct flow_mark {
> > +    struct cmap megaflow_to_mark;
> > +    struct cmap mark_to_flow;
> > +    struct id_pool *pool;
> > +};
> > +
> > +/* allocated in dpif-netdev.c */
> > +extern struct flow_mark flow_mark;
> > +
> > +static inline struct dp_netdev_flow *
> > +mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd,
> > +                  const uint32_t mark)
> > +{
> > +    struct dp_netdev_flow *flow;
> > +
> > +    CMAP_FOR_EACH_WITH_HASH (flow, mark_node, hash_int(mark, 0),
> > +                             &flow_mark.mark_to_flow) {
> > +        if (flow->mark == mark && flow->pmd_id == pmd->core_id &&
> > +            flow->dead == false) {
> > +            return flow;
> > +        }
> > +    }
> > +
> > +    return NULL;
> > +}
> 
> Wouldn't this be better in a separate .c file? Because although the
> structure flow_mark is here, it is allocated in dpif-netdev.c and
> we have a fairly large function inline. This seems enough to start
> a .c file to me.
> 

The mark_to_flow_find() function looks like a good inline candidate to us since we can avoid function call overhead per packet. So keeping it in a header file so it will be inlined seems like the best approach.

> Thanks,
> fbl
> 
> > +
> > +
> > +#endif /* dpif-netdev-private-hwol.h */
> > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> > index affeeacdc..e913f4efc 100644
> > --- a/lib/dpif-netdev.c
> > +++ b/lib/dpif-netdev.c
> > @@ -18,6 +18,7 @@
> >  #include "dpif-netdev.h"
> >  #include "dpif-netdev-private.h"
> >  #include "dpif-netdev-private-dfc.h"
> > +#include "dpif-netdev-private-hwol.h"
> >
> >  #include <ctype.h>
> >  #include <errno.h>
> > @@ -1953,26 +1954,8 @@ dp_netdev_pmd_find_dpcls(struct dp_netdev_pmd_thread *pmd,
> >      return cls;
> >  }
> >
> > -#define MAX_FLOW_MARK       (UINT32_MAX - 1)
> > -#define INVALID_FLOW_MARK   0
> > -/* Zero flow mark is used to indicate the HW to remove the mark. A packet
> > - * marked with zero mark is received in SW without a mark at all, so it
> > - * cannot be used as a valid mark.
> > - */
> >
> > -struct megaflow_to_mark_data {
> > -    const struct cmap_node node;
> > -    ovs_u128 mega_ufid;
> > -    uint32_t mark;
> > -};
> > -
> > -struct flow_mark {
> > -    struct cmap megaflow_to_mark;
> > -    struct cmap mark_to_flow;
> > -    struct id_pool *pool;
> > -};
> > -
> > -static struct flow_mark flow_mark = {
> > +struct flow_mark flow_mark = {
> >      .megaflow_to_mark = CMAP_INITIALIZER,
> >      .mark_to_flow = CMAP_INITIALIZER,
> >  };
> > @@ -2141,23 +2124,6 @@ flow_mark_flush(struct dp_netdev_pmd_thread *pmd)
> >      }
> >  }
> >
> > -static struct dp_netdev_flow *
> > -mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd,
> > -                  const uint32_t mark)
> > -{
> > -    struct dp_netdev_flow *flow;
> > -
> > -    CMAP_FOR_EACH_WITH_HASH (flow, mark_node, hash_int(mark, 0),
> > -                             &flow_mark.mark_to_flow) {
> > -        if (flow->mark == mark && flow->pmd_id == pmd->core_id &&
> > -            flow->dead == false) {
> > -            return flow;
> > -        }
> > -    }
> > -
> > -    return NULL;
> > -}
> > -
> >  static struct dp_flow_offload_item *
> >  dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd,
> >                               struct dp_netdev_flow *flow,
> > --
> > 2.32.0
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 
> --
> fbl
diff mbox series

Patch

diff --git a/lib/automake.mk b/lib/automake.mk
index fdba3c6c0..3a33cdd5c 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -115,6 +115,7 @@  lib_libopenvswitch_la_SOURCES = \
 	lib/dpif-netdev-private-dfc.h \
 	lib/dpif-netdev-private-dpcls.h \
 	lib/dpif-netdev-private-flow.h \
+	lib/dpif-netdev-private-hwol.h \
 	lib/dpif-netdev-private-thread.h \
 	lib/dpif-netdev-private.h \
 	lib/dpif-netdev-perf.c \
diff --git a/lib/dpif-netdev-private-hwol.h b/lib/dpif-netdev-private-hwol.h
new file mode 100644
index 000000000..b93297a74
--- /dev/null
+++ b/lib/dpif-netdev-private-hwol.h
@@ -0,0 +1,63 @@ 
+/*
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
+ * Copyright (c) 2021 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef DPIF_NETDEV_PRIVATE_HWOL_H
+#define DPIF_NETDEV_PRIVATE_HWOL_H 1
+
+#include "dpif-netdev-private-flow.h"
+
+#define MAX_FLOW_MARK       (UINT32_MAX - 1)
+#define INVALID_FLOW_MARK   0
+/* Zero flow mark is used to indicate the HW to remove the mark. A packet
+ * marked with zero mark is received in SW without a mark at all, so it
+ * cannot be used as a valid mark.
+ */
+
+struct megaflow_to_mark_data {
+    const struct cmap_node node;
+    ovs_u128 mega_ufid;
+    uint32_t mark;
+};
+
+struct flow_mark {
+    struct cmap megaflow_to_mark;
+    struct cmap mark_to_flow;
+    struct id_pool *pool;
+};
+
+/* allocated in dpif-netdev.c */
+extern struct flow_mark flow_mark;
+
+static inline struct dp_netdev_flow *
+mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd,
+                  const uint32_t mark)
+{
+    struct dp_netdev_flow *flow;
+
+    CMAP_FOR_EACH_WITH_HASH (flow, mark_node, hash_int(mark, 0),
+                             &flow_mark.mark_to_flow) {
+        if (flow->mark == mark && flow->pmd_id == pmd->core_id &&
+            flow->dead == false) {
+            return flow;
+        }
+    }
+
+    return NULL;
+}
+
+
+#endif /* dpif-netdev-private-hwol.h */
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index affeeacdc..e913f4efc 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -18,6 +18,7 @@ 
 #include "dpif-netdev.h"
 #include "dpif-netdev-private.h"
 #include "dpif-netdev-private-dfc.h"
+#include "dpif-netdev-private-hwol.h"
 
 #include <ctype.h>
 #include <errno.h>
@@ -1953,26 +1954,8 @@  dp_netdev_pmd_find_dpcls(struct dp_netdev_pmd_thread *pmd,
     return cls;
 }
 
-#define MAX_FLOW_MARK       (UINT32_MAX - 1)
-#define INVALID_FLOW_MARK   0
-/* Zero flow mark is used to indicate the HW to remove the mark. A packet
- * marked with zero mark is received in SW without a mark at all, so it
- * cannot be used as a valid mark.
- */
 
-struct megaflow_to_mark_data {
-    const struct cmap_node node;
-    ovs_u128 mega_ufid;
-    uint32_t mark;
-};
-
-struct flow_mark {
-    struct cmap megaflow_to_mark;
-    struct cmap mark_to_flow;
-    struct id_pool *pool;
-};
-
-static struct flow_mark flow_mark = {
+struct flow_mark flow_mark = {
     .megaflow_to_mark = CMAP_INITIALIZER,
     .mark_to_flow = CMAP_INITIALIZER,
 };
@@ -2141,23 +2124,6 @@  flow_mark_flush(struct dp_netdev_pmd_thread *pmd)
     }
 }
 
-static struct dp_netdev_flow *
-mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd,
-                  const uint32_t mark)
-{
-    struct dp_netdev_flow *flow;
-
-    CMAP_FOR_EACH_WITH_HASH (flow, mark_node, hash_int(mark, 0),
-                             &flow_mark.mark_to_flow) {
-        if (flow->mark == mark && flow->pmd_id == pmd->core_id &&
-            flow->dead == false) {
-            return flow;
-        }
-    }
-
-    return NULL;
-}
-
 static struct dp_flow_offload_item *
 dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd,
                              struct dp_netdev_flow *flow,