【发布时间】:2015-08-09 08:50:35
【问题描述】:
我是 Linux 内核的新手,刚刚开始了解 zram 的工作原理。初始测试,我看到READ 在WRITE 之前发出,就在zram 被初始化之后。但我只是想知道,为什么会这样?
作为一项活动,我使用了dump_stack(),并按照路径表单了解如何执行zram 读取。
zram 了解此信息是否必须对发出的bio->bi_rw 执行READ 或WRITE 操作。代码流就像在zram 驱动程序中从create_device 调用zram_make_request API。而zram_make_request 内部调用了__zram_make_request,后者调用了zram_bvec_rw API。
在zram_bvec_rw API 中检查bio->bi_rw 的可用信息,并相应地发出READ 和WRITE 调用。
现在,在这种情况下发生了什么: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_begin 为ll_rw_block 发出READ?
- zram 驱动程序:
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_reads 和num_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