On 5/23/23 12:39, Frode Nordahl wrote:
> The tc module combines the use of the `tc_transact` helper
> function for communication with the in-kernel tc infrastructure
> with assertions on the reply data by `ofpbuf_at_assert` on the
> received data prior to further processing.
> 
> `tc_transact` in turn calls `nl_transact`, which via
> `nl_transact_multiple__` ultimately calls and handles return
> value from `recvmsg`.  On error a check for EAGAIN is performed
> and a consequence of this condition is effectively to provide a
> non-error (0) result and an empty reply buffer.

Hi, Frode, others.

I took a closer look at the patch and the code in the netlink-socket.
IIUC, the EAGAIN here is not a result of operation that we're requesting,
it's just a EAGAIN on a non-blocking (MSG_DONTWAIT) netlink socket while
trying to read.  The reply to that transaction will arrive eventually and
we will interpret it later as a reply to a different netlink transaction.

The issue appears to be introduced in the following commit:
  407556ac6c90 ("netlink-socket: Avoid forcing a reply for final message in a 
transaction.")

And it was a performance optimization introduced as part of the set:
  https://mail.openvswitch.org/pipermail/ovs-dev/2012-April/260122.html

The problem is that we can't tell apart socket EAGAIN if there is nothing
to wait (requests didn't need a reply) and EAGAIN if kernel just didn't
manage to reply yet.

The real solution would be to revert commit 407556ac6c90 or be a bit
smarter and wait for reply only on requests that specify a reply buffer.

Or am I missing something?

Best regards, Ilya Maximets.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to