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

Reply via email to