Re: [PATCH v4] zram: Implement multi-page write-back
From: Sergey Senozhatsky
Date: Wed Nov 12 2025 - 00:18:07 EST
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?