Thanks Daniele,
in this patch we moved the reset of batches[i].flow->batch 
from dp_netdev_input__() into packet_batch_per_flow_execute().
So before calling dp_netdev_execute_actions() the flow->batch is already NULL.

I think this should prevent recirculation, or am I missing some detail?

Antonio 

> -----Original Message-----
> From: dev [mailto:dev-boun...@openvswitch.org] On Behalf Of Daniele Di
> Proietto
> Sent: Friday, October 7, 2016 11:46 PM
> To: Jarno Rajahalme <ja...@ovn.org>
> Cc: dev@openvswitch.org
> Subject: Re: [ovs-dev] [PATCH 05/12] dpif-netdev: Clear flow batches
> inside packet_batch_execute.
> 
> This patch basically reverts 603f2ce04d00("dpif-netdev: Clear flow batches
> before execute.")
> 
> As explained in that commit message the problem is that
> packet_batch_per_flow_execute() can trigger recirculation.  This means
> that
> we will call recursively dp_netdev_input__().  Here's a stack frame:
> 
> dp_netdev_input__()
> {
>     struct packet_batch_per_flow batches[PKT_ARRAY_SIZE];
>         /*...*/
>         packet_batch_per_flow_execute()
>         {
>             dp_execute_cb()
>             {
>                 case OVS_ACTION_ATTR_RECIRC:
>                     dp_netdev_input__() {
>                         struct packet_batch_per_flow
> batches[PKT_ARRAY_SIZE];
>                         /*...*/
>                     }
>             }
> 
> }
> 
> In the inner dp_netdev_input__() a lookup could theoretically find the
> same
> flows that it finds in the outer.
> If we don't clear _all_ the batch pointers before calling the inner
> dp_netdev_input__() we could find a flow that still has a pointer to a
> batch in the outer dp_netdev_input__(). Then we will append packets to the
> outer batch, which is clearly wrong.
> 
> 2016-10-07 14:09 GMT-07:00 Jarno Rajahalme <ja...@ovn.org>:
> 
> > Daniele had a comment on this, I believe?
> >
> > > On Oct 7, 2016, at 9:17 AM, Bhanuprakash Bodireddy <
> > bhanuprakash.bodire...@intel.com> wrote:
> > >
> > > There is a slight negative performance impact, by zeroing out the flow
> > > batch pointers in dp_netdev_input__ ahead of packet_batch_execute().
> The
> > > issue has been observed with multiple batches test scenario.
> > >
> > > This patch fixes the problem by removing the extra for loop and clear
> > > the flow batches inside the packet_batch_per_flow_execute(). Also the
> > > vtune analysis showed that the overall no. of instructions retired for
> > > dp_netdev_input__ reduced by 1,273,800,000 with this patch.
> > >
> > > Fixes: 603f2ce04d00 ("dpif-netdev: Clear flow batches before
> execute.")
> > > Signed-off-by: Bhanuprakash Bodireddy
> <bhanuprakash.bodire...@intel.com>
> > > Signed-off-by: Antonio Fischetti <antonio.fische...@intel.com>
> > > ---
> > > lib/dpif-netdev.c | 5 +----
> > > 1 file changed, 1 insertion(+), 4 deletions(-)
> > >
> > > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> > > index c002dd3..d0bb191 100644
> > > --- a/lib/dpif-netdev.c
> > > +++ b/lib/dpif-netdev.c
> > > @@ -3878,6 +3878,7 @@ packet_batch_per_flow_execute(struct
> > packet_batch_per_flow *batch,
> > > {
> > >     struct dp_netdev_actions *actions;
> > >     struct dp_netdev_flow *flow = batch->flow;
> > > +    flow->batch = NULL;
> > >
> > >     dp_netdev_flow_used(flow, batch->array.count, batch->byte_count,
> > >                         batch->tcp_flags, now);
> > > @@ -4173,10 +4174,6 @@ dp_netdev_input__(struct dp_netdev_pmd_thread
> > *pmd,
> > >     }
> > >
> > >     for (i = 0; i < n_batches; i++) {
> > > -        batches[i].flow->batch = NULL;
> > > -    }
> > > -
> > > -    for (i = 0; i < n_batches; i++) {
> > >         packet_batch_per_flow_execute(&batches[i], pmd, now);
> > >     }
> > > }
> > > --
> > > 2.4.11
> > >
> > > _______________________________________________
> > > dev mailing list
> > > dev@openvswitch.org
> > > http://openvswitch.org/mailman/listinfo/dev
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> >
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to