Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
IPoIB: Fix deadlock on RTNL in ipoib_stop()
IB/ipath: Fix incorrect check for max physical address in TID
IB/ipath: Fix lost UD send work request

+25 -14
+1 -1
drivers/infiniband/hw/ipath/ipath_iba7220.c
··· 1720 "not 2KB aligned!\n", pa); 1721 return; 1722 } 1723 - if (pa >= (1UL << IBA7220_TID_SZ_SHIFT)) { 1724 ipath_dev_err(dd, 1725 "BUG: Physical page address 0x%lx " 1726 "larger than supported\n", pa);
··· 1720 "not 2KB aligned!\n", pa); 1721 return; 1722 } 1723 + if (chippa >= (1UL << IBA7220_TID_SZ_SHIFT)) { 1724 ipath_dev_err(dd, 1725 "BUG: Physical page address 0x%lx " 1726 "larger than supported\n", pa);
+6 -2
drivers/infiniband/hw/ipath/ipath_ud.c
··· 267 u16 lrh0; 268 u16 lid; 269 int ret = 0; 270 271 spin_lock_irqsave(&qp->s_lock, flags); 272 ··· 291 goto bail; 292 293 wqe = get_swqe_ptr(qp, qp->s_cur); 294 - if (++qp->s_cur >= qp->s_size) 295 - qp->s_cur = 0; 296 297 /* Construct the header. */ 298 ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; ··· 317 qp->s_flags |= IPATH_S_WAIT_DMA; 318 goto bail; 319 } 320 spin_unlock_irqrestore(&qp->s_lock, flags); 321 ipath_ud_loopback(qp, wqe); 322 spin_lock_irqsave(&qp->s_lock, flags); ··· 326 } 327 } 328 329 extra_bytes = -wqe->length & 3; 330 nwords = (wqe->length + extra_bytes) >> 2; 331
··· 267 u16 lrh0; 268 u16 lid; 269 int ret = 0; 270 + int next_cur; 271 272 spin_lock_irqsave(&qp->s_lock, flags); 273 ··· 290 goto bail; 291 292 wqe = get_swqe_ptr(qp, qp->s_cur); 293 + next_cur = qp->s_cur + 1; 294 + if (next_cur >= qp->s_size) 295 + next_cur = 0; 296 297 /* Construct the header. */ 298 ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; ··· 315 qp->s_flags |= IPATH_S_WAIT_DMA; 316 goto bail; 317 } 318 + qp->s_cur = next_cur; 319 spin_unlock_irqrestore(&qp->s_lock, flags); 320 ipath_ud_loopback(qp, wqe); 321 spin_lock_irqsave(&qp->s_lock, flags); ··· 323 } 324 } 325 326 + qp->s_cur = next_cur; 327 extra_bytes = -wqe->length & 3; 328 nwords = (wqe->length + extra_bytes) >> 2; 329
+9 -10
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 156 157 netif_stop_queue(dev); 158 159 - /* 160 - * Now flush workqueue to make sure a scheduled task doesn't 161 - * bring our internal state back up. 162 - */ 163 - flush_workqueue(ipoib_workqueue); 164 - 165 - ipoib_ib_dev_down(dev, 1); 166 - ipoib_ib_dev_stop(dev, 1); 167 168 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { 169 struct ipoib_dev_priv *cpriv; ··· 1308 1309 register_failed: 1310 ib_unregister_event_handler(&priv->event_handler); 1311 - flush_scheduled_work(); 1312 1313 event_failed: 1314 ipoib_dev_cleanup(priv->dev); ··· 1367 1368 list_for_each_entry_safe(priv, tmp, dev_list, list) { 1369 ib_unregister_event_handler(&priv->event_handler); 1370 - flush_scheduled_work(); 1371 1372 unregister_netdev(priv->dev); 1373 ipoib_dev_cleanup(priv->dev);
··· 156 157 netif_stop_queue(dev); 158 159 + ipoib_ib_dev_down(dev, 0); 160 + ipoib_ib_dev_stop(dev, 0); 161 162 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { 163 struct ipoib_dev_priv *cpriv; ··· 1314 1315 register_failed: 1316 ib_unregister_event_handler(&priv->event_handler); 1317 + flush_workqueue(ipoib_workqueue); 1318 1319 event_failed: 1320 ipoib_dev_cleanup(priv->dev); ··· 1373 1374 list_for_each_entry_safe(priv, tmp, dev_list, list) { 1375 ib_unregister_event_handler(&priv->event_handler); 1376 + 1377 + rtnl_lock(); 1378 + dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP); 1379 + rtnl_unlock(); 1380 + 1381 + flush_workqueue(ipoib_workqueue); 1382 1383 unregister_netdev(priv->dev); 1384 ipoib_dev_cleanup(priv->dev);
+9 -1
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
··· 392 &priv->mcast_task, 0); 393 mutex_unlock(&mcast_mutex); 394 395 - if (mcast == priv->broadcast) 396 netif_carrier_on(dev); 397 398 return 0; 399 }
··· 392 &priv->mcast_task, 0); 393 mutex_unlock(&mcast_mutex); 394 395 + if (mcast == priv->broadcast) { 396 + /* 397 + * Take RTNL lock here to avoid racing with 398 + * ipoib_stop() and turning the carrier back 399 + * on while a device is being removed. 400 + */ 401 + rtnl_lock(); 402 netif_carrier_on(dev); 403 + rtnl_unlock(); 404 + } 405 406 return 0; 407 }