@@ -195,9 +195,9 @@ enum io_uring_cmd_flags {
195
195
struct io_mapped_ubuf {
196
196
u64 ubuf ;
197
197
u64 ubuf_end ;
198
- struct bio_vec * bvec ;
199
198
unsigned int nr_bvecs ;
200
199
unsigned long acct_pages ;
200
+ struct bio_vec bvec [];
201
201
};
202
202
203
203
struct io_ring_ctx ;
@@ -405,7 +405,7 @@ struct io_ring_ctx {
405
405
406
406
/* if used, fixed mapped user buffers */
407
407
unsigned nr_user_bufs ;
408
- struct io_mapped_ubuf * user_bufs ;
408
+ struct io_mapped_ubuf * * user_bufs ;
409
409
410
410
struct user_struct * user ;
411
411
@@ -2760,7 +2760,7 @@ static int io_import_fixed(struct io_kiocb *req, int rw, struct iov_iter *iter)
2760
2760
if (unlikely (buf_index >= ctx -> nr_user_bufs ))
2761
2761
return - EFAULT ;
2762
2762
index = array_index_nospec (buf_index , ctx -> nr_user_bufs );
2763
- imu = & ctx -> user_bufs [index ];
2763
+ imu = ctx -> user_bufs [index ];
2764
2764
buf_addr = req -> rw .addr ;
2765
2765
2766
2766
if (unlikely (check_add_overflow (buf_addr , (u64 )len , & buf_end )))
@@ -8081,16 +8081,17 @@ static unsigned long rings_size(unsigned sq_entries, unsigned cq_entries,
8081
8081
return off ;
8082
8082
}
8083
8083
8084
- static void io_buffer_unmap (struct io_ring_ctx * ctx , struct io_mapped_ubuf * imu )
8084
+ static void io_buffer_unmap (struct io_ring_ctx * ctx , struct io_mapped_ubuf * * slot )
8085
8085
{
8086
+ struct io_mapped_ubuf * imu = * slot ;
8086
8087
unsigned int i ;
8087
8088
8088
8089
for (i = 0 ; i < imu -> nr_bvecs ; i ++ )
8089
8090
unpin_user_page (imu -> bvec [i ].bv_page );
8090
8091
if (imu -> acct_pages )
8091
8092
io_unaccount_mem (ctx , imu -> acct_pages );
8092
- kvfree (imu -> bvec );
8093
- imu -> nr_bvecs = 0 ;
8093
+ kvfree (imu );
8094
+ * slot = NULL ;
8094
8095
}
8095
8096
8096
8097
static int io_sqe_buffers_unregister (struct io_ring_ctx * ctx )
@@ -8157,7 +8158,7 @@ static bool headpage_already_acct(struct io_ring_ctx *ctx, struct page **pages,
8157
8158
8158
8159
/* check previously registered pages */
8159
8160
for (i = 0 ; i < ctx -> nr_user_bufs ; i ++ ) {
8160
- struct io_mapped_ubuf * imu = & ctx -> user_bufs [i ];
8161
+ struct io_mapped_ubuf * imu = ctx -> user_bufs [i ];
8161
8162
8162
8163
for (j = 0 ; j < imu -> nr_bvecs ; j ++ ) {
8163
8164
if (!PageCompound (imu -> bvec [j ].bv_page ))
@@ -8202,9 +8203,10 @@ static int io_buffer_account_pin(struct io_ring_ctx *ctx, struct page **pages,
8202
8203
}
8203
8204
8204
8205
static int io_sqe_buffer_register (struct io_ring_ctx * ctx , struct iovec * iov ,
8205
- struct io_mapped_ubuf * imu ,
8206
+ struct io_mapped_ubuf * * pimu ,
8206
8207
struct page * * last_hpage )
8207
8208
{
8209
+ struct io_mapped_ubuf * imu = NULL ;
8208
8210
struct vm_area_struct * * vmas = NULL ;
8209
8211
struct page * * pages = NULL ;
8210
8212
unsigned long off , start , end , ubuf ;
@@ -8216,6 +8218,7 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
8216
8218
start = ubuf >> PAGE_SHIFT ;
8217
8219
nr_pages = end - start ;
8218
8220
8221
+ * pimu = NULL ;
8219
8222
ret = - ENOMEM ;
8220
8223
8221
8224
pages = kvmalloc_array (nr_pages , sizeof (struct page * ), GFP_KERNEL );
@@ -8227,8 +8230,7 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
8227
8230
if (!vmas )
8228
8231
goto done ;
8229
8232
8230
- imu -> bvec = kvmalloc_array (nr_pages , sizeof (struct bio_vec ),
8231
- GFP_KERNEL );
8233
+ imu = kvmalloc (struct_size (imu , bvec , nr_pages ), GFP_KERNEL );
8232
8234
if (!imu -> bvec )
8233
8235
goto done ;
8234
8236
@@ -8258,14 +8260,12 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
8258
8260
*/
8259
8261
if (pret > 0 )
8260
8262
unpin_user_pages (pages , pret );
8261
- kvfree (imu -> bvec );
8262
8263
goto done ;
8263
8264
}
8264
8265
8265
8266
ret = io_buffer_account_pin (ctx , pages , pret , imu , last_hpage );
8266
8267
if (ret ) {
8267
8268
unpin_user_pages (pages , pret );
8268
- kvfree (imu -> bvec );
8269
8269
goto done ;
8270
8270
}
8271
8271
@@ -8285,8 +8285,11 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
8285
8285
imu -> ubuf = ubuf ;
8286
8286
imu -> ubuf_end = ubuf + iov -> iov_len ;
8287
8287
imu -> nr_bvecs = nr_pages ;
8288
+ * pimu = imu ;
8288
8289
ret = 0 ;
8289
8290
done :
8291
+ if (ret )
8292
+ kvfree (imu );
8290
8293
kvfree (pages );
8291
8294
kvfree (vmas );
8292
8295
return ret ;
@@ -8336,15 +8339,15 @@ static int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
8336
8339
return ret ;
8337
8340
8338
8341
for (i = 0 ; i < nr_args ; i ++ , ctx -> nr_user_bufs ++ ) {
8339
- struct io_mapped_ubuf * imu = & ctx -> user_bufs [i ];
8340
-
8341
8342
ret = io_copy_iov (ctx , & iov , arg , i );
8342
8343
if (ret )
8343
8344
break ;
8344
8345
ret = io_buffer_validate (& iov );
8345
8346
if (ret )
8346
8347
break ;
8347
- ret = io_sqe_buffer_register (ctx , & iov , imu , & last_hpage );
8348
+
8349
+ ret = io_sqe_buffer_register (ctx , & iov , & ctx -> user_bufs [i ],
8350
+ & last_hpage );
8348
8351
if (ret )
8349
8352
break ;
8350
8353
}
@@ -9291,7 +9294,7 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
9291
9294
}
9292
9295
seq_printf (m , "UserBufs:\t%u\n" , ctx -> nr_user_bufs );
9293
9296
for (i = 0 ; has_lock && i < ctx -> nr_user_bufs ; i ++ ) {
9294
- struct io_mapped_ubuf * buf = & ctx -> user_bufs [i ];
9297
+ struct io_mapped_ubuf * buf = ctx -> user_bufs [i ];
9295
9298
unsigned int len = buf -> ubuf_end - buf -> ubuf ;
9296
9299
9297
9300
seq_printf (m , "%5u: 0x%llx/%u\n" , i , buf -> ubuf , len );
0 commit comments