From f5bdc64d9bb3c2d0d35e90a5078a35a713edd040 Mon Sep 17 00:00:00 2001 From: Long Li Date: Thu, 8 Aug 2019 21:44:11 +0000 Subject: Don't wait in hvnd_query_gid after interface is already bound to ND The user mode may call hvnd_query_gid multiple times, and from multiple user contexts at the same time. If it's already bound, return GID and not wait. --- .../hw/vmbus-rdma/vmbus-rdma-144.0/provider.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/hw/vmbus-rdma/vmbus-rdma-144.0/provider.c b/drivers/infiniband/hw/vmbus-rdma/vmbus-rdma-144.0/provider.c index 922bede06..12a7b21aa 100644 --- a/drivers/infiniband/hw/vmbus-rdma/vmbus-rdma-144.0/provider.c +++ b/drivers/infiniband/hw/vmbus-rdma/vmbus-rdma-144.0/provider.c @@ -604,9 +604,11 @@ static int hvnd_query_gid(struct ib_device *ibdev, u8 port, int index, debug_check(__func__, __LINE__); - ret = wait_for_completion_timeout(&nd_dev->addr_set, 60*HZ); - if (!ret) - return -ETIMEDOUT; + if (!nd_dev->bind_complete) { + ret = wait_for_completion_timeout(&nd_dev->addr_set, 60*HZ); + if (!ret && !nd_dev->bind_complete) + return -ETIMEDOUT; + } memset(&(gid->raw[0]), 0, sizeof(gid->raw)); memcpy(&(gid->raw[0]), nd_dev->mac_addr, 6); @@ -2752,8 +2754,8 @@ static int hvnd_try_bind_nic(unsigned char *mac, __be32 ip) /* if we reach here, this means bind_nic is a success */ hvnd_error("successfully bound to IP %pI4 MAC %pM\n", nd_dev->ip_addr, nd_dev->mac_addr); - complete(&nd_dev->addr_set); nd_dev->bind_complete = 1; + complete_all(&nd_dev->addr_set); mutex_unlock(&nd_dev->bind_mutex); ret = hvnd_register_device(nd_dev, nd_dev->ip_addr, nd_dev->mac_addr); -- 2.17.1