[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <htycvrcqbnkk7ldhpaqxesy7uhz3lssymwqm7nzkhyhnid3krm@mfju626njxvb>
Date: Wed, 12 Nov 2025 14:18:01 +0900
From: Sergey Senozhatsky <senozhatsky@...omium.org>
To: Yuwen Chen <ywen.chen@...mail.com>
Cc: axboe@...nel.dk, akpm@...ux-foundation.org, bgeffon@...gle.com,
licayy@...look.com, linux-block@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-mm@...ck.org, liumartin@...gle.com, minchan@...nel.org, richardycc@...gle.com,
senozhatsky@...omium.org
Subject: Re: [PATCH v4] zram: Implement multi-page write-back
On (25/11/06 09:49), Yuwen Chen wrote:
[..]
> + blk_start_plug(&plug);
> + while ((req->pps = select_pp_slot(ctl))) {
> spin_lock(&zram->wb_limit_lock);
> if (zram->wb_limit_enable && !zram->bd_wb_limit) {
> spin_unlock(&zram->wb_limit_lock);
> @@ -774,15 +884,15 @@ static int zram_writeback_slots(struct zram *zram, struct zram_pp_ctl *ctl)
> }
> spin_unlock(&zram->wb_limit_lock);
>
> - if (!blk_idx) {
> - blk_idx = alloc_block_bdev(zram);
> - if (!blk_idx) {
> + if (!req->blk_idx) {
> + req->blk_idx = alloc_block_bdev(zram);
> + if (!req->blk_idx) {
> ret = -ENOSPC;
> break;
> }
> }
>
> - index = pps->index;
> + index = req->pps->index;
> zram_slot_lock(zram, index);
> /*
> * scan_slots() sets ZRAM_PP_SLOT and relases slot lock, so
> @@ -792,22 +902,32 @@ static int zram_writeback_slots(struct zram *zram, struct zram_pp_ctl *ctl)
> */
> if (!zram_test_flag(zram, index, ZRAM_PP_SLOT))
> goto next;
> - if (zram_read_from_zspool(zram, page, index))
> + if (zram_read_from_zspool(zram, req->page, index))
> goto next;
> zram_slot_unlock(zram, index);
>
> - bio_init(&bio, zram->bdev, &bio_vec, 1,
> + bio_init(&req->bio, zram->bdev, &req->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);
> -
> - /*
> - * XXX: A single page IO would be inefficient for write
> - * but it would be not bad as starter.
> - */
> - err = submit_bio_wait(&bio);
> + req->bio.bi_iter.bi_sector = req->blk_idx * (PAGE_SIZE >> 9);
> + req->bio.bi_end_io = zram_writeback_endio;
> + req->bio.bi_private = req;
> + __bio_add_page(&req->bio, req->page, PAGE_SIZE, 0);
> +
> + list_del_init(&req->pps->entry);
> + submit_bio(&req->bio);
> +
> + do {
> + req = zram_writeback_next_request(req_pool, req_pool_cnt, &cnt_off);
> + if (!req) {
> + blk_finish_plug(&plug);
> + wait_for_completion_io(&done);
> + blk_start_plug(&plug);
> + }
> + } while (!req);
Why do you do this do-while loop here?
Powered by blists - more mailing lists