Allow user to set the QUEUE_FLAG_NOWAIT optionally using module parameter to retain the default behaviour. Also, update respective allocation flags in the write path. Following are the performance numbers with io_uring fio engine for random read, note that device has been populated fully with randwrite workload before taking these numbers :- * linux-block (for-next) # grep IOPS zram*fio | column -t default-nowait-off-1.fio: read: IOPS=802k, BW=3133MiB/s default-nowait-off-2.fio: read: IOPS=796k, BW=3111MiB/s default-nowait-off-3.fio: read: IOPS=796k, BW=3108MiB/s nowait-on-1.fio: read: IOPS=857k, BW=3346MiB/s nowait-on-2.fio: read: IOPS=857k, BW=3347MiB/s nowait-on-3.fio: read: IOPS=858k, BW=3353MiB/s * linux-block (for-next) # grep cpu zram*fio | column -t default-nowait-off-1.fio: cpu : usr=5.82%, sys=13.54%, ctx=36301915 default-nowait-off-2.fio: cpu : usr=5.84%, sys=13.03%, ctx=37781937 default-nowait-off-3.fio: cpu : usr=5.84%, sys=12.90%, ctx=37492533 nowait-on-1.fio: cpu : usr=1.74%, sys=97.62%, ctx=24068, nowait-on-2.fio: cpu : usr=1.74%, sys=97.57%, ctx=24674, nowait-on-3.fio: cpu : usr=1.76%, sys=97.59%, ctx=24725, Signed-off-by: Chaitanya Kulkarni <kch@xxxxxxxxxx> --- drivers/block/zram/zram_drv.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index f6d90f1ba5cf..b2e419f15f71 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -36,6 +36,10 @@ #include "zram_drv.h" +static bool g_nowait; +module_param_named(nowait, g_nowait, bool, 0444); +MODULE_PARM_DESC(nowait, "set QUEUE_FLAG_NOWAIT. Default: False"); + static DEFINE_IDR(zram_index_idr); /* idr index must be protected */ static DEFINE_MUTEX(zram_index_mutex); @@ -1540,9 +1544,10 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index) static int zram_bvec_write_partial(struct zram *zram, struct bio_vec *bvec, u32 index, int offset, struct bio *bio) { - struct page *page = alloc_page(GFP_NOIO); + struct page *page; int ret; + page = alloc_page(bio->bi_opf & REQ_NOWAIT ? GFP_NOWAIT : GFP_NOIO); if (!page) return -ENOMEM; @@ -2215,6 +2220,8 @@ static int zram_add(void) /* zram devices sort of resembles non-rotational disks */ blk_queue_flag_set(QUEUE_FLAG_NONROT, zram->disk->queue); blk_queue_flag_set(QUEUE_FLAG_SYNCHRONOUS, zram->disk->queue); + if (g_nowait) + blk_queue_flag_set(QUEUE_FLAG_NOWAIT, zram->disk->queue); /* * To ensure that we always get PAGE_SIZE aligned -- 2.40.0