mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
io_uring/rsrc: don't rely on user vaddr alignment
Commit3a3c6d6157
upstream. There is no guaranteed alignment for user pointers, however the calculation of an offset of the first page into a folio after coalescing uses some weird bit mask logic, get rid of it. Cc: stable@vger.kernel.org Reported-by: David Hildenbrand <david@redhat.com> Fixes:a8edbb424b
("io_uring/rsrc: enable multi-hugepage buffer coalescing") Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/io-uring/e387b4c78b33f231105a601d84eefd8301f57954.1750771718.git.asml.silence@gmail.com/ Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
53fd75f25b
commit
50998b0ae7
|
@ -918,6 +918,7 @@ static bool io_try_coalesce_buffer(struct page ***pages, int *nr_pages,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
data->folio_shift = folio_shift(folio);
|
data->folio_shift = folio_shift(folio);
|
||||||
|
data->first_folio_page_idx = folio_page_idx(folio, page_array[0]);
|
||||||
/*
|
/*
|
||||||
* Check if pages are contiguous inside a folio, and all folios have
|
* Check if pages are contiguous inside a folio, and all folios have
|
||||||
* the same page count except for the head and tail.
|
* the same page count except for the head and tail.
|
||||||
|
@ -998,7 +999,9 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
|
||||||
if (coalesced)
|
if (coalesced)
|
||||||
imu->folio_shift = data.folio_shift;
|
imu->folio_shift = data.folio_shift;
|
||||||
refcount_set(&imu->refs, 1);
|
refcount_set(&imu->refs, 1);
|
||||||
off = (unsigned long) iov->iov_base & ((1UL << imu->folio_shift) - 1);
|
off = (unsigned long)iov->iov_base & ~PAGE_MASK;
|
||||||
|
if (coalesced)
|
||||||
|
off += data.first_folio_page_idx << PAGE_SHIFT;
|
||||||
*pimu = imu;
|
*pimu = imu;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ struct io_imu_folio_data {
|
||||||
/* For non-head/tail folios, has to be fully included */
|
/* For non-head/tail folios, has to be fully included */
|
||||||
unsigned int nr_pages_mid;
|
unsigned int nr_pages_mid;
|
||||||
unsigned int folio_shift;
|
unsigned int folio_shift;
|
||||||
|
unsigned long first_folio_page_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
void io_rsrc_node_ref_zero(struct io_rsrc_node *node);
|
void io_rsrc_node_ref_zero(struct io_rsrc_node *node);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user