[ovs-dev] [PATCH v5 3/4] netlink: support for asynchronous NL transactions
Sorin Vinturis
svinturis at cloudbasesolutions.com
Thu May 21 11:30:03 UTC 2015
Modified 'nl_sock_transact_multiple__' function to send asynchronous
I/O requests to the kernel driver.
Signed-off-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
Reported-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/64
---
v5: No changes compared to previous version.
---
lib/netlink-socket.c | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c
index 42eb232..63b78d9 100644
--- a/lib/netlink-socket.c
+++ b/lib/netlink-socket.c
@@ -802,7 +802,7 @@ nl_sock_transact_multiple__(struct nl_sock *sock,
txn->request->data,
txn->request->size,
reply_buf, sizeof reply_buf,
- &reply_len, NULL);
+ &reply_len, &sock->overlapped);
if (ret && reply_len == 0) {
/*
@@ -815,11 +815,28 @@ nl_sock_transact_multiple__(struct nl_sock *sock,
ofpbuf_clear(txn->reply);
}
} else if (!ret) {
- /* XXX: Map to a more appropriate error. */
- error = EINVAL;
- VLOG_DBG_RL(&rl, "fatal driver failure: %s",
- ovs_lasterror_to_string());
- break;
+ if (GetLastError() != ERROR_IO_PENDING) {
+ /* XXX: Map to a more appropriate error. */
+ error = EINVAL;
+ VLOG_DBG_RL(&rl, "fatal driver failure: %s",
+ ovs_lasterror_to_string());
+ break;
+ } else {
+ /* Operation is pending and will complete in the future.
+ * Wait for the operation to complete before continuing. */
+ if (!GetOverlappedResult(sock->handle,
+ &sock->overlapped,
+ &reply_len,
+ TRUE)) {
+ /* Operation has completed, but it failed. */
+ /* XXX: Map to a more appropriate error. */
+ error = EINVAL;
+ VLOG_DBG_RL(
+ &rl, "fatal driver asynchronous operation failure: %s",
+ ovs_lasterror_to_string());
+ break;
+ }
+ }
}
if (reply_len != 0) {
--
1.9.0.msysgit.0
More information about the dev
mailing list