[v3] net/softnic: add flow flush API

Message ID 1538989812-725-1-git-send-email-reshma.pattan@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Cristian Dumitrescu
Headers
Series [v3] net/softnic: add flow flush API |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Pattan, Reshma Oct. 8, 2018, 9:10 a.m. UTC
  Add rte flow flush api for flushing
all the flows of the port.

Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
---
v3: Some style related changes
v2: Use TAILQ_FOREACH_SAFE instead of TAILQ_FOREACH
for safe removal using TAILQ_REMOVAL.
---
 drivers/net/softnic/rte_eth_softnic_flow.c | 47 +++++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)
  

Comments

Jasvinder Singh Oct. 8, 2018, 10:27 a.m. UTC | #1
> -----Original Message-----
> From: Pattan, Reshma
> Sent: Monday, October 8, 2018 10:10 AM
> To: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu@intel.com>;
> Singh, Jasvinder <jasvinder.singh@intel.com>
> Cc: Pattan, Reshma <reshma.pattan@intel.com>
> Subject: [PATCH v3] net/softnic: add flow flush API
> 
> Add rte flow flush api for flushing
> all the flows of the port.
> 
> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> ---
> v3: Some style related changes
> v2: Use TAILQ_FOREACH_SAFE instead of TAILQ_FOREACH for safe removal
> using TAILQ_REMOVAL.
> ---
>  drivers/net/softnic/rte_eth_softnic_flow.c | 47 +++++++++++++++++++++-
>  1 file changed, 46 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c
> b/drivers/net/softnic/rte_eth_softnic_flow.c
> index 03d41bc01..08ea6e940 100644
> --- a/drivers/net/softnic/rte_eth_softnic_flow.c
> +++ b/drivers/net/softnic/rte_eth_softnic_flow.c
> @@ -11,6 +11,7 @@
>  #include <rte_string_fns.h>
>  #include <rte_flow.h>
>  #include <rte_flow_driver.h>
> +#include <rte_tailq.h>
> 
>  #include "rte_eth_softnic_internals.h"
>  #include "rte_eth_softnic.h"
> @@ -1915,6 +1916,50 @@ pmd_flow_destroy(struct rte_eth_dev *dev,
>  	return 0;
>  }
> 
> +static int
> +pmd_flow_flush(struct rte_eth_dev *dev,
> +	struct rte_flow_error *error)
> +{
> +	struct pmd_internals *softnic = dev->data->dev_private;
> +	struct pipeline *pipeline;
> +	uint32_t i;
> +
> +	TAILQ_FOREACH(pipeline, &softnic->pipeline_list, node) {
> +		/* Remove all the flows added to the tables. */
> +		for (i = 0; i < pipeline->n_tables; i++) {
> +			struct softnic_table *table = &pipeline->table[i];
> +			struct rte_flow *flow;
> +			void *temp;
> +			int status;
> +
> +			TAILQ_FOREACH_SAFE(flow, &table->flows, node,
> temp) {
> +				/* Rule delete. */
> +				status = softnic_pipeline_table_rule_delete
> +						(softnic,
> +						pipeline->name,
> +						i,
> +						&flow->match);
> +				if (status)
> +					return rte_flow_error_set(error,
> +						EINVAL,
> +
> 	RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +						NULL,
> +						"Pipeline table rule delete
> failed");
> +
> +				/* Update dependencies */
> +				if (is_meter_action_enable(softnic, table))
> +					flow_meter_owner_reset(softnic,
> flow);
> +
> +				/* Flow delete. */
> +				TAILQ_REMOVE(&table->flows, flow, node);
> +				free(flow);
> +			}
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  static int
>  pmd_flow_query(struct rte_eth_dev *dev __rte_unused,
>  	struct rte_flow *flow,
> @@ -1971,7 +2016,7 @@ const struct rte_flow_ops pmd_flow_ops = {
>  	.validate = pmd_flow_validate,
>  	.create = pmd_flow_create,
>  	.destroy = pmd_flow_destroy,
> -	.flush = NULL,
> +	.flush = pmd_flow_flush,
>  	.query = pmd_flow_query,
>  	.isolate = NULL,
>  };
> --
> 2.17.1

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>
  
Cristian Dumitrescu Oct. 8, 2018, 10:35 a.m. UTC | #2
> -----Original Message-----
> From: Pattan, Reshma
> Sent: Monday, October 8, 2018 10:10 AM
> To: dev@dpdk.org; Dumitrescu, Cristian <cristian.dumitrescu@intel.com>;
> Singh, Jasvinder <jasvinder.singh@intel.com>
> Cc: Pattan, Reshma <reshma.pattan@intel.com>
> Subject: [PATCH v3] net/softnic: add flow flush API
> 
> Add rte flow flush api for flushing
> all the flows of the port.
> 
> Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> ---
> v3: Some style related changes
> v2: Use TAILQ_FOREACH_SAFE instead of TAILQ_FOREACH
> for safe removal using TAILQ_REMOVAL.
> ---
>  drivers/net/softnic/rte_eth_softnic_flow.c | 47 +++++++++++++++++++++-
>  1 file changed, 46 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c
> b/drivers/net/softnic/rte_eth_softnic_flow.c
> index 03d41bc01..08ea6e940 100644
> --- a/drivers/net/softnic/rte_eth_softnic_flow.c
> +++ b/drivers/net/softnic/rte_eth_softnic_flow.c
> @@ -11,6 +11,7 @@
>  #include <rte_string_fns.h>
>  #include <rte_flow.h>
>  #include <rte_flow_driver.h>
> +#include <rte_tailq.h>
> 
>  #include "rte_eth_softnic_internals.h"
>  #include "rte_eth_softnic.h"
> @@ -1915,6 +1916,50 @@ pmd_flow_destroy(struct rte_eth_dev *dev,
>  	return 0;
>  }
> 
> +static int
> +pmd_flow_flush(struct rte_eth_dev *dev,
> +	struct rte_flow_error *error)
> +{
> +	struct pmd_internals *softnic = dev->data->dev_private;
> +	struct pipeline *pipeline;
> +	uint32_t i;
> +
> +	TAILQ_FOREACH(pipeline, &softnic->pipeline_list, node) {
> +		/* Remove all the flows added to the tables. */
> +		for (i = 0; i < pipeline->n_tables; i++) {
> +			struct softnic_table *table = &pipeline->table[i];
> +			struct rte_flow *flow;
> +			void *temp;
> +			int status;
> +
> +			TAILQ_FOREACH_SAFE(flow, &table->flows, node,
> temp) {
> +				/* Rule delete. */
> +				status = softnic_pipeline_table_rule_delete
> +						(softnic,
> +						pipeline->name,
> +						i,
> +						&flow->match);
> +				if (status)
> +					return rte_flow_error_set(error,
> +						EINVAL,
> +
> 	RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> +						NULL,
> +						"Pipeline table rule delete
> failed");

When rule deletion fails, you should not abort, but set up a flag and continue to delete the remaining rules.


> +
> +				/* Update dependencies */
> +				if (is_meter_action_enable(softnic, table))
> +					flow_meter_owner_reset(softnic,
> flow);
> +
> +				/* Flow delete. */
> +				TAILQ_REMOVE(&table->flows, flow, node);
> +				free(flow);
> +			}
> +		}
> +	}
> +

This is the place to examine the above mentioned flag and set the error function argument. If error, the error message basically says "some of the rules could not be deleted".

> +	return 0;
> +}
> +
>  static int
>  pmd_flow_query(struct rte_eth_dev *dev __rte_unused,
>  	struct rte_flow *flow,
> @@ -1971,7 +2016,7 @@ const struct rte_flow_ops pmd_flow_ops = {
>  	.validate = pmd_flow_validate,
>  	.create = pmd_flow_create,
>  	.destroy = pmd_flow_destroy,
> -	.flush = NULL,
> +	.flush = pmd_flow_flush,
>  	.query = pmd_flow_query,
>  	.isolate = NULL,
>  };
> --
> 2.17.1
  
Pattan, Reshma Oct. 8, 2018, 3:10 p.m. UTC | #3
> -----Original Message-----
> From: Dumitrescu, Cristian
> Sent: Monday, October 8, 2018 11:36 AM
> To: Pattan, Reshma <reshma.pattan@intel.com>; dev@dpdk.org; Singh,
> Jasvinder <jasvinder.singh@intel.com>
> Subject: RE: [PATCH v3] net/softnic: add flow flush API
> 
> 
> 
> > -----Original Message-----
> > From: Pattan, Reshma
> > Sent: Monday, October 8, 2018 10:10 AM
> > To: dev@dpdk.org; Dumitrescu, Cristian
> > <cristian.dumitrescu@intel.com>; Singh, Jasvinder
> > <jasvinder.singh@intel.com>
> > Cc: Pattan, Reshma <reshma.pattan@intel.com>
> > Subject: [PATCH v3] net/softnic: add flow flush API
> >
> > Add rte flow flush api for flushing
> > all the flows of the port.
> >
> > Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
> > ---
> > v3: Some style related changes
> > v2: Use TAILQ_FOREACH_SAFE instead of TAILQ_FOREACH for safe removal
> > using TAILQ_REMOVAL.
> > ---
> >  drivers/net/softnic/rte_eth_softnic_flow.c | 47
> > +++++++++++++++++++++-
> >  1 file changed, 46 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c
> > b/drivers/net/softnic/rte_eth_softnic_flow.c
> > index 03d41bc01..08ea6e940 100644
> > --- a/drivers/net/softnic/rte_eth_softnic_flow.c
> > +++ b/drivers/net/softnic/rte_eth_softnic_flow.c
> > @@ -11,6 +11,7 @@
> >  #include <rte_string_fns.h>
> >  #include <rte_flow.h>
> >  #include <rte_flow_driver.h>
> > +#include <rte_tailq.h>
> >
> >  #include "rte_eth_softnic_internals.h"
> >  #include "rte_eth_softnic.h"
> > @@ -1915,6 +1916,50 @@ pmd_flow_destroy(struct rte_eth_dev *dev,
> >  	return 0;
> >  }
> >
> > +static int
> > +pmd_flow_flush(struct rte_eth_dev *dev,
> > +	struct rte_flow_error *error)
> > +{
> > +	struct pmd_internals *softnic = dev->data->dev_private;
> > +	struct pipeline *pipeline;
> > +	uint32_t i;
> > +
> > +	TAILQ_FOREACH(pipeline, &softnic->pipeline_list, node) {
> > +		/* Remove all the flows added to the tables. */
> > +		for (i = 0; i < pipeline->n_tables; i++) {
> > +			struct softnic_table *table = &pipeline->table[i];
> > +			struct rte_flow *flow;
> > +			void *temp;
> > +			int status;
> > +
> > +			TAILQ_FOREACH_SAFE(flow, &table->flows, node,
> > temp) {
> > +				/* Rule delete. */
> > +				status = softnic_pipeline_table_rule_delete
> > +						(softnic,
> > +						pipeline->name,
> > +						i,
> > +						&flow->match);
> > +				if (status)
> > +					return rte_flow_error_set(error,
> > +						EINVAL,
> > +
> > 	RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
> > +						NULL,
> > +						"Pipeline table rule delete
> > failed");
> 
> When rule deletion fails, you should not abort, but set up a flag and continue
> to delete the remaining rules.

Done in v4.

> 
> 
> > +
> > +				/* Update dependencies */
> > +				if (is_meter_action_enable(softnic, table))
> > +					flow_meter_owner_reset(softnic,
> > flow);
> > +
> > +				/* Flow delete. */
> > +				TAILQ_REMOVE(&table->flows, flow, node);
> > +				free(flow);
> > +			}
> > +		}
> > +	}
> > +
> 
> This is the place to examine the above mentioned flag and set the error
> function argument. If error, the error message basically says "some of the
> rules could not be deleted".
> 

Done in v4.

Thanks,
Reshma
  

Patch

diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c b/drivers/net/softnic/rte_eth_softnic_flow.c
index 03d41bc01..08ea6e940 100644
--- a/drivers/net/softnic/rte_eth_softnic_flow.c
+++ b/drivers/net/softnic/rte_eth_softnic_flow.c
@@ -11,6 +11,7 @@ 
 #include <rte_string_fns.h>
 #include <rte_flow.h>
 #include <rte_flow_driver.h>
+#include <rte_tailq.h>
 
 #include "rte_eth_softnic_internals.h"
 #include "rte_eth_softnic.h"
@@ -1915,6 +1916,50 @@  pmd_flow_destroy(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+pmd_flow_flush(struct rte_eth_dev *dev,
+	struct rte_flow_error *error)
+{
+	struct pmd_internals *softnic = dev->data->dev_private;
+	struct pipeline *pipeline;
+	uint32_t i;
+
+	TAILQ_FOREACH(pipeline, &softnic->pipeline_list, node) {
+		/* Remove all the flows added to the tables. */
+		for (i = 0; i < pipeline->n_tables; i++) {
+			struct softnic_table *table = &pipeline->table[i];
+			struct rte_flow *flow;
+			void *temp;
+			int status;
+
+			TAILQ_FOREACH_SAFE(flow, &table->flows, node, temp) {
+				/* Rule delete. */
+				status = softnic_pipeline_table_rule_delete
+						(softnic,
+						pipeline->name,
+						i,
+						&flow->match);
+				if (status)
+					return rte_flow_error_set(error,
+						EINVAL,
+						RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
+						NULL,
+						"Pipeline table rule delete failed");
+
+				/* Update dependencies */
+				if (is_meter_action_enable(softnic, table))
+					flow_meter_owner_reset(softnic, flow);
+
+				/* Flow delete. */
+				TAILQ_REMOVE(&table->flows, flow, node);
+				free(flow);
+			}
+		}
+	}
+
+	return 0;
+}
+
 static int
 pmd_flow_query(struct rte_eth_dev *dev __rte_unused,
 	struct rte_flow *flow,
@@ -1971,7 +2016,7 @@  const struct rte_flow_ops pmd_flow_ops = {
 	.validate = pmd_flow_validate,
 	.create = pmd_flow_create,
 	.destroy = pmd_flow_destroy,
-	.flush = NULL,
+	.flush = pmd_flow_flush,
 	.query = pmd_flow_query,
 	.isolate = NULL,
 };