@@ -25,17 +25,6 @@ static int get_octo_len(u64 len, int page_shift)
2525 return (npages + 1 ) / 2 ;
2626}
2727
28- static void fill_sg (struct mlx5_vdpa_direct_mr * mr , void * in )
29- {
30- struct scatterlist * sg ;
31- __be64 * pas ;
32- int i ;
33-
34- pas = MLX5_ADDR_OF (create_mkey_in , in , klm_pas_mtt );
35- for_each_sg (mr -> sg_head .sgl , sg , mr -> nsg , i )
36- (* pas ) = cpu_to_be64 (sg_dma_address (sg ));
37- }
38-
3928static void mlx5_set_access_mode (void * mkc , int mode )
4029{
4130 MLX5_SET (mkc , mkc , access_mode_1_0 , mode & 0x3 );
@@ -45,10 +34,18 @@ static void mlx5_set_access_mode(void *mkc, int mode)
4534static void populate_mtts (struct mlx5_vdpa_direct_mr * mr , __be64 * mtt )
4635{
4736 struct scatterlist * sg ;
37+ int nsg = mr -> nsg ;
38+ u64 dma_addr ;
39+ u64 dma_len ;
40+ int j = 0 ;
4841 int i ;
4942
50- for_each_sg (mr -> sg_head .sgl , sg , mr -> nsg , i )
51- mtt [i ] = cpu_to_be64 (sg_dma_address (sg ));
43+ for_each_sg (mr -> sg_head .sgl , sg , mr -> nent , i ) {
44+ for (dma_addr = sg_dma_address (sg ), dma_len = sg_dma_len (sg );
45+ nsg && dma_len ;
46+ nsg -- , dma_addr += BIT (mr -> log_size ), dma_len -= BIT (mr -> log_size ))
47+ mtt [j ++ ] = cpu_to_be64 (dma_addr );
48+ }
5249}
5350
5451static int create_direct_mr (struct mlx5_vdpa_dev * mvdev , struct mlx5_vdpa_direct_mr * mr )
@@ -64,7 +61,6 @@ static int create_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct
6461 return - ENOMEM ;
6562
6663 MLX5_SET (create_mkey_in , in , uid , mvdev -> res .uid );
67- fill_sg (mr , in );
6864 mkc = MLX5_ADDR_OF (create_mkey_in , in , memory_key_mkey_entry );
6965 MLX5_SET (mkc , mkc , lw , !!(mr -> perm & VHOST_MAP_WO ));
7066 MLX5_SET (mkc , mkc , lr , !!(mr -> perm & VHOST_MAP_RO ));
@@ -276,8 +272,8 @@ static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr
276272done :
277273 mr -> log_size = log_entity_size ;
278274 mr -> nsg = nsg ;
279- err = dma_map_sg_attrs (dma , mr -> sg_head .sgl , mr -> nsg , DMA_BIDIRECTIONAL , 0 );
280- if (!err )
275+ mr -> nent = dma_map_sg_attrs (dma , mr -> sg_head .sgl , mr -> nsg , DMA_BIDIRECTIONAL , 0 );
276+ if (!mr -> nent )
281277 goto err_map ;
282278
283279 err = create_direct_mr (mvdev , mr );
0 commit comments