[ovs-dev] [PATCH 05/12] dpif-netdev: Clear flow batches inside packet_batch_execute.
Daniele Di Proietto
diproiettod at ovn.org
Fri Oct 7 22:45:37 UTC 2016
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 <jarno at ovn.org>:
> Daniele had a comment on this, I believe?
>
> > On Oct 7, 2016, at 9:17 AM, Bhanuprakash Bodireddy <
> bhanuprakash.bodireddy at 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.bodireddy at intel.com>
> > Signed-off-by: Antonio Fischetti <antonio.fischetti at 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 at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list