@@ -230,11 +230,10 @@ struct nvme_iod {
230230 bool use_sgl ;
231231 int aborted ;
232232 int npages ; /* In the PRP list. 0 means small pool in use */
233- int nents ; /* Used in scatterlist */
234233 dma_addr_t first_dma ;
235234 unsigned int dma_len ; /* length of single DMA segment mapping */
236235 dma_addr_t meta_dma ;
237- struct scatterlist * sg ;
236+ struct sg_table sgt ;
238237};
239238
240239static inline unsigned int nvme_dbbuf_size (struct nvme_dev * dev )
@@ -524,7 +523,7 @@ static void nvme_commit_rqs(struct blk_mq_hw_ctx *hctx)
524523static void * * nvme_pci_iod_list (struct request * req )
525524{
526525 struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
527- return (void * * )(iod -> sg + blk_rq_nr_phys_segments (req ));
526+ return (void * * )(iod -> sgt . sgl + blk_rq_nr_phys_segments (req ));
528527}
529528
530529static inline bool nvme_pci_use_sgls (struct nvme_dev * dev , struct request * req )
@@ -576,17 +575,6 @@ static void nvme_free_sgls(struct nvme_dev *dev, struct request *req)
576575 }
577576}
578577
579- static void nvme_unmap_sg (struct nvme_dev * dev , struct request * req )
580- {
581- struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
582-
583- if (is_pci_p2pdma_page (sg_page (iod -> sg )))
584- pci_p2pdma_unmap_sg (dev -> dev , iod -> sg , iod -> nents ,
585- rq_dma_dir (req ));
586- else
587- dma_unmap_sg (dev -> dev , iod -> sg , iod -> nents , rq_dma_dir (req ));
588- }
589-
590578static void nvme_unmap_data (struct nvme_dev * dev , struct request * req )
591579{
592580 struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
@@ -597,17 +585,18 @@ static void nvme_unmap_data(struct nvme_dev *dev, struct request *req)
597585 return ;
598586 }
599587
600- WARN_ON_ONCE (!iod -> nents );
588+ WARN_ON_ONCE (!iod -> sgt .nents );
589+
590+ dma_unmap_sgtable (dev -> dev , & iod -> sgt , rq_dma_dir (req ), 0 );
601591
602- nvme_unmap_sg (dev , req );
603592 if (iod -> npages == 0 )
604593 dma_pool_free (dev -> prp_small_pool , nvme_pci_iod_list (req )[0 ],
605594 iod -> first_dma );
606595 else if (iod -> use_sgl )
607596 nvme_free_sgls (dev , req );
608597 else
609598 nvme_free_prps (dev , req );
610- mempool_free (iod -> sg , dev -> iod_mempool );
599+ mempool_free (iod -> sgt . sgl , dev -> iod_mempool );
611600}
612601
613602static void nvme_print_sgl (struct scatterlist * sgl , int nents )
@@ -630,7 +619,7 @@ static blk_status_t nvme_pci_setup_prps(struct nvme_dev *dev,
630619 struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
631620 struct dma_pool * pool ;
632621 int length = blk_rq_payload_bytes (req );
633- struct scatterlist * sg = iod -> sg ;
622+ struct scatterlist * sg = iod -> sgt . sgl ;
634623 int dma_len = sg_dma_len (sg );
635624 u64 dma_addr = sg_dma_address (sg );
636625 int offset = dma_addr & (NVME_CTRL_PAGE_SIZE - 1 );
@@ -703,16 +692,16 @@ static blk_status_t nvme_pci_setup_prps(struct nvme_dev *dev,
703692 dma_len = sg_dma_len (sg );
704693 }
705694done :
706- cmnd -> dptr .prp1 = cpu_to_le64 (sg_dma_address (iod -> sg ));
695+ cmnd -> dptr .prp1 = cpu_to_le64 (sg_dma_address (iod -> sgt . sgl ));
707696 cmnd -> dptr .prp2 = cpu_to_le64 (iod -> first_dma );
708697 return BLK_STS_OK ;
709698free_prps :
710699 nvme_free_prps (dev , req );
711700 return BLK_STS_RESOURCE ;
712701bad_sgl :
713- WARN (DO_ONCE (nvme_print_sgl , iod -> sg , iod -> nents ),
702+ WARN (DO_ONCE (nvme_print_sgl , iod -> sgt . sgl , iod -> sgt . nents ),
714703 "Invalid SGL for payload:%d nents:%d\n" ,
715- blk_rq_payload_bytes (req ), iod -> nents );
704+ blk_rq_payload_bytes (req ), iod -> sgt . nents );
716705 return BLK_STS_IOERR ;
717706}
718707
@@ -738,12 +727,13 @@ static void nvme_pci_sgl_set_seg(struct nvme_sgl_desc *sge,
738727}
739728
740729static blk_status_t nvme_pci_setup_sgls (struct nvme_dev * dev ,
741- struct request * req , struct nvme_rw_command * cmd , int entries )
730+ struct request * req , struct nvme_rw_command * cmd )
742731{
743732 struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
744733 struct dma_pool * pool ;
745734 struct nvme_sgl_desc * sg_list ;
746- struct scatterlist * sg = iod -> sg ;
735+ struct scatterlist * sg = iod -> sgt .sgl ;
736+ unsigned int entries = iod -> sgt .nents ;
747737 dma_addr_t sgl_dma ;
748738 int i = 0 ;
749739
@@ -841,7 +831,7 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
841831{
842832 struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
843833 blk_status_t ret = BLK_STS_RESOURCE ;
844- int nr_mapped ;
834+ int rc ;
845835
846836 if (blk_rq_nr_phys_segments (req ) == 1 ) {
847837 struct bio_vec bv = req_bvec (req );
@@ -859,36 +849,35 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,
859849 }
860850
861851 iod -> dma_len = 0 ;
862- iod -> sg = mempool_alloc (dev -> iod_mempool , GFP_ATOMIC );
863- if (!iod -> sg )
852+ iod -> sgt . sgl = mempool_alloc (dev -> iod_mempool , GFP_ATOMIC );
853+ if (!iod -> sgt . sgl )
864854 return BLK_STS_RESOURCE ;
865- sg_init_table (iod -> sg , blk_rq_nr_phys_segments (req ));
866- iod -> nents = blk_rq_map_sg (req -> q , req , iod -> sg );
867- if (!iod -> nents )
855+ sg_init_table (iod -> sgt . sgl , blk_rq_nr_phys_segments (req ));
856+ iod -> sgt . orig_nents = blk_rq_map_sg (req -> q , req , iod -> sgt . sgl );
857+ if (!iod -> sgt . orig_nents )
868858 goto out_free_sg ;
869859
870- if (is_pci_p2pdma_page (sg_page (iod -> sg )))
871- nr_mapped = pci_p2pdma_map_sg_attrs (dev -> dev , iod -> sg ,
872- iod -> nents , rq_dma_dir (req ), DMA_ATTR_NO_WARN );
873- else
874- nr_mapped = dma_map_sg_attrs (dev -> dev , iod -> sg , iod -> nents ,
875- rq_dma_dir (req ), DMA_ATTR_NO_WARN );
876- if (!nr_mapped )
860+ rc = dma_map_sgtable (dev -> dev , & iod -> sgt , rq_dma_dir (req ),
861+ DMA_ATTR_NO_WARN );
862+ if (rc ) {
863+ if (rc == - EREMOTEIO )
864+ ret = BLK_STS_TARGET ;
877865 goto out_free_sg ;
866+ }
878867
879868 iod -> use_sgl = nvme_pci_use_sgls (dev , req );
880869 if (iod -> use_sgl )
881- ret = nvme_pci_setup_sgls (dev , req , & cmnd -> rw , nr_mapped );
870+ ret = nvme_pci_setup_sgls (dev , req , & cmnd -> rw );
882871 else
883872 ret = nvme_pci_setup_prps (dev , req , & cmnd -> rw );
884873 if (ret != BLK_STS_OK )
885874 goto out_unmap_sg ;
886875 return BLK_STS_OK ;
887876
888877out_unmap_sg :
889- nvme_unmap_sg (dev , req );
878+ dma_unmap_sgtable (dev -> dev , & iod -> sgt , rq_dma_dir ( req ), 0 );
890879out_free_sg :
891- mempool_free (iod -> sg , dev -> iod_mempool );
880+ mempool_free (iod -> sgt . sgl , dev -> iod_mempool );
892881 return ret ;
893882}
894883
@@ -912,7 +901,7 @@ static blk_status_t nvme_prep_rq(struct nvme_dev *dev, struct request *req)
912901
913902 iod -> aborted = 0 ;
914903 iod -> npages = -1 ;
915- iod -> nents = 0 ;
904+ iod -> sgt . nents = 0 ;
916905
917906 ret = nvme_setup_cmd (req -> q -> queuedata , req );
918907 if (ret )
0 commit comments