Patch: https://github.com/openvswitch/ovs/commit/69c51582ff786a68fc325c1c50624715482bc460 broke Windows userpace - kernel communication.
On windows we create netlink sockets when the handlers are initiated and reuse them. This patch remaps the usage of the netlink socket pool. Fixes: https://github.com/openvswitch/ovs-issues/issues/164 Signed-off-by: Alin Gabriel Serdean <[email protected]> Acked-by: Shashank Ram <[email protected]> Tested-by: Shashank Ram <[email protected]> Signed-off-by: Ben Pfaff <[email protected]> Co-authored-by: Ben Pfaff <[email protected]> --- v1 -> v2: Fold in nice incremental from Ben RFC -> v1: Improve wording, change function name and add ifdef guard for them --- lib/dpif-netlink.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 4ae132866..8d60e1d2e 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -246,6 +246,42 @@ static int dpif_netlink_port_query__(const struct dpif_netlink *dpif, odp_port_t port_no, const char *port_name, struct dpif_port *dpif_port); +static int +create_nl_sock(struct dpif_netlink *dpif OVS_UNUSED, struct nl_sock **socksp) + OVS_REQ_WRLOCK(dpif->upcall_lock) +{ +#ifndef _WIN32 + return nl_sock_create(NETLINK_GENERIC, socksp); +#else + /* Pick netlink sockets to use in a round-robin fashion from each + * handler's pool of sockets. */ + struct dpif_handler *handler = &dpif->handlers[0]; + struct dpif_windows_vport_sock *sock_pool = handler->vport_sock_pool; + size_t index = handler->last_used_pool_idx; + + /* A pool of sockets is allocated when the handler is initialized. */ + if (sock_pool == NULL) { + *socksp = NULL; + return EINVAL; + } + + ovs_assert(index < VPORT_SOCK_POOL_SIZE); + *socksp = sock_pool[index].nl_sock; + ovs_assert(*socksp); + index = (index == VPORT_SOCK_POOL_SIZE - 1) ? 0 : index + 1; + handler->last_used_pool_idx = index; + return 0; +#endif +} + +static void +close_nl_sock(struct nl_sock *socksp) +{ +#ifndef _WIN32 + nl_sock_destroy(socksp); +#endif +} + static struct dpif_netlink * dpif_netlink_cast(const struct dpif *dpif) { @@ -716,7 +752,7 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const char *name, int error = 0; if (dpif->handlers) { - error = nl_sock_create(NETLINK_GENERIC, &socksp); + error = create_nl_sock(dpif, &socksp); if (error) { return error; } @@ -749,7 +785,7 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const char *name, dpif_name(&dpif->dpif), *port_nop); } - nl_sock_destroy(socksp); + close_nl_sock(socksp); goto exit; } @@ -764,7 +800,7 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const char *name, request.dp_ifindex = dpif->dp_ifindex; request.port_no = *port_nop; dpif_netlink_vport_transact(&request, NULL, NULL); - nl_sock_destroy(socksp); + close_nl_sock(socksp); goto exit; } @@ -2249,8 +2285,9 @@ dpif_netlink_refresh_channels(struct dpif_netlink *dpif, uint32_t n_handlers) if (port_no >= dpif->uc_array_size || !vport_get_pid(dpif, port_no, &upcall_pid)) { struct nl_sock *socksp; + error = create_nl_sock(dpif, &socksp); - if (nl_sock_create(NETLINK_GENERIC, &socksp)) { + if (error) { goto error; } -- 2.16.1.windows.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
