Thanks for working on this, Alex. I've considered implementing an
approach like this before, but haven't had a strong reason to.

On 29 August 2015 at 00:42, Alex Wang <ee07b...@gmail.com> wrote:
> This commit adds logic using ovs barrier to allow main thread pause
> all revalidators.  This new feature will be used in a later patch.
>
> Signed-off-by: Alex Wang <ee07b...@gmail.com>

<snip>

> @@ -762,6 +791,11 @@ udpif_revalidator(void *arg)
>
>      revalidator->id = ovsthread_id_self();
>      for (;;) {
> +        /* Pauses all revalidators if wanted. */
> +        if (latch_is_set(&udpif->pause_latch)) {
> +            revalidator_pause(revalidator);
> +        }
> +

Is there anything that ensures all revalidators are either before this
statement, or after this statement, when the latch is modified? We've
had issues with barriers before where not all revalidators hit a
barrier, and that can cause deadlocks or hung threads in some cases.
For instance, what happens if the system is under heavy load (let's
say, nested virtualization) and we have one revalidator thread which
runs and proceeds through this piece, then a second revalidator is
delayed before executing this, then the latch is modified by the main
thread, then the second revalidator gets scheduled to run? There won't
be enough threads hitting the barrier to let it continue.

I think that this type of issue doesn't affect exit_latch, because
exit_latch is only checked by the lead revalidator thread, which then
raises udpif->reval_exit before the barrier, and the value of
udpif->reval_exit is checked by all revalidators after the barrier.
Perhaps it would make sense in this case to follow that logic too?
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to