IB/ipoib: Change list_del to list_del_init in the tx object
authorFeras Daoud <ferasda@mellanox.com>
Wed, 28 Dec 2016 12:47:28 +0000 (14:47 +0200)
committerDoug Ledford <dledford@redhat.com>
Thu, 12 Jan 2017 19:01:06 +0000 (14:01 -0500)
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>
drivers/infiniband/ulp/ipoib/ipoib_cm.c

index c433e72994f5ee1b61a65740e61b678ade1960ce..53d69d7d9ad480d28881517a7a7f80690239f575 100644 (file)
@@ -1392,7 +1392,7 @@ static void ipoib_cm_tx_reap(struct work_struct *work)
 
        while (!list_empty(&priv->cm.reap_list)) {
                p = list_entry(priv->cm.reap_list.next, typeof(*p), list);
-               list_del(&p->list);
+               list_del_init(&p->list);
                spin_unlock_irqrestore(&priv->lock, flags);
                netif_tx_unlock_bh(dev);
                ipoib_cm_tx_destroy(p);