block: enable per-cpu bio cache by default
Since after commit 12e4e8c7ab ("io_uring/rw: enable bio caches for
IRQ rw"), bio_put is safe for task and irq context, bio_alloc_bioset is
safe for task context and no one calls in irq context, so we can enable
per cpu bio cache by default.
Benchmarked with t/io_uring and ext4+nvme:
taskset -c 6 /root/fio/t/io_uring -p0 -d128 -b4096 -s1 -c1 -F1 -B1 -R1
-X1 -n1 -P1 /mnt/testfile
base IOPS is 562K, patch IOPS is 574K. The CPU usage of bio_alloc_bioset
decrease from 1.42% to 1.22%.
The worst case is allocate bio in CPU A but free in CPU B, still use
t/io_uring and ext4+nvme:
base IOPS is 648K, patch IOPS is 647K.
Also use fio test ext4/xfs with libaio/sync/io_uring on null_blk and
nvme, no obvious performance regression.
Signed-off-by: Fengnan Chang <changfengnan@bytedance.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
pull/1354/merge
parent
05ce4c584c
commit
48f22f8093
26
block/bio.c
26
block/bio.c
|
|
@ -517,20 +517,18 @@ struct bio *bio_alloc_bioset(struct block_device *bdev, unsigned short nr_vecs,
|
|||
if (WARN_ON_ONCE(!mempool_initialized(&bs->bvec_pool) && nr_vecs > 0))
|
||||
return NULL;
|
||||
|
||||
if (opf & REQ_ALLOC_CACHE) {
|
||||
if (bs->cache && nr_vecs <= BIO_INLINE_VECS) {
|
||||
bio = bio_alloc_percpu_cache(bdev, nr_vecs, opf,
|
||||
gfp_mask, bs);
|
||||
if (bio)
|
||||
return bio;
|
||||
/*
|
||||
* No cached bio available, bio returned below marked with
|
||||
* REQ_ALLOC_CACHE to particpate in per-cpu alloc cache.
|
||||
*/
|
||||
} else {
|
||||
opf &= ~REQ_ALLOC_CACHE;
|
||||
}
|
||||
}
|
||||
if (bs->cache && nr_vecs <= BIO_INLINE_VECS) {
|
||||
opf |= REQ_ALLOC_CACHE;
|
||||
bio = bio_alloc_percpu_cache(bdev, nr_vecs, opf,
|
||||
gfp_mask, bs);
|
||||
if (bio)
|
||||
return bio;
|
||||
/*
|
||||
* No cached bio available, bio returned below marked with
|
||||
* REQ_ALLOC_CACHE to participate in per-cpu alloc cache.
|
||||
*/
|
||||
} else
|
||||
opf &= ~REQ_ALLOC_CACHE;
|
||||
|
||||
/*
|
||||
* submit_bio_noacct() converts recursion to iteration; this means if
|
||||
|
|
|
|||
|
|
@ -184,8 +184,6 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
|
|||
loff_t pos = iocb->ki_pos;
|
||||
int ret = 0;
|
||||
|
||||
if (iocb->ki_flags & IOCB_ALLOC_CACHE)
|
||||
opf |= REQ_ALLOC_CACHE;
|
||||
bio = bio_alloc_bioset(bdev, nr_pages, opf, GFP_KERNEL,
|
||||
&blkdev_dio_pool);
|
||||
dio = container_of(bio, struct blkdev_dio, bio);
|
||||
|
|
@ -333,8 +331,6 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
|
|||
loff_t pos = iocb->ki_pos;
|
||||
int ret = 0;
|
||||
|
||||
if (iocb->ki_flags & IOCB_ALLOC_CACHE)
|
||||
opf |= REQ_ALLOC_CACHE;
|
||||
bio = bio_alloc_bioset(bdev, nr_pages, opf, GFP_KERNEL,
|
||||
&blkdev_dio_pool);
|
||||
dio = container_of(bio, struct blkdev_dio, bio);
|
||||
|
|
|
|||
|
|
@ -855,7 +855,6 @@ static int io_rw_init_file(struct io_kiocb *req, fmode_t mode, int rw_type)
|
|||
ret = kiocb_set_rw_flags(kiocb, rw->flags, rw_type);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
kiocb->ki_flags |= IOCB_ALLOC_CACHE;
|
||||
|
||||
/*
|
||||
* If the file is marked O_NONBLOCK, still allow retry for it if it
|
||||
|
|
|
|||
Loading…
Reference in New Issue