summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFeras Daoud <ferasda@mellanox.com>2016-12-28 15:47:21 +0300
committerBen Hutchings <ben@decadent.org.uk>2017-06-05 23:13:41 +0300
commit31c8b9423b11de5da378c5e185d2f3f0b8c24bd8 (patch)
treed63cc8f7f22f686a4105e3398d5da2644202a2ec
parent18c7fb96d479ebc604f5a2e515e64f53f410d0e3 (diff)
downloadlinux-31c8b9423b11de5da378c5e185d2f3f0b8c24bd8.tar.xz
IB/ipoib: Set device connection mode only when needed
commit 80b5b35aba62232521b31440f0a3cf6caa033849 upstream. When changing the connection mode, the ipoib_set_mode function did not check if the previous connection mode equals to the new one. This commit adds the required check and return 0 if the new mode equals to the previous one. Fixes: 839fcaba355a ("IPoIB: Connected mode experimental support") Signed-off-by: Feras Daoud <ferasda@mellanox.com> Signed-off-by: Erez Shitrit <erezsh@mellanox.com> Reviewed-by: Alex Vesker <valex@mellanox.com> Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com> [bwh: Backported to 3.2: - Adjust filename - Unlock RTNL lock before returning] Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_cm.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 0bbe030d26a8..2630797facab 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -1480,6 +1480,14 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
if (!rtnl_trylock())
return restart_syscall();
+ if ((test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags) &&
+ !strcmp(buf, "connected\n")) ||
+ (!test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags) &&
+ !strcmp(buf, "datagram\n"))) {
+ rtnl_unlock();
+ return 0;
+ }
+
/* flush paths if we switch modes so that connections are restarted */
if (IPOIB_CM_SUPPORTED(dev->dev_addr) && !strcmp(buf, "connected\n")) {
set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);