IB/hfi1: Don't remove list entries if they are not in a list
authorMitko Haralanov <[email protected]>
Tue, 12 Apr 2016 17:46:23 +0000 (10:46 -0700)
committerDoug Ledford <[email protected]>
Thu, 28 Apr 2016 20:32:26 +0000 (16:32 -0400)
The SDMA cache logic maintains an eviction list which is ordered
by most recently used user buffers. Upon errors or buffer freeing,
the list nodes were unconditionally being deleted. This would lead
to list corruption warnings if the nodes were never inserted in the
eviction list to begin with.

This commit prevents this by checking that the nodes are already
part of the eviction list.

Reviewed-by: Dean Luick <[email protected]>
Signed-off-by: Mitko Haralanov <[email protected]>
Signed-off-by: Dennis Dalessandro <[email protected]>
Signed-off-by: Doug Ledford <[email protected]>
drivers/staging/rdma/hfi1/user_sdma.c

index d53a659548e0a78b2cc8b8777e2f0b45a64961c1..032949bac801f4bdd36eb6f76f27883083ef32fe 100644 (file)
@@ -1135,7 +1135,8 @@ retry:
                ret = hfi1_mmu_rb_insert(&req->pq->sdma_rb_root, &node->rb);
                if (ret) {
                        spin_lock(&pq->evict_lock);
-                       list_del(&node->list);
+                       if (!list_empty(&node->list))
+                               list_del(&node->list);
                        pq->n_locked -= node->npages;
                        spin_unlock(&pq->evict_lock);
                        ret = 0;
@@ -1558,7 +1559,8 @@ static void sdma_rb_remove(struct rb_root *root, struct mmu_rb_node *mnode,
                container_of(mnode, struct sdma_mmu_node, rb);
 
        spin_lock(&node->pq->evict_lock);
-       list_del(&node->list);
+       if (!list_empty(&node->list))
+               list_del(&node->list);
        node->pq->n_locked -= node->npages;
        spin_unlock(&node->pq->evict_lock);