@@ -689,26 +689,28 @@ static int idxd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
689
689
return rc ;
690
690
}
691
691
692
- static void idxd_flush_pending_llist (struct idxd_irq_entry * ie )
692
+ static void idxd_flush_pending_descs (struct idxd_irq_entry * ie )
693
693
{
694
694
struct idxd_desc * desc , * itr ;
695
695
struct llist_node * head ;
696
+ LIST_HEAD (flist );
697
+ enum idxd_complete_type ctype ;
696
698
699
+ spin_lock (& ie -> list_lock );
697
700
head = llist_del_all (& ie -> pending_llist );
698
- if (!head )
699
- return ;
700
-
701
- llist_for_each_entry_safe (desc , itr , head , llnode )
702
- idxd_dma_complete_txd (desc , IDXD_COMPLETE_ABORT , true);
703
- }
701
+ if (head ) {
702
+ llist_for_each_entry_safe (desc , itr , head , llnode )
703
+ list_add_tail (& desc -> list , & ie -> work_list );
704
+ }
704
705
705
- static void idxd_flush_work_list ( struct idxd_irq_entry * ie )
706
- {
707
- struct idxd_desc * desc , * iter ;
706
+ list_for_each_entry_safe ( desc , itr , & ie -> work_list , list )
707
+ list_move_tail ( & desc -> list , & flist );
708
+ spin_unlock ( & ie -> list_lock ) ;
708
709
709
- list_for_each_entry_safe (desc , iter , & ie -> work_list , list ) {
710
+ list_for_each_entry_safe (desc , itr , & flist , list ) {
710
711
list_del (& desc -> list );
711
- idxd_dma_complete_txd (desc , IDXD_COMPLETE_ABORT , true);
712
+ ctype = desc -> completion -> status ? IDXD_COMPLETE_NORMAL : IDXD_COMPLETE_ABORT ;
713
+ idxd_dma_complete_txd (desc , ctype , true);
712
714
}
713
715
}
714
716
@@ -762,8 +764,7 @@ static void idxd_shutdown(struct pci_dev *pdev)
762
764
synchronize_irq (irq_entry -> vector );
763
765
if (i == 0 )
764
766
continue ;
765
- idxd_flush_pending_llist (irq_entry );
766
- idxd_flush_work_list (irq_entry );
767
+ idxd_flush_pending_descs (irq_entry );
767
768
}
768
769
flush_workqueue (idxd -> wq );
769
770
}
0 commit comments