Thx Ben, the suggestion makes sense.

Applied to master with the comments.




On Fri, Jul 18, 2014 at 4:16 PM, Ben Pfaff <b...@nicira.com> wrote:

> On Fri, Jul 18, 2014 at 03:10:27PM -0700, Alex Wang wrote:
> > *Sure, when I tried to delete my br-int, ovs hangs*
> >
> > *Basically, main thread joins the revalidator thread, revalidator threads
> > are either blocking at recvmsg() or the mutex.*
>
> Thanks, after some reading and experimentation I understand the
> problem now.  Here's a suggested patch that explains further:
>
> diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c
> index b1e6804..09d3a61 100644
> --- a/lib/netlink-socket.c
> +++ b/lib/netlink-socket.c
> @@ -724,9 +724,15 @@ nl_dump_refill(struct nl_dump *dump, struct ofpbuf
> *buffer)
>      int error;
>
>      while (!ofpbuf_size(buffer)) {
> -        error = nl_sock_recv__(dump->sock, buffer, true);
> +        error = nl_sock_recv__(dump->sock, buffer, false);
>          if (error) {
> -            /* The kernel shouldn't return EAGAIN while there's data
> left. */
> +            /* The kernel never blocks providing the results of a dump, so
> +             * error == EAGAIN means that we've read the whole thing, and
> +             * therefore transform it into EOF.  (The kernel always
> provides
> +             * NLMSG_DONE as a sentinel.  Some other thread must have
> received
> +             * that already but not yet signaled it in 'status'.)
> +             *
> +             * Any other error is just an error. */
>              return error == EAGAIN ? EOF : error;
>          }
>
> Does that make sense?
>
> Anyway,
> Acked-by: Ben Pfaff <b...@nicira.com>
> on the patch, I just want to document the reason better.
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to