@@ -60,9 +60,11 @@ static int ib_init_umem_odp(struct ib_umem_odp *umem_odp,
60
60
{
61
61
struct ib_device * dev = umem_odp -> umem .ibdev ;
62
62
size_t page_size = 1UL << umem_odp -> page_shift ;
63
+ struct hmm_dma_map * map ;
63
64
unsigned long start ;
64
65
unsigned long end ;
65
- int ret ;
66
+ size_t nr_entries ;
67
+ int ret = 0 ;
66
68
67
69
umem_odp -> umem .is_odp = 1 ;
68
70
mutex_init (& umem_odp -> umem_mutex );
@@ -75,9 +77,20 @@ static int ib_init_umem_odp(struct ib_umem_odp *umem_odp,
75
77
if (unlikely (end < page_size ))
76
78
return - EOVERFLOW ;
77
79
78
- ret = hmm_dma_map_alloc (dev -> dma_device , & umem_odp -> map ,
79
- (end - start ) >> PAGE_SHIFT ,
80
- 1 << umem_odp -> page_shift );
80
+ nr_entries = (end - start ) >> PAGE_SHIFT ;
81
+ if (!(nr_entries * PAGE_SIZE / page_size ))
82
+ return - EINVAL ;
83
+
84
+ map = & umem_odp -> map ;
85
+ if (ib_uses_virt_dma (dev )) {
86
+ map -> pfn_list = kvcalloc (nr_entries , sizeof (* map -> pfn_list ),
87
+ GFP_KERNEL | __GFP_NOWARN );
88
+ if (!map -> pfn_list )
89
+ ret = - ENOMEM ;
90
+ } else
91
+ ret = hmm_dma_map_alloc (dev -> dma_device , map ,
92
+ (end - start ) >> PAGE_SHIFT ,
93
+ 1 << umem_odp -> page_shift );
81
94
if (ret )
82
95
return ret ;
83
96
@@ -90,7 +103,10 @@ static int ib_init_umem_odp(struct ib_umem_odp *umem_odp,
90
103
return 0 ;
91
104
92
105
out_free_map :
93
- hmm_dma_map_free (dev -> dma_device , & umem_odp -> map );
106
+ if (ib_uses_virt_dma (dev ))
107
+ kfree (map -> pfn_list );
108
+ else
109
+ hmm_dma_map_free (dev -> dma_device , map );
94
110
return ret ;
95
111
}
96
112
@@ -259,7 +275,10 @@ static void ib_umem_odp_free(struct ib_umem_odp *umem_odp)
259
275
ib_umem_end (umem_odp ));
260
276
mutex_unlock (& umem_odp -> umem_mutex );
261
277
mmu_interval_notifier_remove (& umem_odp -> notifier );
262
- hmm_dma_map_free (dev -> dma_device , & umem_odp -> map );
278
+ if (ib_uses_virt_dma (dev ))
279
+ kfree (umem_odp -> map .pfn_list );
280
+ else
281
+ hmm_dma_map_free (dev -> dma_device , & umem_odp -> map );
263
282
}
264
283
265
284
void ib_umem_odp_release (struct ib_umem_odp * umem_odp )
0 commit comments