From: Yossi Etigin Date: Wed, 12 Nov 2008 18:24:38 +0000 (-0800) Subject: IPoIB: Fix hang in ipoib_flush_paths() X-Git-Tag: v2.6.28-rc5~61^2^4~1 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=93a3ab939ba90e00e193f0bad98f43fbdfbd925d;p=linux-2.6-omap-h63xx.git 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 . Signed-off-by: Yossi Etigin Signed-off-by: Roland Dreier --- diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index b1eeb5a427c..0b2f601e8ca 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, if (path->query_id < 0) { ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id); path->query = NULL; + complete(&path->done); return path->query_id; }