@@ -583,14 +583,24 @@ static inline bool nvme_pci_use_sgls(struct nvme_dev *dev, struct request *req)
583
583
return true;
584
584
}
585
585
586
- static void nvme_free_iod (struct nvme_dev * dev , struct request * req )
586
+ static void nvme_unmap_data (struct nvme_dev * dev , struct request * req )
587
587
{
588
588
struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
589
+ enum dma_data_direction dma_dir = rq_data_dir (req ) ?
590
+ DMA_TO_DEVICE : DMA_FROM_DEVICE ;
589
591
const int last_prp = dev -> ctrl .page_size / sizeof (__le64 ) - 1 ;
590
592
dma_addr_t dma_addr = iod -> first_dma , next_dma_addr ;
591
-
592
593
int i ;
593
594
595
+ if (iod -> nents ) {
596
+ /* P2PDMA requests do not need to be unmapped */
597
+ if (!is_pci_p2pdma_page (sg_page (iod -> sg )))
598
+ dma_unmap_sg (dev -> dev , iod -> sg , iod -> nents , dma_dir );
599
+
600
+ if (blk_integrity_rq (req ))
601
+ dma_unmap_sg (dev -> dev , & iod -> meta_sg , 1 , dma_dir );
602
+ }
603
+
594
604
if (iod -> npages == 0 )
595
605
dma_pool_free (dev -> prp_small_pool , nvme_pci_iod_list (req )[0 ],
596
606
dma_addr );
@@ -847,50 +857,30 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
847
857
ret = nvme_pci_setup_prps (dev , req , & cmnd -> rw );
848
858
849
859
if (ret != BLK_STS_OK )
850
- goto out_unmap ;
860
+ goto out ;
851
861
852
862
ret = BLK_STS_IOERR ;
853
863
if (blk_integrity_rq (req )) {
854
864
if (blk_rq_count_integrity_sg (q , req -> bio ) != 1 )
855
- goto out_unmap ;
865
+ goto out ;
856
866
857
867
sg_init_table (& iod -> meta_sg , 1 );
858
868
if (blk_rq_map_integrity_sg (q , req -> bio , & iod -> meta_sg ) != 1 )
859
- goto out_unmap ;
869
+ goto out ;
860
870
861
871
if (!dma_map_sg (dev -> dev , & iod -> meta_sg , 1 , dma_dir ))
862
- goto out_unmap ;
872
+ goto out ;
863
873
864
874
cmnd -> rw .metadata = cpu_to_le64 (sg_dma_address (& iod -> meta_sg ));
865
875
}
866
876
867
877
return BLK_STS_OK ;
868
878
869
- out_unmap :
870
- dma_unmap_sg (dev -> dev , iod -> sg , iod -> nents , dma_dir );
871
879
out :
872
- nvme_free_iod (dev , req );
880
+ nvme_unmap_data (dev , req );
873
881
return ret ;
874
882
}
875
883
876
- static void nvme_unmap_data (struct nvme_dev * dev , struct request * req )
877
- {
878
- struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
879
- enum dma_data_direction dma_dir = rq_data_dir (req ) ?
880
- DMA_TO_DEVICE : DMA_FROM_DEVICE ;
881
-
882
- if (iod -> nents ) {
883
- /* P2PDMA requests do not need to be unmapped */
884
- if (!is_pci_p2pdma_page (sg_page (iod -> sg )))
885
- dma_unmap_sg (dev -> dev , iod -> sg , iod -> nents , dma_dir );
886
-
887
- if (blk_integrity_rq (req ))
888
- dma_unmap_sg (dev -> dev , & iod -> meta_sg , 1 , dma_dir );
889
- }
890
-
891
- nvme_free_iod (dev , req );
892
- }
893
-
894
884
/*
895
885
* NOTE: ns is NULL when called on the admin queue.
896
886
*/
0 commit comments