aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFeras Daoud <ferasda@mellanox.com>2016-12-28 07:47:28 -0500
committerDoug Ledford <dledford@redhat.com>2017-01-12 14:01:06 -0500
commit27d41d29c7f093f6f77843624fbb080c1b4a8b9c (patch)
treefb61bc7a58ddab779bf5bfa8e306847b521ba861 /drivers
parentc586071d1dc8227a7182179b8e50ee92cc43f6d2 (diff)
IB/ipoib: Change list_del to list_del_init in the tx object
Since ipoib_cm_tx_start function and ipoib_cm_tx_reap function belong to different work queues, they can run in parallel. In this case if ipoib_cm_tx_reap calls list_del and release the lock, ipoib_cm_tx_start may acquire it and call list_del_init on the already deleted object. Changing list_del to list_del_init in ipoib_cm_tx_reap fixes the problem. 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> Signed-off-by: Leon Romanovsky <leon@kernel.org> Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_cm.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index c433e72994f5..53d69d7d9ad4 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -1392,7 +1392,7 @@ static void ipoib_cm_tx_reap(struct work_struct *work)
1392 1392
1393 while (!list_empty(&priv->cm.reap_list)) { 1393 while (!list_empty(&priv->cm.reap_list)) {
1394 p = list_entry(priv->cm.reap_list.next, typeof(*p), list); 1394 p = list_entry(priv->cm.reap_list.next, typeof(*p), list);
1395 list_del(&p->list); 1395 list_del_init(&p->list);
1396 spin_unlock_irqrestore(&priv->lock, flags); 1396 spin_unlock_irqrestore(&priv->lock, flags);
1397 netif_tx_unlock_bh(dev); 1397 netif_tx_unlock_bh(dev);
1398 ipoib_cm_tx_destroy(p); 1398 ipoib_cm_tx_destroy(p);