【问题标题】:why just after initializing the zram read is issued before write?为什么在初始化 zram 之后读取在写入之前发出?
【发布时间】:2015-08-09 08:50:35
【问题描述】:

我是 Linux 内核的新手,刚刚开始了解 zram 的工作原理。初始测试,我看到READWRITE 之前发出,就在zram 被初始化之后。但我只是想知道,为什么会这样?

作为一项活动,我使用了dump_stack(),并按照路径表单了解如何执行zram 读取。

zram 了解此信息是否必须对发出的bio->bi_rw 执行READWRITE 操作。代码流就像在zram 驱动程序中从create_device 调用zram_make_request API。而zram_make_request 内部调用了__zram_make_request,后者调用了zram_bvec_rw API。

zram_bvec_rw API 中检查bio->bi_rw 的可用信息,并相应地发出READWRITE 调用。

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

我想知道谁实际上将bio->bi_rw 设置为READ。通过启用少量打印,我发现__block_write_begin 使用READ 调用ll_rw_block API,后来ll_rw_block 调用submit_bh API,其中填充了其余bio 结构条目。

但我仍然没有得到答案为什么从__block_write_beginll_rw_block 发出READ

  • zram 驱动程序:

https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/drivers/block/zram/zram_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 计数设置为1,而num_writes 找到0,当我们执行mkswap /dev/block/zram0 并且在调用swapon /dev/block/zram0 之后,最终计数为num_reads = 2 and num_writes=1

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

【问题讨论】:

    标签: android memory-management linux-kernel linux-device-driver block-device


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多