€•[�Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ7/translations/zh_CN/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/zh_TW/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/it_IT/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ja_JP/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ko_KR/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/pt_BR/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/sp_SP/admin-guide/device-mapper/dm-pcache”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒQ/var/lib/git/docbuild/linux/Documentation/admin-guide/device-mapper/dm-pcache.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒdm-pcache — Persistent Cache”h]”hŒdm-pcache — Persistent Cache”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒ3*Author: Dongsheng Yang *”h]”hŒemphasis”“”)�”}”(hháh]”hŒ1Author: Dongsheng Yang ”…”�”}”(hhåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhhßubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)�”}”(hXThis document describes *dm-pcache*, a Device-Mapper target that lets a byte-addressable *DAX* (persistent-memory, “pmemâ€�) region act as a high-performance, crash-persistent cache in front of a slower block device. The code lives in `drivers/md/dm-pcache/`.”h]”(hŒThis document describes ”…”�”}”(hhøh²hh³Nh´Nubhä)�”}”(hŒ *dm-pcache*”h]”hŒ dm-pcache”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhhøubhŒ6, a Device-Mapper target that lets a byte-addressable ”…”�”}”(hhøh²hh³Nh´Nubhä)�”}”(hŒ*DAX*”h]”hŒDAX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhhøubhŒ� (persistent-memory, “pmemâ€�) region act as a high-performance, crash-persistent cache in front of a slower block device. The code lives in ”…”�”}”(hhøh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`drivers/md/dm-pcache/`”h]”hŒdrivers/md/dm-pcache/”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hhøubhŒ.”…”�”}”(hhøh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒQuick feature summary”h]”hŒQuick feature summary”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj>h²hh³hÇh´KubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ5*Write-back* caching (only mode currently supported).”h]”hÞ)�”}”(hjXh]”(hä)�”}”(hŒ *Write-back*”h]”hŒ Write-back”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjZubhŒ) caching (only mode currently supported).”…”�”}”(hjZh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´NubjU)�”}”(hŒ/*16 MiB segments* allocated on the pmem device.”h]”hÞ)�”}”(hj}h]”(hä)�”}”(hŒ*16 MiB segments*”h]”hŒ16 MiB segments”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjubhŒ allocated on the pmem device.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´NubjU)�”}”(hŒ0*Data CRC32* verification (optional, per cache).”h]”hÞ)�”}”(hj¢h]”(hä)�”}”(hŒ *Data CRC32*”h]”hŒ Data CRC32”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj¤ubhŒ$ verification (optional, per cache).”…”�”}”(hj¤h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´NubjU)�”}”(hŒzCrash-safe: every metadata structure is duplicated (`PCACHE_META_INDEX_MAX == 2`) and protected with CRC+sequence numbers.”h]”hÞ)�”}”(hŒzCrash-safe: every metadata structure is duplicated (`PCACHE_META_INDEX_MAX == 2`) and protected with CRC+sequence numbers.”h]”(hŒ4Crash-safe: every metadata structure is duplicated (”…”�”}”(hjÉh²hh³Nh´Nubj%)�”}”(hŒ`PCACHE_META_INDEX_MAX == 2`”h]”hŒPCACHE_META_INDEX_MAX == 2”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjÉubhŒ*) and protected with CRC+sequence numbers.”…”�”}”(hjÉh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´NubjU)�”}”(hŒ[*Multi-tree indexing* (indexing trees sharded by logical address) for high PMem parallelism”h]”hÞ)�”}”(hjñh]”(hä)�”}”(hŒ*Multi-tree indexing*”h]”hŒMulti-tree indexing”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjóubhŒF (indexing trees sharded by logical address) for high PMem parallelism”…”�”}”(hjóh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjïubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´NubjU)�”}”(hŒ0Pure *DAX path* I/O – no extra BIO round-trips”h]”hÞ)�”}”(hjh]”(hŒPure ”…”�”}”(hjh²hh³Nh´Nubhä)�”}”(hŒ *DAX path*”h]”hŒDAX path”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjubhŒ! I/O – no extra BIO round-trips”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´NubjU)�”}”(hŒF*Log-structured write-back* that preserves backend crash-consistency ”h]”hÞ)�”}”(hŒD*Log-structured write-back* that preserves backend crash-consistency”h]”(hä)�”}”(hŒ*Log-structured write-back*”h]”hŒLog-structured write-back”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjAubhŒ) that preserves backend crash-consistency”…”�”}”(hjAh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjQh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jOh³hÇh´Khj>h²hubeh}”(h]”Œquick-feature-summary”ah ]”h"]”Œquick feature summary”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Constructor”h]”hŒ Constructor”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjsh²hh³hÇh´KubhŒ literal_block”“”)�”}”(hŒnpcache [ ]”h]”hŒnpcache [ ]”…”�”}”hj†sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´K hjsh²hubhŒtable”“”)�”}”(hhh]”hŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jžhj›ubjŸ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K4uh1jžhj›ubhŒtbody”“”)�”}”(hhh]”(hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”hÞ)�”}”(hŒ ``cache_dev``”h]”hŒliteral”“”)�”}”(hjÅh]”hŒ cache_dev”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K#hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»ubj¿)�”}”(hhh]”hÞ)�”}”(hŒcAny DAX-capable block device (``/dev/pmem0``…). All metadata *and* cached blocks are stored here.”h]”(hŒAny DAX-capable block device (”…”�”}”(hjåh²hh³Nh´NubjÈ)�”}”(hŒ``/dev/pmem0``”h]”hŒ /dev/pmem0”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjåubhŒ…). All metadata ”…”�”}”(hjåh²hh³Nh´Nubhä)�”}”(hŒ*and*”h]”hŒand”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjåubhŒ cached blocks are stored here.”…”�”}”(hjåh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K#hjâubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj¶ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ``backing_dev``”h]”jÈ)�”}”(hj+h]”hŒ backing_dev”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K&hj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj#ubj¿)�”}”(hhh]”hÞ)�”}”(hŒ#The slow block device to be cached.”h]”hŒ#The slow block device to be cached.”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K&hjFubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj¶ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ``cache_mode``”h]”jÈ)�”}”(hjkh]”hŒ cache_mode”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K(hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjcubj¿)�”}”(hhh]”hÞ)�”}”(hŒ7Optional, Only ``writeback`` is accepted at the moment.”h]”(hŒOptional, Only ”…”�”}”(hj‰h²hh³Nh´NubjÈ)�”}”(hŒ ``writeback``”h]”hŒ writeback”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj‰ubhŒ is accepted at the moment.”…”�”}”(hj‰h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K(hj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjcubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj¶ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ ``data_crc``”h]”jÈ)�”}”(hj½h]”hŒdata_crc”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K+hj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjµubj¿)�”}”(hhh]”(hÞ)�”}”(hŒOptional, default to ``false``”h]”(hŒOptional, default to ”…”�”}”(hjÛh²hh³Nh´NubjÈ)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjÛubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K+hjØubjP)�”}”(hhh]”(jU)�”}”(hŒD``true`` – store CRC32 for every cached entry and verify on reads”h]”hÞ)�”}”(hŒD``true`` – store CRC32 for every cached entry and verify on reads”h]”(jÈ)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjþubhŒ< – store CRC32 for every cached entry and verify on reads”…”�”}”(hjþh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K-hjúubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj÷ubjU)�”}”(hŒ``false`` – skip CRC (faster)”h]”hÞ)�”}”(hj"h]”(jÈ)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj$ubhŒ – skip CRC (faster)”…”�”}”(hj$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K/hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj÷ubeh}”(h]”h ]”h"]”h$]”h&]”jijjuh1jOh³hÇh´K-hjØubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjµubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj¶ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j´hj›ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j™hj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjsh²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒExample”h]”hŒExample”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjjh²hh³hÇh´K3ubj…)�”}”(hŒ†dmsetup create pcache_sdb --table \ "0 $(blockdev --getsz /dev/sdb) pcache /dev/pmem0 /dev/sdb 4 cache_mode writeback data_crc true"”h]”hŒ†dmsetup create pcache_sdb --table \ "0 $(blockdev --getsz /dev/sdb) pcache /dev/pmem0 /dev/sdb 4 cache_mode writeback data_crc true"”…”�”}”hj{sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œshell”Œhighlight_args”}”uh1j„h³hÇh´K5hjjh²hubhÞ)�”}”(hŒiThe first time a pmem device is used, dm-pcache formats it automatically (super-block, cache_info, etc.).”h]”hŒiThe first time a pmem device is used, dm-pcache formats it automatically (super-block, cache_info, etc.).”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K:hjjh²hubeh}”(h]”Œexample”ah ]”h"]”Œexample”ah$]”h&]”uh1hÈhjsh²hh³hÇh´K3ubeh}”(h]”Œ constructor”ah ]”h"]”Œ constructor”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Status line”h]”hŒ Status line”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¬h²hh³hÇh´K?ubhÞ)�”}”(hŒ9``dmsetup status `` (``STATUSTYPE_INFO``) prints:”h]”(jÈ)�”}”(hŒ``dmsetup status ``”h]”hŒdmsetup status ”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj½ubhŒ (”…”�”}”(hj½h²hh³Nh´NubjÈ)�”}”(hŒ``STATUSTYPE_INFO``”h]”hŒSTATUSTYPE_INFO”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj½ubhŒ ) prints:”…”�”}”(hj½h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KAhj¬h²hubj…)�”}”(hŒ° \ \ : \ : \ :”h]”hŒ° \ \ : \ : \ :”…”�”}”hjësbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´KEhj¬h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒField meanings”h]”hŒField meanings”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjùh²hh³hÇh´KLubj•)�”}”(hhh]”jš)�”}”(hhh]”(jŸ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jžhj ubjŸ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K-uh1jžhj ubjµ)�”}”(hhh]”(jº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ ``sb_flags``”h]”jÈ)�”}”(hj/h]”hŒsb_flags”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KOhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj'ubj¿)�”}”(hhh]”hÞ)�”}”(hŒ'Super-block flags (e.g. endian marker).”h]”hŒ'Super-block flags (e.g. endian marker).”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KOhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ ``seg_total``”h]”jÈ)�”}”(hjoh]”hŒ seg_total”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjmubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KQhjjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjgubj¿)�”}”(hhh]”hÞ)�”}”(hŒ#Number of physical *pmem* segments.”h]”(hŒNumber of physical ”…”�”}”(hj�h²hh³Nh´Nubhä)�”}”(hŒ*pmem*”h]”hŒpmem”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj�ubhŒ segments.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KQhjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjgubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ``cache_segs``”h]”jÈ)�”}”(hjÁh]”hŒ cache_segs”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KShj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¹ubj¿)�”}”(hhh]”hÞ)�”}”(hŒ"Number of segments used for cache.”h]”hŒ"Number of segments used for cache.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KShjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ ``segs_used``”h]”jÈ)�”}”(hjh]”hŒ segs_used”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KUhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjùubj¿)�”}”(hhh]”hÞ)�”}”(hŒ-Segments currently allocated (bitmap weight).”h]”hŒ-Segments currently allocated (bitmap weight).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KUhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjùubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ``gc_percent``”h]”jÈ)�”}”(hjAh]”hŒ gc_percent”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KWhj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj9ubj¿)�”}”(hhh]”hÞ)�”}”(hŒ"Current GC high-water mark (0-90).”h]”hŒ"Current GC high-water mark (0-90).”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KWhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ``cache_flags``”h]”jÈ)�”}”(hj�h]”hŒ cache_flags”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KYhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjyubj¿)�”}”(hhh]”hÞ)�”}”(hŒeBit 0 – DATA_CRC enabled Bit 1 – INIT_DONE (cache initialised) Bits 2-5 – cache mode (0 == WB).”h]”hŒeBit 0 – DATA_CRC enabled Bit 1 – INIT_DONE (cache initialised) Bits 2-5 – cache mode (0 == WB).”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KYhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ ``key_head``”h]”jÈ)�”}”(hjÁh]”hŒkey_head”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K]hj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¹ubj¿)�”}”(hhh]”hÞ)�”}”(hŒ%Where new key-sets are being written.”h]”hŒ%Where new key-sets are being written.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K]hjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ``dirty_tail``”h]”jÈ)�”}”(hjh]”hŒ dirty_tail”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K_hjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjùubj¿)�”}”(hhh]”hÞ)�”}”(hŒFFirst dirty key-set that still needs write-back to the backing device.”h]”hŒFFirst dirty key-set that still needs write-back to the backing device.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K_hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjùubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ ``key_tail``”h]”jÈ)�”}”(hjAh]”hŒkey_tail”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kbhj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj9ubj¿)�”}”(hhh]”hÞ)�”}”(hŒ*First key-set that may be reclaimed by GC.”h]”hŒ*First key-set that may be reclaimed by GC.”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kbhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j´hj ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j™hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjùh²hh³hÇh´Nubeh}”(h]”Œfield-meanings”ah ]”h"]”Œfield meanings”ah$]”h&]”uh1hÈhj¬h²hh³hÇh´KLubeh}”(h]”Œ status-line”ah ]”h"]”Œ status line”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K?ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMessages”h]”hŒMessages”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjœh²hh³hÇh´KgubhÞ)�”}”(hŒ*Change GC trigger*”h]”hä)�”}”(hj¯h]”hŒChange GC trigger”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kihjœh²hubj…)�”}”(hŒ)dmsetup message 0 gc_percent <0-90>”h]”hŒ)dmsetup message 0 gc_percent <0-90>”…”�”}”hjÄsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´Kmhjœh²hubeh}”(h]”Œmessages”ah ]”h"]”Œmessages”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KgubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒTheory of operation”h]”hŒTheory of operation”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÚh²hh³hÇh´KqubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Sub-devices”h]”hŒ Sub-devices”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjëh²hh³hÇh´Ktubj•)�”}”(hhh]”jš)�”}”(hhh]”(jŸ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jžhjÿubjŸ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K9uh1jžhjÿubjµ)�”}”(hhh]”(jº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ backing_dev”h]”hŒ backing_dev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kwhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubj¿)�”}”(hhh]”hÞ)�”}”(hŒ*Any block device (SSD/HDD/loop/LVM, etc.).”h]”hŒ*Any block device (SSD/HDD/loop/LVM, etc.).”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kwhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjubjº)�”}”(hhh]”(j¿)�”}”(hhh]”hÞ)�”}”(hŒ cache_dev”h]”hŒ cache_dev”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KxhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjPubj¿)�”}”(hhh]”hÞ)�”}”(hŒ-DAX device; must expose direct-access memory.”h]”hŒ-DAX device; must expose direct-access memory.”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kxhjjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjPubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¹hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j´hjÿubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j™hjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjëh²hh³hÇh´Nubeh}”(h]”Œ sub-devices”ah ]”h"]”Œ sub-devices”ah$]”h&]”uh1hÈhjÚh²hh³hÇh´KtubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSegments and key-sets”h]”hŒSegments and key-sets”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¢h²hh³hÇh´K|ubjP)�”}”(hhh]”(jU)�”}”(hŒ1The pmem space is divided into *16 MiB segments*.”h]”hÞ)�”}”(hj¸h]”(hŒThe pmem space is divided into ”…”�”}”(hjºh²hh³Nh´Nubhä)�”}”(hŒ*16 MiB segments*”h]”hŒ16 MiB segments”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjºubhŒ.”…”�”}”(hjºh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K~hj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj³h²hh³hÇh´NubjU)�”}”(hŒGEach write allocates space from a per-CPU *data_head* inside a segment.”h]”hÞ)�”}”(hjáh]”(hŒ*Each write allocates space from a per-CPU ”…”�”}”(hjãh²hh³Nh´Nubhä)�”}”(hŒ *data_head*”h]”hŒ data_head”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjãubhŒ inside a segment.”…”�”}”(hjãh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjßubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj³h²hh³hÇh´NubjU)�”}”(hŒsA *cache-key* records a logical range on the origin and where it lives inside pmem (segment + offset + generation).”h]”hÞ)�”}”(hŒsA *cache-key* records a logical range on the origin and where it lives inside pmem (segment + offset + generation).”h]”(hŒA ”…”�”}”(hj h²hh³Nh´Nubhä)�”}”(hŒ *cache-key*”h]”hŒ cache-key”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj ubhŒf records a logical range on the origin and where it lives inside pmem (segment + offset + generation).”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K€hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj³h²hh³hÇh´NubjU)�”}”(hŒm128 keys form a *key-set* (kset); ksets are written sequentially in pmem and are themselves crash-safe (CRC).”h]”hÞ)�”}”(hŒm128 keys form a *key-set* (kset); ksets are written sequentially in pmem and are themselves crash-safe (CRC).”h]”(hŒ128 keys form a ”…”�”}”(hj6 h²hh³Nh´Nubhä)�”}”(hŒ *key-set*”h]”hŒkey-set”…”�”}”(hj> h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj6 ubhŒT (kset); ksets are written sequentially in pmem and are themselves crash-safe (CRC).”…”�”}”(hj6 h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‚hj2 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj³h²hh³hÇh´NubjU)�”}”(hŒKThe pair *(key_tail, dirty_tail)* delimit clean/dirty and live/dead ksets. ”h]”hÞ)�”}”(hŒJThe pair *(key_tail, dirty_tail)* delimit clean/dirty and live/dead ksets.”h]”(hŒ The pair ”…”�”}”(hj` h²hh³Nh´Nubhä)�”}”(hŒ*(key_tail, dirty_tail)*”h]”hŒ(key_tail, dirty_tail)”…”�”}”(hjh h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj` ubhŒ) delimit clean/dirty and live/dead ksets.”…”�”}”(hj` h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K„hj\ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj³h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jijjuh1jOh³hÇh´K~hj¢h²hubeh}”(h]”Œsegments-and-key-sets”ah ]”h"]”Œsegments and key-sets”ah$]”h&]”uh1hÈhjÚh²hh³hÇh´K|ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Write-back”h]”hŒ Write-back”…”�”}”(hj— h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj” h²hh³hÇh´K‡ubhÞ)�”}”(hŒÁDirty keys are queued into a tree; a background worker copies data back to the backing_dev and advances *dirty_tail*. A FLUSH/FUA bio from the upper layers forces an immediate metadata commit.”h]”(hŒhDirty keys are queued into a tree; a background worker copies data back to the backing_dev and advances ”…”�”}”(hj¥ h²hh³Nh´Nubhä)�”}”(hŒ *dirty_tail*”h]”hŒ dirty_tail”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj¥ ubhŒM. A FLUSH/FUA bio from the upper layers forces an immediate metadata commit.”…”�”}”(hj¥ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‰hj” h²hubeh}”(h]”Œ write-back”ah ]”h"]”Œ write-back”ah$]”h&]”uh1hÈhjÚh²hh³hÇh´K‡ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒGarbage collection”h]”hŒGarbage collection”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÍ h²hh³hÇh´KŽubhÞ)�”}”(hŒ¦GC starts when ``segs_used >= seg_total * gc_percent / 100``. It walks from *key_tail*, frees segments whose every key has been invalidated, and advances *key_tail*.”h]”(hŒGC starts when ”…”�”}”(hjÞ h²hh³Nh´NubjÈ)�”}”(hŒ-``segs_used >= seg_total * gc_percent / 100``”h]”hŒ)segs_used >= seg_total * gc_percent / 100”…”�”}”(hjæ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjÞ ubhŒ. It walks from ”…”�”}”(hjÞ h²hh³Nh´Nubhä)�”}”(hŒ *key_tail*”h]”hŒkey_tail”…”�”}”(hjø h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjÞ ubhŒD, frees segments whose every key has been invalidated, and advances ”…”�”}”(hjÞ h²hh³Nh´Nubhä)�”}”(hŒ *key_tail*”h]”hŒkey_tail”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjÞ ubhŒ.”…”�”}”(hjÞ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hjÍ h²hubeh}”(h]”Œgarbage-collection”ah ]”h"]”Œgarbage collection”ah$]”h&]”uh1hÈhjÚh²hh³hÇh´KŽubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCRC verification”h]”hŒCRC verification”…”�”}”(hj- h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj* h²hh³hÇh´K•ubhÞ)�”}”(hŒ¿If ``data_crc is enabled`` dm-pcache computes a CRC32 over every cached data range when it is inserted and stores it in the on-media key. Reads validate the CRC before copying to the caller.”h]”(hŒIf ”…”�”}”(hj; h²hh³Nh´NubjÈ)�”}”(hŒ``data_crc is enabled``”h]”hŒdata_crc is enabled”…”�”}”(hjC h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj; ubhŒ¥ dm-pcache computes a CRC32 over every cached data range when it is inserted and stores it in the on-media key. Reads validate the CRC before copying to the caller.”…”�”}”(hj; h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K—hj* h²hubeh}”(h]”Œcrc-verification”ah ]”h"]”Œcrc verification”ah$]”h&]”uh1hÈhjÚh²hh³hÇh´K•ubeh}”(h]”Œtheory-of-operation”ah ]”h"]”Œtheory of operation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KqubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒFailure handling”h]”hŒFailure handling”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjk h²hh³hÇh´K�ubjP)�”}”(hhh]”(jU)�”}”(hŒ‡*pmem media errors* – all metadata copies are read with ``copy_mc_to_kernel``; an uncorrectable error logs and aborts initialisation.”h]”hÞ)�”}”(hŒ‡*pmem media errors* – all metadata copies are read with ``copy_mc_to_kernel``; an uncorrectable error logs and aborts initialisation.”h]”(hä)�”}”(hŒ*pmem media errors*”h]”hŒpmem media errors”…”�”}”(hj‡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjƒ ubhŒ' – all metadata copies are read with ”…”�”}”(hjƒ h²hh³Nh´NubjÈ)�”}”(hŒ``copy_mc_to_kernel``”h]”hŒcopy_mc_to_kernel”…”�”}”(hj™ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjƒ ubhŒ8; an uncorrectable error logs and aborts initialisation.”…”�”}”(hjƒ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŸhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj| h²hh³hÇh´NubjU)�”}”(hŒ|*Cache full* – if no free segment can be found, writes return ``-EBUSY``; dm-pcache retries internally (request deferral).”h]”hÞ)�”}”(hŒ|*Cache full* – if no free segment can be found, writes return ``-EBUSY``; dm-pcache retries internally (request deferral).”h]”(hä)�”}”(hŒ *Cache full*”h]”hŒ Cache full”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj» ubhŒ4 – if no free segment can be found, writes return ”…”�”}”(hj» h²hh³Nh´NubjÈ)�”}”(hŒ ``-EBUSY``”h]”hŒ-EBUSY”…”�”}”(hjÑ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj» ubhŒ2; dm-pcache retries internally (request deferral).”…”�”}”(hj» h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¡hj· ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj| h²hh³hÇh´NubjU)�”}”(hŒ§*System crash* – on attach, the driver replays ksets from *key_tail* to rebuild the in-core trees; every segment’s generation guards against use-after-free keys. ”h]”hÞ)�”}”(hŒ¥*System crash* – on attach, the driver replays ksets from *key_tail* to rebuild the in-core trees; every segment’s generation guards against use-after-free keys.”h]”(hä)�”}”(hŒ*System crash*”h]”hŒ System crash”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjó ubhŒ. – on attach, the driver replays ksets from ”…”�”}”(hjó h²hh³Nh´Nubhä)�”}”(hŒ *key_tail*”h]”hŒkey_tail”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjó ubhŒ_ to rebuild the in-core trees; every segment’s generation guards against use-after-free keys.”…”�”}”(hjó h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K£hjï ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThj| h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jijjuh1jOh³hÇh´KŸhjk h²hubeh}”(h]”Œfailure-handling”ah ]”h"]”Œfailure handling”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K�ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒLimitations & TODO”h]”hŒLimitations & TODO”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj5 h²hh³hÇh´K©ubjP)�”}”(hhh]”(jU)�”}”(hŒ,Only *write-back* mode; other modes planned.”h]”hÞ)�”}”(hjK h]”(hŒOnly ”…”�”}”(hjM h²hh³Nh´Nubhä)�”}”(hŒ *write-back*”h]”hŒ write-back”…”�”}”(hjT h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjM ubhŒ mode; other modes planned.”…”�”}”(hjM h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K«hjI ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjF h²hh³hÇh´NubjU)�”}”(hŒ8Only FIFO cache invalidate; other (LRU, ARC...) planned.”h]”hÞ)�”}”(hjt h]”hŒ8Only FIFO cache invalidate; other (LRU, ARC...) planned.”…”�”}”(hjv h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¬hjr ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjF h²hh³hÇh´NubjU)�”}”(hŒ(Table reload is not supported currently.”h]”hÞ)�”}”(hj‹ h]”hŒ(Table reload is not supported currently.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K­hj‰ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjF h²hh³hÇh´NubjU)�”}”(hŒDiscard planned. ”h]”hÞ)�”}”(hŒDiscard planned.”h]”hŒDiscard planned.”…”�”}”(hj¤ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K®hj  ubah}”(h]”h ]”h"]”h$]”h&]”uh1jThjF h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jijjuh1jOh³hÇh´K«hj5 h²hubeh}”(h]”Œlimitations-todo”ah ]”h"]”Œlimitations & todo”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K©ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒExample workflow”h]”hŒExample workflow”…”�”}”(hjÉ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÆ h²hh³hÇh´K²ubj…)�”}”(hX»# 1. Create devices dmsetup create pcache_sdb --table \ "0 $(blockdev --getsz /dev/sdb) pcache /dev/pmem0 /dev/sdb 4 cache_mode writeback data_crc true" # 2. Put a filesystem on top mkfs.ext4 /dev/mapper/pcache_sdb mount /dev/mapper/pcache_sdb /mnt # 3. Tune GC threshold to 80 % dmsetup message pcache_sdb 0 gc_percent 80 # 4. Observe status watch -n1 'dmsetup status pcache_sdb' # 5. Shutdown umount /mnt dmsetup remove pcache_sdb”h]”hX»# 1. Create devices dmsetup create pcache_sdb --table \ "0 $(blockdev --getsz /dev/sdb) pcache /dev/pmem0 /dev/sdb 4 cache_mode writeback data_crc true" # 2. Put a filesystem on top mkfs.ext4 /dev/mapper/pcache_sdb mount /dev/mapper/pcache_sdb /mnt # 3. Tune GC threshold to 80 % dmsetup message pcache_sdb 0 gc_percent 80 # 4. Observe status watch -n1 'dmsetup status pcache_sdb' # 5. Shutdown umount /mnt dmsetup remove pcache_sdb”…”�”}”hj× sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj‰‰jŠŒshell”jŒ}”uh1j„h³hÇh´K´hjÆ h²hubhÞ)�”}”(hŒ^``dm-pcache`` is under active development; feedback, bug reports and patches are very welcome!”h]”(jÈ)�”}”(hŒ ``dm-pcache``”h]”hŒ dm-pcache”…”�”}”(hjë h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhjç ubhŒQ is under active development; feedback, bug reports and patches are very welcome!”…”�”}”(hjç h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÉhjÆ h²hubeh}”(h]”Œexample-workflow”ah ]”h"]”Œexample workflow”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K²ubeh}”(h]”Œdm-pcache-persistent-cache”ah ]”h"]”Œdm-pcache — persistent cache”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”j¾Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j5 Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j j jpjmj©j¦j¡jžj™j–j‘jŽj×jÔjh je jŸjœj‘ jŽ jÊ jÇ j' j$ j` j] j2 j/ jà jÀ j j uŒ nametypes”}”(j ‰jp‰j©‰j¡‰j™‰j‘‰j׉jh ‰jŸ‰j‘ ‰jÊ ‰j' ‰j` ‰j2 ‰jà ‰j ‰uh}”(j hÊjmj>j¦jsjžjjj–j¬jŽjùjÔjœje jÚjœjëjŽ j¢jÇ j” j$ jÍ j] j* j/ jk jÀ j5 j jÆ uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.