if (neigh) {
                        neigh->cm = NULL;
-                       list_del(&neigh->list);
                        ipoib_neigh_free(neigh);
 
                        tx->neigh = NULL;
 
                if (neigh) {
                        neigh->cm = NULL;
-                       list_del(&neigh->list);
                        ipoib_neigh_free(neigh);
 
                        tx->neigh = NULL;
                        neigh = p->neigh;
                        if (neigh) {
                                neigh->cm = NULL;
-                               list_del(&neigh->list);
                                ipoib_neigh_free(neigh);
                        }
                        list_del(&p->list);
 
                                                                               path,
                                                                               neigh));
                                if (!ipoib_cm_get(neigh)) {
-                                       list_del(&neigh->list);
                                        ipoib_neigh_free(neigh);
                                        continue;
                                }
                        if (!ipoib_cm_get(neigh))
                                ipoib_cm_set(neigh, ipoib_cm_create_tx(dev, path, neigh));
                        if (!ipoib_cm_get(neigh)) {
-                               list_del(&neigh->list);
                                ipoib_neigh_free(neigh);
                                goto err_drop;
                        }
                neigh->ah  = NULL;
 
                if (!path->query && path_rec_start(dev, path))
-                       goto err_list;
+                       goto err_path;
 
                __skb_queue_tail(&neigh->queue, skb);
        }
        ipoib_neigh_put(neigh);
        return;
 
-err_list:
-       list_del(&neigh->list);
-
 err_path:
        ipoib_neigh_free(neigh);
 err_drop:
                        rcu_assign_pointer(*np,
                                           rcu_dereference_protected(neigh->hnext,
                                                                     lockdep_is_held(&priv->lock)));
+                       /* remove from parent list */
+                       list_del(&neigh->list);
                        call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
                        return;
                } else {