Applied to master with the changes mentioned in previous email. Thanks,
On Fri, Sep 12, 2014 at 10:18 AM, Alex Wang <al...@nicira.com> wrote: > Thx for pointing it out! > > Actually, I did 'perthread = pthread_getspecific(perthread_key);' instead > of > using 'ovsrcu_perthread_get()', which is wrong. Will fix it and remote the > call to ovsrcu_init_module(). > > > > On Fri, Sep 12, 2014 at 9:47 AM, Ben Pfaff <b...@nicira.com> wrote: > >> On Tue, Sep 09, 2014 at 11:23:34AM -0700, Alex Wang wrote: >> > On current master, the per-thread callback event set is flushed >> > when ovsrcu_quiesce_start() is called or when the callback >> > event set is full. For threads that only call 'ovsrcu_quiesce()' >> > to indicate quiescient state, their callback event set will not >> > be flushed for execution until the set is full. And this could >> > take a very long time. >> > >> > Theoretically, this should not be an issue, since rcu postponed >> > callback events should only free the old version of objects. >> > However, current ovs does not follow this rule, and some callback >> > events include other activities like unregistering the netdev >> > from global name-netdev map. The delay of unregistering the netdev >> > (by threads that only calls ovsrcu_quiesce()) will prevent the >> > recreate of same netdev indefinitely. >> > >> > As a short-term workaround, this commit makes every call to >> > ovsrcu_quiesce() flush the callback event set. In the long run, >> > there will be a refactor of the use of ovs-rcu module, in which all >> > callback events only free the old version of objects. >> > >> > Signed-off-by: Alex Wang <al...@nicira.com> >> > --- >> > lib/ovs-rcu.c | 8 +++++++- >> > 1 file changed, 7 insertions(+), 1 deletion(-) >> > >> > diff --git a/lib/ovs-rcu.c b/lib/ovs-rcu.c >> > index a052d6c..6fe6103 100644 >> > --- a/lib/ovs-rcu.c >> > +++ b/lib/ovs-rcu.c >> > @@ -138,8 +138,14 @@ ovsrcu_quiesce_start(void) >> > void >> > ovsrcu_quiesce(void) >> > { >> > + struct ovsrcu_perthread *perthread; >> > + >> > ovsrcu_init_module(); >> > - ovsrcu_perthread_get()->seqno = seq_read(global_seqno); >> > + perthread = pthread_getspecific(perthread_key); >> > + perthread->seqno = seq_read(global_seqno); >> > + if (perthread->cbset) { >> > + ovsrcu_flush_cbset(perthread); >> > + } >> > seq_change(global_seqno); >> >> I think that we can remove the call to ovsrcu_init_module() because >> ovsrcu_perthread_get() calls it. (This was also true before your >> patch.) >> >> Acked-by: Ben Pfaff <b...@nicira.com> >> > > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev