diff mbox series

[ovs-dev,RFC,v3,4/4] netdev-offload: Disallow offloading to unrelated tunneling vports.

Message ID 20191203111315.23656-5-i.maximets@ovn.org
State RFC
Headers show
Series netdev-offload: Prerequisites of vport offloading via DPDK. | expand

Commit Message

Ilya Maximets Dec. 3, 2019, 11:13 a.m. UTC
'linux_tc' flow API suitable only for tunneling vports with backing
linux interfaces. DPDK flow API is not suitable for such ports.

With this change we could drop vport restriction from dpif-netdev.

This is a prerequisite for enabling vport offloading in DPDK.

Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
---
 lib/dpif-netdev.c         | 3 +--
 lib/netdev-offload-dpdk.c | 8 ++++++++
 lib/netdev-offload-tc.c   | 8 ++++++++
 3 files changed, 17 insertions(+), 2 deletions(-)

Comments

Ophir Munk Dec. 11, 2019, 1:10 p.m. UTC | #1
> -----Original Message-----
> From: Ilya Maximets <i.maximets@ovn.org>
> Sent: Tuesday, December 3, 2019 1:13 PM
> To: ovs-dev@openvswitch.org
> Cc: Ophir Munk <ophirmu@mellanox.com>; Roni Bar Yanai
> <roniba@mellanox.com>; Simon Horman
> <simon.horman@netronome.com>; Ilya Maximets <i.maximets@ovn.org>
> Subject: [RFC v3 4/4] netdev-offload: Disallow offloading to unrelated
> tunneling vports.
> 
> 'linux_tc' flow API suitable only for tunneling vports with backing linux
> interfaces. DPDK flow API is not suitable for such ports.
> 
> With this change we could drop vport restriction from dpif-netdev.
> 
> This is a prerequisite for enabling vport offloading in DPDK.
> 
> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
> ---
>  lib/dpif-netdev.c         | 3 +--
>  lib/netdev-offload-dpdk.c | 8 ++++++++
>  lib/netdev-offload-tc.c   | 8 ++++++++
>  3 files changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a78fd5909..945051e3b
> 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -2413,8 +2413,7 @@ dp_netdev_flow_offload_put(struct
> dp_flow_offload_item *offload)
>      info.flow_mark = mark;
> 
>      port = netdev_ports_get(in_port, dpif_type_str);
> -    if (!port || netdev_vport_is_vport_class(port->netdev_class)) {
> -        netdev_close(port);
> +    if (!port) {
>          goto err_free;
>      }
>      ret = netdev_flow_put(port, &offload->match, diff --git a/lib/netdev-
> offload-dpdk.c b/lib/netdev-offload-dpdk.c index 96794dc4d..28049788b
> 100644
> --- a/lib/netdev-offload-dpdk.c
> +++ b/lib/netdev-offload-dpdk.c
> @@ -22,6 +22,7 @@
>  #include "dpif-netdev.h"
>  #include "netdev-offload-provider.h"
>  #include "netdev-provider.h"
> +#include "netdev-vport.h"
>  #include "openvswitch/match.h"
>  #include "openvswitch/vlog.h"
>  #include "packets.h"
> @@ -758,6 +759,13 @@ netdev_offload_dpdk_flow_del(struct netdev
> *netdev, const ovs_u128 *ufid,  static int
> netdev_offload_dpdk_init_flow_api(struct netdev *netdev)  {
> +    if (netdev_vport_is_vport_class(netdev->netdev_class)
> +        && !strcmp(netdev_get_dpif_type(netdev), "system")) {
> +        VLOG_DBG("%s: vport belongs to the system datapath. Skipping.",
> +                 netdev_get_name(netdev));
> +        return EOPNOTSUPP;
> +    }
> +

It would be more consistent to reject any dpif which is not netdev such as:

   if (netdev_vport_is_vport_class(netdev->netdev_class)
       && strcmp(netdev_get_dpif_type(netdev), "netdev")) {
       VLOG_DBG("%s: vport doesn't belong to the netdev datapath. Skipping.",
                netdev_get_name(netdev));
       return EOPNOTSUPP;
   }

>      return netdev_dpdk_flow_api_supported(netdev) ? 0 : EOPNOTSUPP;  }
> 
> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index
> dee82aa9a..5501ad810 100644
> --- a/lib/netdev-offload-tc.c
> +++ b/lib/netdev-offload-tc.c
> @@ -31,6 +31,7 @@
>  #include "netdev-linux.h"
>  #include "netdev-offload-provider.h"
>  #include "netdev-provider.h"
> +#include "netdev-vport.h"
>  #include "netlink.h"
>  #include "netlink-socket.h"
>  #include "odp-netlink.h"
> @@ -1643,6 +1644,13 @@ netdev_tc_init_flow_api(struct netdev *netdev)
>      int ifindex;
>      int error;
> 
> +    if (netdev_vport_is_vport_class(netdev->netdev_class)
> +        && strcmp(netdev_get_dpif_type(netdev), "system")) {
> +        VLOG_DBG("%s: vport doesn't belong to the system datapath.
> Skipping.",
> +                 netdev_get_name(netdev));
> +        return EOPNOTSUPP;
> +    }
> +
>      ifindex = netdev_get_ifindex(netdev);
>      if (ifindex < 0) {
>          VLOG_INFO("init: failed to get ifindex for %s: %s",
> --
> 2.17.1
diff mbox series

Patch

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index a78fd5909..945051e3b 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2413,8 +2413,7 @@  dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload)
     info.flow_mark = mark;
 
     port = netdev_ports_get(in_port, dpif_type_str);
-    if (!port || netdev_vport_is_vport_class(port->netdev_class)) {
-        netdev_close(port);
+    if (!port) {
         goto err_free;
     }
     ret = netdev_flow_put(port, &offload->match,
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 96794dc4d..28049788b 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -22,6 +22,7 @@ 
 #include "dpif-netdev.h"
 #include "netdev-offload-provider.h"
 #include "netdev-provider.h"
+#include "netdev-vport.h"
 #include "openvswitch/match.h"
 #include "openvswitch/vlog.h"
 #include "packets.h"
@@ -758,6 +759,13 @@  netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
 static int
 netdev_offload_dpdk_init_flow_api(struct netdev *netdev)
 {
+    if (netdev_vport_is_vport_class(netdev->netdev_class)
+        && !strcmp(netdev_get_dpif_type(netdev), "system")) {
+        VLOG_DBG("%s: vport belongs to the system datapath. Skipping.",
+                 netdev_get_name(netdev));
+        return EOPNOTSUPP;
+    }
+
     return netdev_dpdk_flow_api_supported(netdev) ? 0 : EOPNOTSUPP;
 }
 
diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index dee82aa9a..5501ad810 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -31,6 +31,7 @@ 
 #include "netdev-linux.h"
 #include "netdev-offload-provider.h"
 #include "netdev-provider.h"
+#include "netdev-vport.h"
 #include "netlink.h"
 #include "netlink-socket.h"
 #include "odp-netlink.h"
@@ -1643,6 +1644,13 @@  netdev_tc_init_flow_api(struct netdev *netdev)
     int ifindex;
     int error;
 
+    if (netdev_vport_is_vport_class(netdev->netdev_class)
+        && strcmp(netdev_get_dpif_type(netdev), "system")) {
+        VLOG_DBG("%s: vport doesn't belong to the system datapath. Skipping.",
+                 netdev_get_name(netdev));
+        return EOPNOTSUPP;
+    }
+
     ifindex = netdev_get_ifindex(netdev);
     if (ifindex < 0) {
         VLOG_INFO("init: failed to get ifindex for %s: %s",