File tree Expand file tree Collapse file tree 1 file changed +10
-2
lines changed Expand file tree Collapse file tree 1 file changed +10
-2
lines changed Original file line number Diff line number Diff line change @@ -207,15 +207,23 @@ enum {
207
207
IO_REGION_F_VMAP = 1 ,
208
208
/* memory is provided by user and pinned by the kernel */
209
209
IO_REGION_F_USER_PROVIDED = 2 ,
210
+ /* only the first page in the array is ref'ed */
211
+ IO_REGION_F_SINGLE_REF = 4 ,
210
212
};
211
213
212
214
void io_free_region (struct io_ring_ctx * ctx , struct io_mapped_region * mr )
213
215
{
214
216
if (mr -> pages ) {
217
+ long nr_refs = mr -> nr_pages ;
218
+
219
+ if (mr -> flags & IO_REGION_F_SINGLE_REF )
220
+ nr_refs = 1 ;
221
+
215
222
if (mr -> flags & IO_REGION_F_USER_PROVIDED )
216
- unpin_user_pages (mr -> pages , mr -> nr_pages );
223
+ unpin_user_pages (mr -> pages , nr_refs );
217
224
else
218
- release_pages (mr -> pages , mr -> nr_pages );
225
+ release_pages (mr -> pages , nr_refs );
226
+
219
227
kvfree (mr -> pages );
220
228
}
221
229
if ((mr -> flags & IO_REGION_F_VMAP ) && mr -> ptr )
You can’t perform that action at this time.
0 commit comments