On Thu, Mar 17, 2022 at 2:51 PM Yanteng Si <siyanteng01@xxxxxxxxx> wrote: > > From: Yanteng Si <siyanteng01@xxxxxxxxx> > > Translate .../vm/zsmalloc.rst into Chinese. > > Signed-off-by: Yanteng Si <siyanteng@xxxxxxxxxxx> Reviewed-by: Alex Shi <alexs@xxxxxxxxxx> > --- > Documentation/translations/zh_CN/vm/index.rst | 2 +- > .../translations/zh_CN/vm/zsmalloc.rst | 78 +++++++++++++++++++ > 2 files changed, 79 insertions(+), 1 deletion(-) > create mode 100644 Documentation/translations/zh_CN/vm/zsmalloc.rst > > diff --git a/Documentation/translations/zh_CN/vm/index.rst b/Documentation/translations/zh_CN/vm/index.rst > index e28d0e919bfe..c7148125e659 100644 > --- a/Documentation/translations/zh_CN/vm/index.rst > +++ b/Documentation/translations/zh_CN/vm/index.rst > @@ -38,6 +38,7 @@ TODO:待引用文档集被翻译完毕后请及时修改此处) > remap_file_pages > split_page_table_lock > z3fold > + zsmalloc > > TODOLIST: > * arch_pgtable_helpers > @@ -50,4 +51,3 @@ TODOLIST: > * transhuge > * unevictable-lru > * vmalloced-kernel-stacks > -* zsmalloc > diff --git a/Documentation/translations/zh_CN/vm/zsmalloc.rst b/Documentation/translations/zh_CN/vm/zsmalloc.rst > new file mode 100644 > index 000000000000..29e9c70a8eb6 > --- /dev/null > +++ b/Documentation/translations/zh_CN/vm/zsmalloc.rst > @@ -0,0 +1,78 @@ > +:Original: Documentation/vm/zs_malloc.rst > + > +:翻译: > + > + 司延腾 Yanteng Si <siyanteng@xxxxxxxxxxx> > + > +:校译: > + > +======== > +zsmalloc > +======== > + > +这个分配器是为与zram一起使用而设计的。因此,该分配器应该在低内存条件下工作良好。特别是, > +它从未尝试过higher order页面的分配,这在内存压力下很可能会失败。另一方面,如果我们只 > +是使用单(0-order)页,它将遭受非常高的碎片化 - 任何大小为PAGE_SIZE/2或更大的对象将 > +占据整个页面。这是其前身(xvmalloc)的主要问题之一。 > + > +为了克服这些问题,zsmalloc分配了一堆0-order页面,并使用各种"struct page"字段将它 > +们链接起来。这些链接的页面作为一个单一的higher order页面,即一个对象可以跨越0-order > +页面的边界。代码将这些链接的页面作为一个实体,称为zspage。 > + > +为了简单起见,zsmalloc只能分配大小不超过PAGE_SIZE的对象,因为这满足了所有当前用户的 > +要求(在最坏的情况下,页面是不可压缩的,因此以"原样"即未压缩的形式存储)。对于大于这 > +个大小的分配请求,会返回失败(见zs_malloc)。 > + > +此外,zs_malloc()并不返回一个可重复引用的指针。相反,它返回一个不透明的句柄(无符号 > +长),它编码了被分配对象的实际位置。这种间接性的原因是zsmalloc并不保持zspages的永久 > +映射,因为这在32位系统上会导致问题,因为内核空间映射的VA区域非常小。因此,在使用分配 > +的内存之前,对象必须使用zs_map_object()进行映射以获得一个可用的指针,随后使用 > +zs_unmap_object()解除映射。 > + > +stat > +==== > + > +通过CONFIG_ZSMALLOC_STAT,我们可以通过 ``/sys/kernel/debug/zsmalloc/<user name>`` > +看到zsmalloc内部信息。下面是一个统计输出的例子。:: > + > + # cat /sys/kernel/debug/zsmalloc/zram0/classes > + > + class size almost_full almost_empty obj_allocated obj_used pages_used pages_per_zspage > + ... > + ... > + 9 176 0 1 186 129 8 4 > + 10 192 1 0 2880 2872 135 3 > + 11 208 0 1 819 795 42 2 > + 12 224 0 1 219 159 12 4 > + ... > + ... > + > + > +class > + 索引 > +size > + zspage存储对象大小 > +almost_empty > + ZS_ALMOST_EMPTY zspage的数量(见下文)。 > +almost_full > + ZS_ALMOST_FULL zspage的数量(见下图) > +obj_allocated > + 已分配对象的数量 > +obj_used > + 分配给用户的对象的数量 > +pages_used > + 为该类分配的页数 > +pages_per_zspage > + 组成一个zspage的0-order页面的数量 > + > +当n <= N / f时,我们将一个zspage分配给ZS_ALMOST_EMPTYfullness组,其中 > + > +* n = 已分配对象的数量 > +* N = zspage可以存储的对象总数 > +* f = fullness_threshold_frac(即,目前是4个) > + > +同样地,我们将zspage分配给: > + > +* ZS_ALMOST_FULL when n > N / f > +* ZS_EMPTY when n == 0 > +* ZS_FULL when n == N > -- > 2.27.0 >