{
        struct idxd_desc *d, *t, *found = NULL;
        struct llist_node *head;
+       LIST_HEAD(flist);
 
        desc->completion->status = IDXD_COMP_DESC_ABORT;
        /*
                                found = desc;
                                continue;
                        }
-                       list_add_tail(&desc->list, &ie->work_list);
+
+                       if (d->completion->status)
+                               list_add_tail(&d->list, &flist);
+                       else
+                               list_add_tail(&d->list, &ie->work_list);
                }
        }
 
 
        if (found)
                complete_desc(found, IDXD_COMPLETE_ABORT);
+
+       /*
+        * complete_desc() will return desc to allocator and the desc can be
+        * acquired by a different process and the desc->list can be modified.
+        * Delete desc from list so the list trasversing does not get corrupted
+        * by the other process.
+        */
+       list_for_each_entry_safe(d, t, &flist, list) {
+               list_del_init(&d->list);
+               complete_desc(d, IDXD_COMPLETE_NORMAL);
+       }
 }
 
 int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)