diff options
author | Yossi Etigin <yosefe@Voltaire.COM> | 2008-11-12 13:24:38 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2008-11-12 13:24:38 -0500 |
commit | 93a3ab939ba90e00e193f0bad98f43fbdfbd925d (patch) | |
tree | 440fda184cac17d6d347f031d2fcff6a995eb41c /drivers/infiniband/ulp | |
parent | fe25c56190bbc0951d7c53b4ccd148e669d69938 (diff) |
IPoIB: Fix hang in ipoib_flush_paths()
ipoib_flush_paths() can hang during an SM up/down loop: if
path_rec_start() fails (for instance, because there is no sm_ah), the
path is still added to the path list by neigh_add_path(). Then,
ipoib_flush_paths() will wait for path->done, but it will never
complete because the request was not issued at all. Fix this by
completing path->done if issuing the query fails.
This fixes <https://bugs.openfabrics.org/show_bug.cgi?id=1329>.
Signed-off-by: Yossi Etigin <yosefe@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/ulp')
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index b1eeb5a427ca..0b2f601e8caf 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -547,6 +547,7 @@ static int path_rec_start(struct net_device *dev, | |||
547 | if (path->query_id < 0) { | 547 | if (path->query_id < 0) { |
548 | ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id); | 548 | ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id); |
549 | path->query = NULL; | 549 | path->query = NULL; |
550 | complete(&path->done); | ||
550 | return path->query_id; | 551 | return path->query_id; |
551 | } | 552 | } |
552 | 553 | ||