[dpdk-dev] [PATCH v2 15/17] net/i40e: add flow flush function
Xing, Beilei
beilei.xing at intel.com
Wed Dec 28 07:48:02 CET 2016
> -----Original Message-----
> From: Bie, Tiwei
> Sent: Wednesday, December 28, 2016 1:36 PM
> To: Xing, Beilei <beilei.xing at intel.com>
> Cc: Wu, Jingjing <jingjing.wu at intel.com>; Zhang, Helin
> <helin.zhang at intel.com>; dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2 15/17] net/i40e: add flow flush function
>
> On Tue, Dec 27, 2016 at 02:26:22PM +0800, Beilei Xing wrote:
> > This patch adds i40e_flow_flush function to flush all filters for
> > users. And flow director flush function is involved first.
> >
> > Signed-off-by: Beilei Xing <beilei.xing at intel.com>
> > ---
> > drivers/net/i40e/i40e_ethdev.h | 3 +++
> > drivers/net/i40e/i40e_fdir.c | 8 ++------
> > drivers/net/i40e/i40e_flow.c | 46
> ++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 51 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/net/i40e/i40e_ethdev.h
> > b/drivers/net/i40e/i40e_ethdev.h index b8c7d41..0b736d5 100644
> > --- a/drivers/net/i40e/i40e_ethdev.h
> > +++ b/drivers/net/i40e/i40e_ethdev.h
> > @@ -786,6 +786,9 @@ i40e_sw_tunnel_filter_lookup(struct
> i40e_tunnel_rule *tunnel_rule,
> > const struct i40e_tunnel_filter_input *input); int
> > i40e_sw_tunnel_filter_del(struct i40e_pf *pf,
> > struct i40e_tunnel_filter *tunnel_filter);
> > +int i40e_sw_fdir_filter_del(struct i40e_pf *pf,
> > + struct i40e_fdir_filter *filter); int
> i40e_fdir_flush(struct
> > +rte_eth_dev *dev);
> >
>
> Why don't declare them as the global functions at the beginning?
When I implement the store/restore function, I plan this function is only used in i40e_ethdev.c.
I change them to the global functions since I add i40e_flow.c to rework all the flow ops.
>
> > /* I40E_DEV_PRIVATE_TO */
> > #define I40E_DEV_PRIVATE_TO_PF(adapter) \ diff --git
> > a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index
> > 6c1bb18..f10aeee 100644
> > --- a/drivers/net/i40e/i40e_fdir.c
> > +++ b/drivers/net/i40e/i40e_fdir.c
> > @@ -119,8 +119,6 @@ static int i40e_fdir_filter_programming(struct
> i40e_pf *pf,
> > enum i40e_filter_pctype pctype,
> > const struct rte_eth_fdir_filter *filter,
> > bool add);
> > -static int i40e_fdir_flush(struct rte_eth_dev *dev);
> > -
> > static int i40e_fdir_filter_convert(const struct rte_eth_fdir_filter *input,
> > struct i40e_fdir_filter *filter); static struct
> i40e_fdir_filter
> > * @@ -128,8 +126,6 @@ i40e_sw_fdir_filter_lookup(struct i40e_fdir_info
> > *fdir_info,
> > const struct rte_eth_fdir_input *input); static int
> > i40e_sw_fdir_filter_insert(struct i40e_pf *pf,
> > struct i40e_fdir_filter *filter); -static int
> > i40e_sw_fdir_filter_del(struct i40e_pf *pf,
> > - struct i40e_fdir_filter *filter);
> >
> > static int
> > i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq) @@ -1070,7 +1066,7
> > @@ i40e_sw_fdir_filter_insert(struct i40e_pf *pf, struct
> > i40e_fdir_filter *filter) }
> >
> > /* Delete a flow director filter from the SW list */ -static int
> > +int
> > i40e_sw_fdir_filter_del(struct i40e_pf *pf, struct i40e_fdir_filter
> > *filter) {
> > struct i40e_fdir_info *fdir_info = &pf->fdir; @@ -1318,7 +1314,7 @@
> > i40e_fdir_filter_programming(struct i40e_pf *pf,
> > * i40e_fdir_flush - clear all filters of Flow Director table
> > * @pf: board private structure
> > */
> > -static int
> > +int
> > i40e_fdir_flush(struct rte_eth_dev *dev) {
> > struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data-
> >dev_private);
> > diff --git a/drivers/net/i40e/i40e_flow.c
> > b/drivers/net/i40e/i40e_flow.c index 4c7856c..1d9f603 100644
> > --- a/drivers/net/i40e/i40e_flow.c
> > +++ b/drivers/net/i40e/i40e_flow.c
> > @@ -68,6 +68,8 @@ static struct rte_flow *i40e_flow_create(struct
> rte_eth_dev *dev,
> > const struct rte_flow_item pattern[],
> > const struct rte_flow_action
> actions[],
> > struct rte_flow_error *error);
> > +static int i40e_flow_flush(struct rte_eth_dev *dev,
> > + struct rte_flow_error *error);
> > static int i40e_flow_destroy(struct rte_eth_dev *dev,
> > struct rte_flow *flow,
> > struct rte_flow_error *error); @@ -95,11 +97,13
> @@ static int
> > i40e_dev_destroy_ethertype_filter(struct i40e_pf *pf,
> > struct i40e_ethertype_filter *filter); static
> int
> > i40e_dev_destroy_tunnel_filter(struct i40e_pf *pf,
> > struct i40e_tunnel_filter *filter);
> > +static int i40e_fdir_filter_flush(struct i40e_pf *pf);
> >
> > const struct rte_flow_ops i40e_flow_ops = {
> > .validate = i40e_flow_validate,
> > .create = i40e_flow_create,
> > .destroy = i40e_flow_destroy,
> > + .flush = i40e_flow_flush,
> > };
> >
> > enum rte_filter_type cons_filter_type = RTE_ETH_FILTER_NONE; @@
> > -1603,3 +1607,45 @@ i40e_dev_destroy_tunnel_filter(struct i40e_pf *pf,
> >
> > return ret;
> > }
> > +
> > +static int
> > +i40e_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error
> > +*error) {
> > + struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data-
> >dev_private);
> > + int ret = 0;
> > +
>
> Meaningless initialization.
Yes, you're right, will change in next version. Thanks.
>
> > + ret = i40e_fdir_filter_flush(pf);
> > + if (!ret)
> > + rte_flow_error_set(error, EINVAL,
> > + RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
> > + "Failed to flush FDIR flows.");
>
> Just curious. What's the relationship between `ret' and the code (EINVAL)
> passed to rte_flow_error_set()? Is `-ret' acceptable as the parameter?
> Because the `-ret' which is actually returned by i40e_fdir_flush() is also some
> standard UNIX errno. When error occurs, user should use which one to figure
> out the failure reason? `-ret' or `rte_errno'?
rte_errno. I need to rework all rte_flow_error_set() according to Adrien's comments.
>
> > +
> > + return ret;
> > +}
> > +
> > +static int
> > +i40e_fdir_filter_flush(struct i40e_pf *pf) {
> > + struct rte_eth_dev *dev = pf->adapter->eth_dev;
> > + struct i40e_fdir_info *fdir_info = &pf->fdir;
> > + struct i40e_fdir_filter *fdir_filter;
> > + struct i40e_flow *flow;
> > + int ret = 0;
> > +
>
> Meaningless initialization.
>
> > + ret = i40e_fdir_flush(dev);
> > + if (!ret) {
> > + /* Delete FDIR filters in FDIR list. */
> > + while ((fdir_filter = TAILQ_FIRST(&fdir_info->fdir_list)))
> > + i40e_sw_fdir_filter_del(pf, fdir_filter);
> > +
>
> The i40e_sw_fdir_filter_del() may fail, in which case fdir_filter won't be
> removed from fdir_info->fdir_list. Will it lead to an infinite loop?
> Should you check the retval of i40e_sw_fdir_filter_del() and break the loop
> when it fails?
Yes, thanks for catching this.
>
> Best regards,
> Tiwei Bie
More information about the dev
mailing list