:Original: Documentation/mm/zsmalloc.rst :翻译: å¸å»¶è…¾ Yanteng Si <siyanteng@loongson.cn> :æ ¡è¯‘: ======== 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