From 4eae374845affc3ebf8ccfc38d554a86adc95003 Mon Sep 17 00:00:00 2001 From: Erez Shitrit Date: Tue, 8 Jul 2014 12:45:12 +0300 Subject: IB/ipoib: Avoid flushing the workqueue from worker context The error flow of ipoib_ib_dev_open() invokes ipoib_ib_dev_stop() with workqueue flushing enabled, which deadlocks if the open procedure itself was called by a worker thread. Fix this by adding a flush enabled flag to ipoib_ib_dev_open() and set it accordingly from the locations where such a call is made. The call trace was the following: [] ? flush_workqueue+0x54/0x80 [] ? ipoib_ib_dev_stop+0x447/0x650 [ib_ipoib] [] ? ipoib_ib_dev_open+0x284/0x430 [ib_ipoib] [] ? ipoib_open+0x78/0x1d0 [ib_ipoib] [] ? ipoib_pkey_open+0x38/0x40 [ib_ipoib] [] ? __ipoib_ib_dev_flush+0x15c/0x2c0 [ib_ipoib] [] ? __ipoib_ib_dev_flush+0x76/0x2c0 [ib_ipoib] [] ? ipoib_ib_dev_flush_heavy+0x0/0x20 [ib_ipoib] [] ? ipoib_ib_dev_flush_heavy+0x1a/0x20 [ib_ipoib] [] ? worker_thread+0x170/0x2a0 [] ? autoremove_wake_function+0x0/0x40 Signed-off-by: Erez Shitrit Signed-off-by: Or Gerlitz Acked-by: Alex Estrin Signed-off-by: Roland Dreier --- drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/infiniband/ulp/ipoib/ipoib_main.c') diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 35acbd41a5f7..1bf994a96860 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -114,7 +114,7 @@ int ipoib_open(struct net_device *dev) if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) return 0; - if (ipoib_ib_dev_open(dev)) + if (ipoib_ib_dev_open(dev, 1)) goto err_disable; if (ipoib_ib_dev_up(dev)) -- cgit v1.2.3