mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
io_uring/rsrc: add reference count to struct io_mapped_ubuf
Currently there's a single ring owner of a mapped buffer, and hence the reference count will always be 1 when it's torn down and freed. However, in preparation for being able to link io_mapped_ubuf to different spots, add a reference count to manage the lifetime of it. Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
021b153f7d
commit
bfc0aa7a51
@ -116,6 +116,8 @@ static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf **slo
|
||||
|
||||
*slot = NULL;
|
||||
if (imu != &dummy_ubuf) {
|
||||
if (!refcount_dec_and_test(&imu->refs))
|
||||
return;
|
||||
for (i = 0; i < imu->nr_bvecs; i++)
|
||||
unpin_user_page(imu->bvec[i].bv_page);
|
||||
if (imu->acct_pages)
|
||||
@ -990,6 +992,7 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
|
||||
imu->folio_shift = data.folio_shift;
|
||||
imu->folio_mask = ~((1UL << data.folio_shift) - 1);
|
||||
}
|
||||
refcount_set(&imu->refs, 1);
|
||||
off = (unsigned long) iov->iov_base & ~imu->folio_mask;
|
||||
*pimu = imu;
|
||||
ret = 0;
|
||||
|
@ -47,6 +47,7 @@ struct io_mapped_ubuf {
|
||||
unsigned int folio_shift;
|
||||
unsigned long acct_pages;
|
||||
unsigned long folio_mask;
|
||||
refcount_t refs;
|
||||
struct bio_vec bvec[] __counted_by(nr_bvecs);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user