转:EROFS pcluster 模式分析
原文链接:https://mp.weixin.qq.com/s/PQb_PwgxzyeeFZyz3FsO6w
EROFS pluster 模式的用处:
It’s used to judge whether inplace I/O can be used due to the current status of pclusters in the chain.
有四种:INFLIGHT, HOOKED, FOLLOWED, FOLLOWED_NOINPLACE,本文源码参考 Linux kernel 6.x.
FOLLOWED 模式
/* |
注释写到这个模式表示当前收集的 pcluster 是被 link 到这个 owned chain
,而且也可以和 remaining collections
连在一起,怎么理解?我们直接看代码。
如果当前收集的 pcluster 已经存在,走z_erofs_try_to_claim_pcluster
:
static void z_erofs_try_to_claim_pcluster(struct z_erofs_decompress_frontend *f) |
而这个 pcluster 已经解压过了:
static int z_erofs_decompress_pcluster(struct z_erofs_decompress_backend *be, |
也就是pcl->next == Z_EROFS_PCLUSTER_NIL
,那就放到这个链里,跟在owned_head
后面。
当收集到新的 pcluster 时,直接增加到这个 chain 里:
static int z_erofs_register_pcluster(struct z_erofs_decompress_frontend *fe) |
ok, 如果当前访问的 page 是整个收集的 tail page, 那这个 page 就可以用作 in-place I/O.
static int z_erofs_attach_page(struct z_erofs_decompress_frontend *fe, |
如上,在 attach page 时如果exclusive
为真,就会尝试 inplace I/O。
exclusive = (!cur && (!spiltted || tight)); |
当访问完 tail page 部分(从 page end 处开始),cur
为0, 依赖tight
, 这个tight
就根据 pcluster 模式来定:
/* |
也就是 tail page 所属的 pcluster 模式只有 HOOKED 或 FOLLOWED 才会把这个 page 用作 inplace I/O。
HOOKED 模式
/* |
当前的 pcluster 处在一个已经存在的 chain 的尾部,也就是 pcl->next == Z_EROFS_PCLUSTER_TAIL
,那么就新建一个 chain 给接下来的收集好了。
static void z_erofs_try_to_claim_pcluster(struct z_erofs_decompress_frontend *f) |
那么这个 tight
就是 false 了。
if (cur) |
当访问 head page 时,cur
还未变成 0,显然不是exclusive
,也就不能走 inplace I/O了。
cur = end - min_t(unsigned int, offset + end - map->m_la, end); |
INFLIGHT 模式
对一个已经存在的 pcluster,除了 nil 的情况,要么它是一个 chain 的 end (上面的 HOOKED),要么它不是一个 chain 的 end.
static void z_erofs_try_to_claim_pcluster(struct z_erofs_decompress_frontend *f) |
FOLLOWED_NOINPLACE 模式
看命名就大概知道了,这个模式不需要 inplace I/O。
/* |
z_erofs_bind_cache()
如果find_get_page()
都找到了 pcluster 的所有 pages,那就不用 I/O 了。
static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe, |
另外,inline 的情况也不需要 inplace I/O:
static int z_erofs_do_read_page(struct z_erofs_decompress_frontend *fe, |
BTW: 最新的版本已经去掉了HOOK模式。
版权声明:本站所有文章均采用 CC BY-NC-SA 4.0 CN 许可协议。转载请注明原文链接!