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 {
207207 IO_REGION_F_VMAP = 1 ,
208208 /* memory is provided by user and pinned by the kernel */
209209 IO_REGION_F_USER_PROVIDED = 2 ,
210+ /* only the first page in the array is ref'ed */
211+ IO_REGION_F_SINGLE_REF = 4 ,
210212};
211213
212214void io_free_region (struct io_ring_ctx * ctx , struct io_mapped_region * mr )
213215{
214216 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+
215222 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 );
217224 else
218- release_pages (mr -> pages , mr -> nr_pages );
225+ release_pages (mr -> pages , nr_refs );
226+
219227 kvfree (mr -> pages );
220228 }
221229 if ((mr -> flags & IO_REGION_F_VMAP ) && mr -> ptr )
You can’t perform that action at this time.
0 commit comments