[ovs-dev] [PATCH] [RFC][windows]: Remap VPORT socket pool
Shashank Ram
rams at vmware.com
Tue Nov 13 19:21:09 UTC 2018
On 11/12/18 8:50 AM, Alin Gabriel Serdean wrote:
> Fixes:
> https://github.com/openvswitch/ovs-issues/issues/164
>
> Signed-off-by: Alin Gabriel Serdean <aserdean at ovn.org>
> ---
> lib/dpif-netlink.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 57 insertions(+), 1 deletion(-)
>
> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
> index 69c145cc3..5994c3445 100644
> --- a/lib/dpif-netlink.c
> +++ b/lib/dpif-netlink.c
> @@ -246,6 +246,38 @@ 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 struct nl_sock *
> +vport_create_socksp_windows(struct dpif_netlink *dpif, int *error)
> +OVS_REQ_WRLOCK(dpif->upcall_lock)
> +{
> + struct nl_sock *socksp;
> + size_t i;
> + /* 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) {
> + *error = EINVAL;
> + return NULL;
> + }
> + 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;
> + *error = 0;
> + return socksp;
> +}
> +static void
> +vport_del_socksp_windows(struct dpif_netlink *dpif, struct nl_sock *socksp)
> +{
> + socksp = NULL;
> +}
> +
> +
> static struct dpif_netlink *
> dpif_netlink_cast(const struct dpif *dpif)
> {
> @@ -716,7 +748,12 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const char *name,
> int error = 0;
>
> if (dpif->handlers) {
> - if (nl_sock_create(NETLINK_GENERIC, &socksp)) {
> +#ifdef _WIN32
> + socksp = vport_create_socksp_windows(dpif, &error);
> +#else
> + error = nl_sock_create(NETLINK_GENERIC, &socksp);
> +#endif
> + if (!socksp) {
> return error;
> }
> }
> @@ -748,7 +785,11 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const char *name,
> dpif_name(&dpif->dpif), *port_nop);
> }
>
> +#ifdef _WIN32
> + vport_del_socksp_windows(dpif, socksp);
> +#else
> nl_sock_destroy(socksp);
> +#endif
> goto exit;
> }
>
> @@ -763,7 +804,11 @@ 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);
> +#ifdef _WIN32
> + vport_del_socksp_windows(dpif, socksp);
> +#else
> nl_sock_destroy(socksp);
> +#endif
> goto exit;
> }
>
> @@ -2249,15 +2294,26 @@ dpif_netlink_refresh_channels(struct dpif_netlink *dpif, uint32_t n_handlers)
> || !vport_get_pid(dpif, port_no, &upcall_pid)) {
> struct nl_sock *socksp;
>
> +#ifdef _WIN32
> + socksp = vport_create_socksp_windows(dpif, &error);
> + if (!socksp) {
> + goto error;
> + }
> +#else
> if (nl_sock_create(NETLINK_GENERIC, &socksp)) {
> goto error;
> }
> +#endif
>
> error = vport_add_channel(dpif, vport.port_no, socksp);
> if (error) {
> VLOG_INFO("%s: could not add channels for port %s",
> dpif_name(&dpif->dpif), vport.name);
> +#ifdef _WIN32
> + vport_del_socksp_windows(dpif, socksp);
> +#else
> nl_sock_destroy(socksp);
> +#endif
> retval = error;
> goto error;
> }
Thanks for the fix!
Acked-by: Shashank Ram <rams at vmware.com>
Tested-by: Shashank Ram <rams at vmware.com>
More information about the dev
mailing list