1

我是 Linux 内核的新手,刚刚开始了解它是如何zram工作的。初始测试,我看到它是在初始化之后READ发布的。但我只是想知道,为什么会这样?WRITEzram

作为一项活动,我采用dump_stack()并遵循路径表单,了解如何zram执行此读取。

zram了解此信息是否必须执行READWRITE操作已发布bio->bi_rw。代码流就像是从驱动程序中zram_make_request调用 API 。并在内部调用了调用API。create_devicezramzram_make_request__zram_make_requestzram_bvec_rw

zram_bvec_rwAPI 中检查可用信息bio->bi_rw并相应地发出READandWRITE调用。

现在,在这种情况下发生了什么:READ被封装在bio结构本身中。作为分流,我发现submit_bh填充了所有条目bio并发布了submit_bio.

我想知道谁实际上将 as 设置bio->bi_rwREAD. 通过启用少量打印,我发现ll_rw_blockAPI 被__block_write_beginwith调用READ,稍后ll_rw_block调用submit_bhAPI 填充其余bio结构条目。

但我仍然没有得到答案,为什么从 fromREAD发出?ll_rw_block__block_write_begin

  • zram 驱动程序:

https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/drivers/block/zram/z​​ram_drv.c?id=refs/tags/v3.18.14

在文件中:https ://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/fs/buffer.c?id=refs/tags/v3.18.14

    if (!buffer_uptodate(bh) && !buffer_delay(bh) &&
        !buffer_unwritten(bh) &&
         (block_start < from || block_end > to)) {
        ll_rw_block(READ, 1, &bh);
        *wait_bh++=bh;
    }



 buffer_uptodate(bh),   /* Contains valid data */
 buffer_delay(bh),  /* Buffer is not yet allocated on disk */
 buffer_unwritten(bh),  /* Buffer is allocated on disk but not written */

请问有人可以解释/回答我的问题吗?

我如何得出在写之前执行读取的结论?

我只是检查num_readsnum_writes计数。并且当我们这样做并且在调用最终计数之后找到时,num_reads计数被设置为。1num_writes0mkswap /dev/block/zram0swapon /dev/block/zram0num_reads = 2 and num_writes=1

注意:这是我们不执行任何其他zram活动时的情况。如上所述,我们得到了这种行为。

4

1 回答 1

-1

因此,据我所知:block_start < from || block_end > to (当然要考虑其他条件,buffer_uptodate() 等)。ie bio 将写入一个完整的块,因此如果要更新的区域小于提交的块,您显然需要一个新副本。

于 2015-05-28T06:45:12.350 回答