zram: directly call zram_read_page in writeback_store
authorChristoph Hellwig <hch@lst.de>
Tue, 11 Apr 2023 17:14:52 +0000 (19:14 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 18 Apr 2023 23:29:58 +0000 (16:29 -0700)
writeback_store always reads a full page, so just call zram_read_page
directly and bypass the boune buffer handling.

Link: https://lkml.kernel.org/r/20230411171459.567614-11-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Acked-by: Minchan Kim <minchan@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zram_drv.c

index 414343b46ade8dcc6c682c9593b1ce9ae969f44d..40ef0a7ce348aebdee20995016fc765046a17bf4 100644 (file)
@@ -54,9 +54,8 @@ static size_t huge_class_size;
 static const struct block_device_operations zram_devops;
 
 static void zram_free_page(struct zram *zram, size_t index);
-static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec,
-                               u32 index, int offset, struct bio *bio);
-
+static int zram_read_page(struct zram *zram, struct page *page, u32 index,
+                         struct bio *bio, bool partial_io);
 
 static int zram_slot_trylock(struct zram *zram, u32 index)
 {
@@ -672,10 +671,6 @@ static ssize_t writeback_store(struct device *dev,
        }
 
        for (; nr_pages != 0; index++, nr_pages--) {
-               struct bio_vec bvec;
-
-               bvec_set_page(&bvec, page, PAGE_SIZE, 0);
-
                spin_lock(&zram->wb_limit_lock);
                if (zram->wb_limit_enable && !zram->bd_wb_limit) {
                        spin_unlock(&zram->wb_limit_lock);
@@ -719,7 +714,7 @@ static ssize_t writeback_store(struct device *dev,
                /* Need for hugepage writeback racing */
                zram_set_flag(zram, index, ZRAM_IDLE);
                zram_slot_unlock(zram, index);
-               if (zram_bvec_read(zram, &bvec, index, 0, NULL)) {
+               if (zram_read_page(zram, page, index, NULL, false)) {
                        zram_slot_lock(zram, index);
                        zram_clear_flag(zram, index, ZRAM_UNDER_WB);
                        zram_clear_flag(zram, index, ZRAM_IDLE);
@@ -730,9 +725,8 @@ static ssize_t writeback_store(struct device *dev,
                bio_init(&bio, zram->bdev, &bio_vec, 1,
                         REQ_OP_WRITE | REQ_SYNC);
                bio.bi_iter.bi_sector = blk_idx * (PAGE_SIZE >> 9);
+               bio_add_page(&bio, page, PAGE_SIZE, 0);
 
-               bio_add_page(&bio, bvec.bv_page, bvec.bv_len,
-                               bvec.bv_offset);
                /*
                 * XXX: A single page IO would be inefficient for write
                 * but it would be not bad as starter.