18
18
#include "vfio_ccw_cp.h"
19
19
#include "vfio_ccw_private.h"
20
20
21
- struct pfn_array {
22
- /* Starting guest physical I/O address. */
23
- unsigned long pa_iova ;
24
- /* Array that stores PFNs of the pages need to pin. */
25
- unsigned long * pa_iova_pfn ;
21
+ struct page_array {
22
+ /* Array that stores pages need to pin. */
23
+ dma_addr_t * pa_iova ;
26
24
/* Array that receives PFNs of the pages pinned. */
27
25
unsigned long * pa_pfn ;
28
26
/* Number of pages pinned from @pa_iova. */
@@ -37,84 +35,81 @@ struct ccwchain {
37
35
/* Count of the valid ccws in chain. */
38
36
int ch_len ;
39
37
/* Pinned PAGEs for the original data. */
40
- struct pfn_array * ch_pa ;
38
+ struct page_array * ch_pa ;
41
39
};
42
40
43
41
/*
44
- * pfn_array_alloc () - alloc memory for PFNs
45
- * @pa: pfn_array on which to perform the operation
42
+ * page_array_alloc () - alloc memory for page array
43
+ * @pa: page_array on which to perform the operation
46
44
* @iova: target guest physical address
47
45
* @len: number of bytes that should be pinned from @iova
48
46
*
49
- * Attempt to allocate memory for PFNs .
47
+ * Attempt to allocate memory for page array .
50
48
*
51
- * Usage of pfn_array :
52
- * We expect (pa_nr == 0) and (pa_iova_pfn == NULL), any field in
49
+ * Usage of page_array :
50
+ * We expect (pa_nr == 0) and (pa_iova == NULL), any field in
53
51
* this structure will be filled in by this function.
54
52
*
55
53
* Returns:
56
- * 0 if PFNs are allocated
57
- * -EINVAL if pa->pa_nr is not initially zero, or pa->pa_iova_pfn is not NULL
54
+ * 0 if page array is allocated
55
+ * -EINVAL if pa->pa_nr is not initially zero, or pa->pa_iova is not NULL
58
56
* -ENOMEM if alloc failed
59
57
*/
60
- static int pfn_array_alloc (struct pfn_array * pa , u64 iova , unsigned int len )
58
+ static int page_array_alloc (struct page_array * pa , u64 iova , unsigned int len )
61
59
{
62
60
int i ;
63
61
64
- if (pa -> pa_nr || pa -> pa_iova_pfn )
62
+ if (pa -> pa_nr || pa -> pa_iova )
65
63
return - EINVAL ;
66
64
67
- pa -> pa_iova = iova ;
68
-
69
65
pa -> pa_nr = ((iova & ~PAGE_MASK ) + len + (PAGE_SIZE - 1 )) >> PAGE_SHIFT ;
70
66
if (!pa -> pa_nr )
71
67
return - EINVAL ;
72
68
73
- pa -> pa_iova_pfn = kcalloc (pa -> pa_nr ,
74
- sizeof (* pa -> pa_iova_pfn ) +
75
- sizeof (* pa -> pa_pfn ),
76
- GFP_KERNEL );
77
- if (unlikely (!pa -> pa_iova_pfn )) {
69
+ pa -> pa_iova = kcalloc (pa -> pa_nr ,
70
+ sizeof (* pa -> pa_iova ) + sizeof (* pa -> pa_pfn ),
71
+ GFP_KERNEL );
72
+ if (unlikely (!pa -> pa_iova )) {
78
73
pa -> pa_nr = 0 ;
79
74
return - ENOMEM ;
80
75
}
81
- pa -> pa_pfn = pa -> pa_iova_pfn + pa -> pa_nr ;
76
+ pa -> pa_pfn = ( unsigned long * ) & pa -> pa_iova [ pa -> pa_nr ] ;
82
77
83
- pa -> pa_iova_pfn [0 ] = pa -> pa_iova >> PAGE_SHIFT ;
78
+ pa -> pa_iova [0 ] = iova ;
84
79
pa -> pa_pfn [0 ] = -1ULL ;
85
80
for (i = 1 ; i < pa -> pa_nr ; i ++ ) {
86
- pa -> pa_iova_pfn [i ] = pa -> pa_iova_pfn [i - 1 ] + 1 ;
81
+ pa -> pa_iova [i ] = pa -> pa_iova [i - 1 ] + PAGE_SIZE ;
87
82
pa -> pa_pfn [i ] = -1ULL ;
88
83
}
89
84
90
85
return 0 ;
91
86
}
92
87
93
88
/*
94
- * pfn_array_unpin () - Unpin user pages in memory
95
- * @pa: pfn_array on which to perform the operation
89
+ * page_array_unpin () - Unpin user pages in memory
90
+ * @pa: page_array on which to perform the operation
96
91
* @vdev: the vfio device to perform the operation
97
92
* @pa_nr: number of user pages to unpin
98
93
*
99
94
* Only unpin if any pages were pinned to begin with, i.e. pa_nr > 0,
100
95
* otherwise only clear pa->pa_nr
101
96
*/
102
- static void pfn_array_unpin (struct pfn_array * pa ,
103
- struct vfio_device * vdev , int pa_nr )
97
+ static void page_array_unpin (struct page_array * pa ,
98
+ struct vfio_device * vdev , int pa_nr )
104
99
{
105
100
int unpinned = 0 , npage = 1 ;
106
101
107
102
while (unpinned < pa_nr ) {
108
- unsigned long * first = & pa -> pa_iova_pfn [unpinned ];
109
- unsigned long * last = & first [npage ];
103
+ dma_addr_t * first = & pa -> pa_iova [unpinned ];
104
+ dma_addr_t * last = & first [npage ];
110
105
111
106
if (unpinned + npage < pa_nr &&
112
- * first + npage == * last ) {
107
+ * first + npage * PAGE_SIZE == * last ) {
113
108
npage ++ ;
114
109
continue ;
115
110
}
116
111
117
- vfio_unpin_pages (vdev , * first << PAGE_SHIFT , npage );
112
+ vfio_unpin_pages (vdev , * first , npage );
118
113
unpinned += npage ;
119
114
npage = 1 ;
120
115
}
@@ -123,30 +118,30 @@ static void pfn_array_unpin(struct pfn_array *pa,
123
118
}
124
119
125
120
/*
126
- * pfn_array_pin () - Pin user pages in memory
127
- * @pa: pfn_array on which to perform the operation
121
+ * page_array_pin () - Pin user pages in memory
122
+ * @pa: page_array on which to perform the operation
128
123
* @mdev: the mediated device to perform pin operations
129
124
*
130
125
* Returns number of pages pinned upon success.
131
126
* If the pin request partially succeeds, or fails completely,
132
127
* all pages are left unpinned and a negative error value is returned.
133
128
*/
134
- static int pfn_array_pin (struct pfn_array * pa , struct vfio_device * vdev )
129
+ static int page_array_pin (struct page_array * pa , struct vfio_device * vdev )
135
130
{
136
131
int pinned = 0 , npage = 1 ;
137
132
int ret = 0 ;
138
133
139
134
while (pinned < pa -> pa_nr ) {
140
- unsigned long * first = & pa -> pa_iova_pfn [pinned ];
141
- unsigned long * last = & first [npage ];
135
+ dma_addr_t * first = & pa -> pa_iova [pinned ];
136
+ dma_addr_t * last = & first [npage ];
142
137
143
138
if (pinned + npage < pa -> pa_nr &&
144
- * first + npage == * last ) {
139
+ * first + npage * PAGE_SIZE == * last ) {
145
140
npage ++ ;
146
141
continue ;
147
142
}
148
143
149
- ret = vfio_pin_pages (vdev , * first << PAGE_SHIFT , npage ,
144
+ ret = vfio_pin_pages (vdev , * first , npage ,
150
145
IOMMU_READ | IOMMU_WRITE ,
151
146
& pa -> pa_pfn [pinned ]);
152
147
if (ret < 0 ) {
@@ -163,32 +158,30 @@ static int pfn_array_pin(struct pfn_array *pa, struct vfio_device *vdev)
163
158
return ret ;
164
159
165
160
err_out :
166
- pfn_array_unpin (pa , vdev , pinned );
161
+ page_array_unpin (pa , vdev , pinned );
167
162
return ret ;
168
163
}
169
164
170
165
/* Unpin the pages before releasing the memory. */
171
- static void pfn_array_unpin_free (struct pfn_array * pa , struct vfio_device * vdev )
166
+ static void page_array_unpin_free (struct page_array * pa , struct vfio_device * vdev )
172
167
{
173
- pfn_array_unpin (pa , vdev , pa -> pa_nr );
174
- kfree (pa -> pa_iova_pfn );
168
+ page_array_unpin (pa , vdev , pa -> pa_nr );
169
+ kfree (pa -> pa_iova );
175
170
}
176
171
177
- static bool pfn_array_iova_pinned (struct pfn_array * pa , unsigned long iova )
172
+ static bool page_array_iova_pinned (struct page_array * pa , unsigned long iova )
178
173
{
179
- unsigned long iova_pfn = iova >> PAGE_SHIFT ;
180
174
int i ;
181
175
182
176
for (i = 0 ; i < pa -> pa_nr ; i ++ )
183
- if (pa -> pa_iova_pfn [i ] == iova_pfn )
177
+ if (pa -> pa_iova [i ] == iova )
184
178
return true;
185
179
186
180
return false;
187
181
}
188
- /* Create the list of IDAL words for a pfn_array. */
189
- static inline void pfn_array_idal_create_words (
190
- struct pfn_array * pa ,
191
- unsigned long * idaws )
182
+ /* Create the list of IDAL words for a page_array. */
183
+ static inline void page_array_idal_create_words (struct page_array * pa ,
184
+ unsigned long * idaws )
192
185
{
193
186
int i ;
194
187
@@ -204,7 +197,7 @@ static inline void pfn_array_idal_create_words(
204
197
idaws [i ] = pa -> pa_pfn [i ] << PAGE_SHIFT ;
205
198
206
199
/* Adjust the first IDAW, since it may not start on a page boundary */
207
- idaws [0 ] += pa -> pa_iova & (PAGE_SIZE - 1 );
200
+ idaws [0 ] += pa -> pa_iova [ 0 ] & (PAGE_SIZE - 1 );
208
201
}
209
202
210
203
static void convert_ccw0_to_ccw1 (struct ccw1 * source , unsigned long len )
@@ -236,18 +229,18 @@ static void convert_ccw0_to_ccw1(struct ccw1 *source, unsigned long len)
236
229
static long copy_from_iova (struct vfio_device * vdev , void * to , u64 iova ,
237
230
unsigned long n )
238
231
{
239
- struct pfn_array pa = {0 };
232
+ struct page_array pa = {0 };
240
233
u64 from ;
241
234
int i , ret ;
242
235
unsigned long l , m ;
243
236
244
- ret = pfn_array_alloc (& pa , iova , n );
237
+ ret = page_array_alloc (& pa , iova , n );
245
238
if (ret < 0 )
246
239
return ret ;
247
240
248
- ret = pfn_array_pin (& pa , vdev );
241
+ ret = page_array_pin (& pa , vdev );
249
242
if (ret < 0 ) {
250
- pfn_array_unpin_free (& pa , vdev );
243
+ page_array_unpin_free (& pa , vdev );
251
244
return ret ;
252
245
}
253
246
@@ -268,7 +261,7 @@ static long copy_from_iova(struct vfio_device *vdev, void *to, u64 iova,
268
261
break ;
269
262
}
270
263
271
- pfn_array_unpin_free (& pa , vdev );
264
+ page_array_unpin_free (& pa , vdev );
272
265
273
266
return l ;
274
267
}
@@ -371,7 +364,7 @@ static struct ccwchain *ccwchain_alloc(struct channel_program *cp, int len)
371
364
chain -> ch_ccw = (struct ccw1 * )data ;
372
365
373
366
data = (u8 * )(chain -> ch_ccw ) + sizeof (* chain -> ch_ccw ) * len ;
374
- chain -> ch_pa = (struct pfn_array * )data ;
367
+ chain -> ch_pa = (struct page_array * )data ;
375
368
376
369
chain -> ch_len = len ;
377
370
@@ -555,7 +548,7 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
555
548
struct vfio_device * vdev =
556
549
& container_of (cp , struct vfio_ccw_private , cp )-> vdev ;
557
550
struct ccw1 * ccw ;
558
- struct pfn_array * pa ;
551
+ struct page_array * pa ;
559
552
u64 iova ;
560
553
unsigned long * idaws ;
561
554
int ret ;
@@ -589,13 +582,13 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
589
582
}
590
583
591
584
/*
592
- * Allocate an array of pfn's for pages to pin/translate.
585
+ * Allocate an array of pages to pin/translate.
593
586
* The number of pages is actually the count of the idaws
594
587
* required for the data transfer, since we only only support
595
588
* 4K IDAWs today.
596
589
*/
597
590
pa = chain -> ch_pa + idx ;
598
- ret = pfn_array_alloc (pa , iova , bytes );
591
+ ret = page_array_alloc (pa , iova , bytes );
599
592
if (ret < 0 )
600
593
goto out_free_idaws ;
601
594
@@ -606,21 +599,21 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
606
599
goto out_unpin ;
607
600
608
601
/*
609
- * Copy guest IDAWs into pfn_array , in case the memory they
602
+ * Copy guest IDAWs into page_array , in case the memory they
610
603
* occupy is not contiguous.
611
604
*/
612
605
for (i = 0 ; i < idaw_nr ; i ++ )
613
- pa -> pa_iova_pfn [i ] = idaws [i ] >> PAGE_SHIFT ;
606
+ pa -> pa_iova [i ] = idaws [i ];
614
607
} else {
615
608
/*
616
- * No action is required here; the iova addresses in pfn_array
617
- * were initialized sequentially in pfn_array_alloc () beginning
609
+ * No action is required here; the iova addresses in page_array
610
+ * were initialized sequentially in page_array_alloc () beginning
618
611
* with the contents of ccw->cda.
619
612
*/
620
613
}
621
614
622
615
if (ccw_does_data_transfer (ccw )) {
623
- ret = pfn_array_pin (pa , vdev );
616
+ ret = page_array_pin (pa , vdev );
624
617
if (ret < 0 )
625
618
goto out_unpin ;
626
619
} else {
@@ -630,13 +623,13 @@ static int ccwchain_fetch_direct(struct ccwchain *chain,
630
623
ccw -> cda = (__u32 ) virt_to_phys (idaws );
631
624
ccw -> flags |= CCW_FLAG_IDA ;
632
625
633
- /* Populate the IDAL with pinned/translated addresses from pfn */
634
- pfn_array_idal_create_words (pa , idaws );
626
+ /* Populate the IDAL with pinned/translated addresses from page */
627
+ page_array_idal_create_words (pa , idaws );
635
628
636
629
return 0 ;
637
630
638
631
out_unpin :
639
- pfn_array_unpin_free (pa , vdev );
632
+ page_array_unpin_free (pa , vdev );
640
633
out_free_idaws :
641
634
kfree (idaws );
642
635
out_init :
@@ -742,7 +735,7 @@ void cp_free(struct channel_program *cp)
742
735
cp -> initialized = false;
743
736
list_for_each_entry_safe (chain , temp , & cp -> ccwchain_list , next ) {
744
737
for (i = 0 ; i < chain -> ch_len ; i ++ ) {
745
- pfn_array_unpin_free (chain -> ch_pa + i , vdev );
738
+ page_array_unpin_free (chain -> ch_pa + i , vdev );
746
739
ccwchain_cda_free (chain , i );
747
740
}
748
741
ccwchain_free (chain );
@@ -918,7 +911,7 @@ bool cp_iova_pinned(struct channel_program *cp, u64 iova)
918
911
919
912
list_for_each_entry (chain , & cp -> ccwchain_list , next ) {
920
913
for (i = 0 ; i < chain -> ch_len ; i ++ )
921
- if (pfn_array_iova_pinned (chain -> ch_pa + i , iova ))
914
+ if (page_array_iova_pinned (chain -> ch_pa + i , iova ))
922
915
return true;
923
916
}
924
917
0 commit comments