diff options
author | Feras Daoud <ferasda@mellanox.com> | 2016-12-28 07:47:28 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-01-12 14:01:06 -0500 |
commit | 27d41d29c7f093f6f77843624fbb080c1b4a8b9c (patch) | |
tree | fb61bc7a58ddab779bf5bfa8e306847b521ba861 /drivers | |
parent | c586071d1dc8227a7182179b8e50ee92cc43f6d2 (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.c | 2 |
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); |