io_uring: add buffer unmap helper
Add a helper for unmapping registered buffers, better than double indexing and will be reused in the future. Suggested-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/66cbc6ea863be865bac7b7080ed6a3d5c542b71f.1618101759.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
3e9424989b
commit
7f61a1e9ef
@ -8093,25 +8093,27 @@ static unsigned long rings_size(unsigned sq_entries, unsigned cq_entries,
|
|||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf *imu)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < imu->nr_bvecs; i++)
|
||||||
|
unpin_user_page(imu->bvec[i].bv_page);
|
||||||
|
if (imu->acct_pages)
|
||||||
|
io_unaccount_mem(ctx, imu->acct_pages);
|
||||||
|
kvfree(imu->bvec);
|
||||||
|
imu->nr_bvecs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int io_sqe_buffers_unregister(struct io_ring_ctx *ctx)
|
static int io_sqe_buffers_unregister(struct io_ring_ctx *ctx)
|
||||||
{
|
{
|
||||||
int i, j;
|
unsigned int i;
|
||||||
|
|
||||||
if (!ctx->user_bufs)
|
if (!ctx->user_bufs)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
for (i = 0; i < ctx->nr_user_bufs; i++) {
|
for (i = 0; i < ctx->nr_user_bufs; i++)
|
||||||
struct io_mapped_ubuf *imu = &ctx->user_bufs[i];
|
io_buffer_unmap(ctx, &ctx->user_bufs[i]);
|
||||||
|
|
||||||
for (j = 0; j < imu->nr_bvecs; j++)
|
|
||||||
unpin_user_page(imu->bvec[j].bv_page);
|
|
||||||
|
|
||||||
if (imu->acct_pages)
|
|
||||||
io_unaccount_mem(ctx, imu->acct_pages);
|
|
||||||
kvfree(imu->bvec);
|
|
||||||
imu->nr_bvecs = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(ctx->user_bufs);
|
kfree(ctx->user_bufs);
|
||||||
ctx->user_bufs = NULL;
|
ctx->user_bufs = NULL;
|
||||||
ctx->nr_user_bufs = 0;
|
ctx->nr_user_bufs = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user