On 4/12/22 10:15 AM, Pavel Begunkov wrote: > On 4/12/22 17:06, Florian Schmaus wrote: >> On 12/04/2022 16.09, Pavel Begunkov wrote: >>> io_get_cqe() is expensive because of a bunch of loads, masking, etc. >>> However, most of the time we should have enough of entries in the CQ, >>> so we can cache two pointers representing a range of contiguous CQE >>> memory we can use. When the range is exhausted we'll go through a slower >>> path to set up a new range. When there are no CQEs avaliable, pointers >>> will naturally point to the same address. >>> >>> Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> >>> --- >>> fs/io_uring.c | 46 +++++++++++++++++++++++++++++++++++----------- >>> 1 file changed, 35 insertions(+), 11 deletions(-) >>> >>> diff --git a/fs/io_uring.c b/fs/io_uring.c >>> index b349a3c52354..f2269ffe09eb 100644 >>> --- a/fs/io_uring.c >>> +++ b/fs/io_uring.c >>> @@ -416,6 +416,13 @@ struct io_ring_ctx { >>> unsigned long check_cq_overflow; >>> struct { >>> + /* >>> + * We cache a range of free CQEs we can use, once exhausted it >>> + * should go through a slower range setup, see __io_get_cqe() >>> + */ >>> + struct io_uring_cqe *cqe_cached; >>> + struct io_uring_cqe *cqe_santinel; >> >> I think this should s/santinel/sentinel. I fixed it up. -- Jens Axboe