On 27/01/2016 01:34, "Ilya Maximets" <i.maxim...@samsung.com> wrote:

>Thanks for this patch.
>I have seen this bug while testing my patches for rx queues, but I thought
>that it was the problem in my specific testing system.
>
>It was easily reproducible. Now it's gone (with this patch applied).
>Thanks, that you figured out the origin of the problem.

Yeah, I noticed that too while testing that series, but this bug is
pre-existing and unrelated :-)

>
>One comment inline.
>
>Other than this:
>Tested-by: Ilya Maximets <i.maxim...@samsung.com>

Thanks for testing this

>
>On 27.01.2016 08:13, Daniele Di Proietto wrote:
>> It is ok to iterate a cmap with CMAP_FOR_EACH and remove elements with
>> cmap_remove(), but having quiescent states inside the loop might create
>> problems, since some of the postponed cleanup done inside the cmap might
>> be executed, leaving the iterator in an inconsisted state.
>> 
>> We had several of these errors in dpif-netdev, because when we rearrange
>> ports or threads we ofter need to wait on a condition variable (which
>> implies a quiescent state).
>> 
>> This problem caused iterations to skip elements or to list them twice,
>> resulting in the main thread waiting on a condition without anyone else
>> to signal.
>> 
>> Fix these cases by moving the possible quiescent states outside
>> CMAP_FOR_EACH loops.
>> 
>> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com>
>> ---
>>  lib/dpif-netdev.c | 32 +++++++++++++++++++++++++++++---
>>  1 file changed, 29 insertions(+), 3 deletions(-)
>> 
>> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
>> index ad6b202..1ec04d5 100644
>> --- a/lib/dpif-netdev.c
>> +++ b/lib/dpif-netdev.c
>> @@ -933,6 +933,7 @@ dp_netdev_free(struct dp_netdev *dp)
>>  
>>      ovs_mutex_lock(&dp->port_mutex);
>>      CMAP_FOR_EACH (port, node, &dp->ports) {
>> +        /* PMD threads are destroyed here. do_del_port() cannot
>>quiesce */
>
>This comment is wrong. There is a path to quiescent state in do_del_port:
>do_del_port() -> dp_netdev_reload_pmd__() -> ovs_mutex_cond_wait() ->
>       -> ovsrcu_quiesce_start().
>May be, this also should be fixed.

The pmd threads have been destroyed a few lines above, so this particular
do_del_port() will never call dp_netdev_reload_pmd__().

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to