Message ID | CABKoBm3u++4e=jdAsZMe_E=WxsvKtsYM6R9e=tXYbOGH0R7c5g@mail.gmail.com |
---|---|
State | Not Applicable |
Headers | show |
On 2016-03-16 16:35, Andy Zhou wrote: > On Wed, Mar 16, 2016 at 4:00 PM, Ramu Ramamurthy < > sramamur@linux.vnet.ibm.com> wrote: > >> On 2016-03-15 11:16, Andy Zhou wrote: >> >>> On Mon, Mar 14, 2016 at 12:11 PM, Ramu Ramamurthy < >>> sramamur@linux.vnet.ibm.com> wrote: >>> >>> When a logical switch (localnet) has lots of ports on a hypervisor, >>>> I find that broadcast packets from one of the ports is only >>>> forwarded to >>>> a subset of the other ports, and the kernel module shows the message >>>> - >>>> "kernel: openvswitch: ovs-system: deferred action limit reached, >>>> drop >>>> recirc action" >>>> >>>> There appears to be a discussion of a related problem and a possible >>>> patch >>>> here: >>>> http://openvswitch.org/pipermail//discuss/2015-October/019168.html >>>> http://openvswitch.org/pipermail//discuss/2015-October/019198.html >>>> >>> >>> >>> Thanks for the bug report. >>> >>> Those patches are now dropped since I have not heard back from the >>> bug >>> reporter. >>> >>> I have just posted a potential fix as RFC at: >>> >>> http://openvswitch.org/pipermail/dev/2016-March/067794.html >>> >>> Would you please test it against your set up? Thanks. >>> >> >> I tried the patch in the link above on devstack-with-ovn. The >> openvswitch >> kernel module >> is rebuilt with the above patch, I find that there is a system hang, >> when I send the broadcast packet. The same test earlier showed "drop >> recirc action" errors. >> > > Ahh, I see. Would you please try the following incremental change? > Thanks. > > diff --git a/datapath/actions.c b/datapath/actions.c > index 3b85eaf..5e81a38 100644 > --- a/datapath/actions.c > +++ b/datapath/actions.c > @@ -116,7 +116,7 @@ static struct deferred_action > *action_fifo_get(struct > action > > static struct deferred_action *action_fifo_put(struct action_fifo > *fifo) > { > - if (fifo->head >= fifo->size - 1) { > + if (fifo->head >= fifo->size / sizeof(*fifo->fifo) - 1) { > /* out of fifo buffer space, try to allocate a new fifo > * buffer. */ > struct deferred_action *new_fifo; > > > >> thanks Andy, That worked !, I was able to broadcast (udp-dhcp-discovers) to 100 ports and saw no "drop recirc action" errors.
--- a/datapath/actions.c +++ b/datapath/actions.c @@ -116,7 +116,7 @@ static struct deferred_action *action_fifo_get(struct action static struct deferred_action *action_fifo_put(struct action_fifo *fifo) { - if (fifo->head >= fifo->size - 1) { + if (fifo->head >= fifo->size / sizeof(*fifo->fifo) - 1) { /* out of fifo buffer space, try to allocate a new fifo * buffer. */