On 2020-05-11 16:18, Bart Van Assche wrote: > Anyway, can you give the patch below a try? The patch in my previous email handles MQ mode but not bio mode. The attached patch should handle both. Thanks, Bart.
>From f3fcdf9000226dc1354557eae53d4541d4059d03 Mon Sep 17 00:00:00 2001 From: Bart Van Assche <bvanassche@xxxxxxx> Date: Mon, 11 May 2020 15:21:02 -0700 Subject: [PATCH] null_blk: Zero-initialize read buffers --- drivers/block/null_blk_main.c | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/drivers/block/null_blk_main.c b/drivers/block/null_blk_main.c index 06f5761fccb6..39dd82683e10 100644 --- a/drivers/block/null_blk_main.c +++ b/drivers/block/null_blk_main.c @@ -1250,8 +1250,53 @@ static inline blk_status_t null_handle_memory_backed(struct nullb_cmd *cmd, return errno_to_blk_status(err); } +static void nullb_zero_bvec(const struct bio_vec *bvec) +{ + struct page *page = bvec->bv_page; + u32 offset = bvec->bv_offset; + u32 left = bvec->bv_len; + + while (left) { + u32 len = min_t(u32, left, PAGE_SIZE - offset); + void *kaddr; + + kaddr = kmap_atomic(page); + memset(kaddr + offset, 0, len); + kunmap_atomic(kaddr); + page++; + left -= len; + offset = 0; + } +} + +static void nullb_zero_bio_data_buffer(struct bio *bio) +{ + struct bvec_iter iter; + struct bio_vec bvec; + + bio_for_each_bvec(bvec, bio, iter) + nullb_zero_bvec(&bvec); +} + +static void nullb_zero_rq_data_buffer(const struct request *rq) +{ + struct req_iterator iter; + struct bio_vec bvec; + + rq_for_each_bvec(bvec, rq, iter) + nullb_zero_bvec(&bvec); +} + +/* Complete a request. Only called if dev->memory_backed == 0. */ static inline void nullb_complete_cmd(struct nullb_cmd *cmd) { + struct nullb_device *dev = cmd->nq->dev; + + if (dev->queue_mode == NULL_Q_BIO && bio_op(cmd->bio) == REQ_OP_READ) + nullb_zero_bio_data_buffer(cmd->bio); + else if (req_op(cmd->rq) == REQ_OP_READ) + nullb_zero_rq_data_buffer(cmd->rq); + /* Complete IO by inline, softirq or timer */ switch (cmd->nq->dev->irqmode) { case NULL_IRQ_SOFTIRQ: