@@ -693,25 +693,34 @@ static void nvme_free_prps(struct request *req)
693693 mempool_free (iod -> dma_vecs , nvmeq -> dev -> dmavec_mempool );
694694}
695695
696+
697+ static void __nvme_free_sgls (struct device * dma_dev , struct nvme_sgl_desc * sge ,
698+ struct nvme_sgl_desc * sg_list , enum dma_data_direction dir )
699+ {
700+ unsigned int len = le32_to_cpu (sge -> length );
701+ unsigned int i , nr_entries ;
702+
703+ if (sge -> type == (NVME_SGL_FMT_DATA_DESC << 4 )) {
704+ dma_unmap_page (dma_dev , le64_to_cpu (sge -> addr ), len , dir );
705+ return ;
706+ }
707+
708+ nr_entries = len / sizeof (* sg_list );
709+ for (i = 0 ; i < nr_entries ; i ++ )
710+ dma_unmap_page (dma_dev , le64_to_cpu (sg_list [i ].addr ),
711+ le32_to_cpu (sg_list [i ].length ), dir );
712+ }
713+
696714static void nvme_free_sgls (struct request * req )
697715{
698716 struct nvme_iod * iod = blk_mq_rq_to_pdu (req );
699717 struct nvme_queue * nvmeq = req -> mq_hctx -> driver_data ;
700718 struct device * dma_dev = nvmeq -> dev -> dev ;
701- dma_addr_t sqe_dma_addr = le64_to_cpu (iod -> cmd .common .dptr .sgl .addr );
702- unsigned int sqe_dma_len = le32_to_cpu (iod -> cmd .common .dptr .sgl .length );
703719 struct nvme_sgl_desc * sg_list = iod -> descriptors [0 ];
720+ struct nvme_sgl_desc * sge = & iod -> cmd .common .dptr .sgl ;
704721 enum dma_data_direction dir = rq_dma_dir (req );
705722
706- if (iod -> nr_descriptors ) {
707- unsigned int nr_entries = sqe_dma_len / sizeof (* sg_list ), i ;
708-
709- for (i = 0 ; i < nr_entries ; i ++ )
710- dma_unmap_page (dma_dev , le64_to_cpu (sg_list [i ].addr ),
711- le32_to_cpu (sg_list [i ].length ), dir );
712- } else {
713- dma_unmap_page (dma_dev , sqe_dma_addr , sqe_dma_len , dir );
714- }
723+ __nvme_free_sgls (dma_dev , sge , sg_list , dir );
715724}
716725
717726static void nvme_unmap_data (struct request * req )
0 commit comments