diff mbox

[ovs-dev,6/7] netdev-dpdk: remove offloaded flow on deletion

Message ID 1503469462-22391-7-git-send-email-yliu@fridaylinux.org
State Superseded
Headers show

Commit Message

Yuanhan Liu Aug. 23, 2017, 6:24 a.m. UTC
Inovke netdev class '->flow_del' method on flow deletion. The dpdk netdev
implementation will then remove the rte flow associated with the ufid.

Signed-off-by: Yuanhan Liu <yliu@fridaylinux.org>
Signed-off-by: Finn Christensen <fc@napatech.com>
---
 lib/dpif-netdev.c |  5 +++++
 lib/netdev-dpdk.c | 17 ++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

Comments

Darrell Ball Aug. 29, 2017, 8:21 a.m. UTC | #1
On 8/22/17, 11:24 PM, "Yuanhan Liu" <yliu@fridaylinux.org> wrote:
    
        Inovke netdev class '->flow_del' method on flow deletion. The dpdk netdev
        implementation will then remove the rte flow associated with the ufid.
        
        Signed-off-by: Yuanhan Liu <yliu@fridaylinux.org>
        Signed-off-by: Finn Christensen <fc@napatech.com>
        ---
         lib/dpif-netdev.c |  5 +++++
         lib/netdev-dpdk.c | 17 ++++++++++++++++-
         2 files changed, 21 insertions(+), 1 deletion(-)
        
        diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
        index b5f157e..1957789 100644
        --- a/lib/dpif-netdev.c
        +++ b/lib/dpif-netdev.c
        @@ -1783,6 +1783,10 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd,
             dpcls_remove(cls, &flow->cr);
             cmap_remove(&pmd->flow_table, node, dp_netdev_flow_hash(&flow->ufid));
             if (flow->has_mark) {
        +        struct dp_netdev_port *port;
        +
        +        port = dp_netdev_lookup_port(pmd->dp, in_port);

check for NULL ?

        +        netdev_flow_del(port->netdev, &flow->ufid, NULL);
                 cmap_remove(&pmd->mark_to_flow, mark_node, flow->mark);
                 flow->has_mark = false;
             }
        @@ -2681,6 +2685,7 @@ flow_del_on_pmd(struct dp_netdev_pmd_thread *pmd,
                 if (stats) {
                     get_dpif_flow_stats(netdev_flow, stats);
                 }
        +
                 dp_netdev_pmd_remove_flow(pmd, netdev_flow);
             } else {
                 error = ENOENT;
        diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
        index 230d506..8217184 100644
        --- a/lib/netdev-dpdk.c
        +++ b/lib/netdev-dpdk.c
        @@ -3790,6 +3790,21 @@ netdev_dpdk_flow_put(struct netdev *netdev, struct match *match,
                                                     actions_len, ufid, info);
         }
         
        +static int
        +netdev_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
        +                     struct dpif_flow_stats *stats OVS_UNUSED)
        +{
        +
        +    struct rte_flow *rte_flow = get_rte_flow_by_ufid(ufid);
        +
        +    if (!rte_flow) {
        +        return -1;
        +    }

error vlog ?


        +
        +    return netdev_dpdk_destroy_rte_flow(netdev_dpdk_cast(netdev),
        +                                        ufid, rte_flow);
        +}
        +
         #define DPDK_FLOW_OFFLOAD_API                                 \
             NULL,                                                     \
             NULL,                                                     \
        @@ -3797,7 +3812,7 @@ netdev_dpdk_flow_put(struct netdev *netdev, struct match *match,
             NULL,                                                     \
             netdev_dpdk_flow_put,                                     \
             NULL,                                                     \
        -    NULL,                                                     \
        +    netdev_dpdk_flow_del,                                     \
             NULL
         
         
        -- 
        2.7.4
Yuanhan Liu Aug. 29, 2017, 12:20 p.m. UTC | #2
On Tue, Aug 29, 2017 at 08:21:20AM +0000, Darrell Ball wrote:
> On 8/22/17, 11:24 PM, "Yuanhan Liu" <yliu@fridaylinux.org> wrote:
>     
>         Inovke netdev class '->flow_del' method on flow deletion. The dpdk netdev
>         implementation will then remove the rte flow associated with the ufid.
>         
>         Signed-off-by: Yuanhan Liu <yliu@fridaylinux.org>
>         Signed-off-by: Finn Christensen <fc@napatech.com>
>         ---
>          lib/dpif-netdev.c |  5 +++++
>          lib/netdev-dpdk.c | 17 ++++++++++++++++-
>          2 files changed, 21 insertions(+), 1 deletion(-)
>         
>         diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
>         index b5f157e..1957789 100644
>         --- a/lib/dpif-netdev.c
>         +++ b/lib/dpif-netdev.c
>         @@ -1783,6 +1783,10 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd,
>              dpcls_remove(cls, &flow->cr);
>              cmap_remove(&pmd->flow_table, node, dp_netdev_flow_hash(&flow->ufid));
>              if (flow->has_mark) {
>         +        struct dp_netdev_port *port;
>         +
>         +        port = dp_netdev_lookup_port(pmd->dp, in_port);
> 
> check for NULL ?

Will do.

> 
>         +        netdev_flow_del(port->netdev, &flow->ufid, NULL);
>                  cmap_remove(&pmd->mark_to_flow, mark_node, flow->mark);
>                  flow->has_mark = false;
>              }
>         @@ -2681,6 +2685,7 @@ flow_del_on_pmd(struct dp_netdev_pmd_thread *pmd,
>                  if (stats) {
>                      get_dpif_flow_stats(netdev_flow, stats);
>                  }
>         +
>                  dp_netdev_pmd_remove_flow(pmd, netdev_flow);
>              } else {
>                  error = ENOENT;
>         diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>         index 230d506..8217184 100644
>         --- a/lib/netdev-dpdk.c
>         +++ b/lib/netdev-dpdk.c
>         @@ -3790,6 +3790,21 @@ netdev_dpdk_flow_put(struct netdev *netdev, struct match *match,
>                                                      actions_len, ufid, info);
>          }
>          
>         +static int
>         +netdev_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
>         +                     struct dpif_flow_stats *stats OVS_UNUSED)
>         +{
>         +
>         +    struct rte_flow *rte_flow = get_rte_flow_by_ufid(ufid);
>         +
>         +    if (!rte_flow) {
>         +        return -1;
>         +    }
> 
> error vlog ?
> 

Will do.

	--yliu
> 
>         +
>         +    return netdev_dpdk_destroy_rte_flow(netdev_dpdk_cast(netdev),
>         +                                        ufid, rte_flow);
>         +}
>         +
>          #define DPDK_FLOW_OFFLOAD_API                                 \
>              NULL,                                                     \
>              NULL,                                                     \
>         @@ -3797,7 +3812,7 @@ netdev_dpdk_flow_put(struct netdev *netdev, struct match *match,
>              NULL,                                                     \
>              netdev_dpdk_flow_put,                                     \
>              NULL,                                                     \
>         -    NULL,                                                     \
>         +    netdev_dpdk_flow_del,                                     \
>              NULL
>          
>          
>         -- 
>         2.7.4
>         
>         
>     
>     
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff mbox

Patch

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index b5f157e..1957789 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1783,6 +1783,10 @@  dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd,
     dpcls_remove(cls, &flow->cr);
     cmap_remove(&pmd->flow_table, node, dp_netdev_flow_hash(&flow->ufid));
     if (flow->has_mark) {
+        struct dp_netdev_port *port;
+
+        port = dp_netdev_lookup_port(pmd->dp, in_port);
+        netdev_flow_del(port->netdev, &flow->ufid, NULL);
         cmap_remove(&pmd->mark_to_flow, mark_node, flow->mark);
         flow->has_mark = false;
     }
@@ -2681,6 +2685,7 @@  flow_del_on_pmd(struct dp_netdev_pmd_thread *pmd,
         if (stats) {
             get_dpif_flow_stats(netdev_flow, stats);
         }
+
         dp_netdev_pmd_remove_flow(pmd, netdev_flow);
     } else {
         error = ENOENT;
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 230d506..8217184 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -3790,6 +3790,21 @@  netdev_dpdk_flow_put(struct netdev *netdev, struct match *match,
                                             actions_len, ufid, info);
 }
 
+static int
+netdev_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
+                     struct dpif_flow_stats *stats OVS_UNUSED)
+{
+
+    struct rte_flow *rte_flow = get_rte_flow_by_ufid(ufid);
+
+    if (!rte_flow) {
+        return -1;
+    }
+
+    return netdev_dpdk_destroy_rte_flow(netdev_dpdk_cast(netdev),
+                                        ufid, rte_flow);
+}
+
 #define DPDK_FLOW_OFFLOAD_API                                 \
     NULL,                                                     \
     NULL,                                                     \
@@ -3797,7 +3812,7 @@  netdev_dpdk_flow_put(struct netdev *netdev, struct match *match,
     NULL,                                                     \
     netdev_dpdk_flow_put,                                     \
     NULL,                                                     \
-    NULL,                                                     \
+    netdev_dpdk_flow_del,                                     \
     NULL