The patch titled Subject: docs: rename Documentation/vm to Documentation/mm has been added to the -mm mm-unstable branch. Its filename is docs-rename-documentation-vm-to-documentation-mm.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/docs-rename-documentation-vm-to-documentation-mm.patch This patch will later appear in the mm-unstable branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: Mike Rapoport <rppt@xxxxxxxxxxxxx> Subject: docs: rename Documentation/vm to Documentation/mm Date: Sun, 26 Jun 2022 05:13:52 -0500 So it will be consistent with code mm directory and with Documentation/admin-guide/mm and won't be confused with virtual machines. Link: https://lkml.kernel.org/r/20220626101352.109601-1-rppt@xxxxxxxxxx Signed-off-by: Mike Rapoport <rppt@xxxxxxxxxxxxx> Suggested-by: Matthew Wilcox <willy@xxxxxxxxxxxxx> Tested-by: Ira Weiny <ira.weiny@xxxxxxxxx> Acked-by: Jonathan Corbet <corbet@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- Documentation/ABI/testing/sysfs-kernel-mm-ksm | 2 Documentation/ABI/testing/sysfs-kernel-slab | 4 Documentation/admin-guide/kernel-parameters.txt | 10 Documentation/admin-guide/mm/concepts.rst | 2 Documentation/admin-guide/mm/damon/index.rst | 2 Documentation/admin-guide/mm/damon/reclaim.rst | 2 Documentation/admin-guide/mm/damon/usage.rst | 8 Documentation/admin-guide/sysctl/vm.rst | 2 Documentation/core-api/index.rst | 2 Documentation/filesystems/proc.rst | 2 Documentation/index.rst | 2 Documentation/mm/memory-model.rst | 177 ++++ Documentation/translations/zh_CN/admin-guide/mm/damon/index.rst | 2 Documentation/translations/zh_CN/admin-guide/mm/damon/reclaim.rst | 2 Documentation/translations/zh_CN/admin-guide/mm/damon/usage.rst | 8 Documentation/translations/zh_CN/core-api/index.rst | 2 Documentation/translations/zh_CN/index.rst | 2 Documentation/translations/zh_CN/mm/active_mm.rst | 85 + Documentation/translations/zh_CN/mm/balance.rst | 81 + Documentation/translations/zh_CN/mm/damon/api.rst | 32 Documentation/translations/zh_CN/mm/damon/design.rst | 140 +++ Documentation/translations/zh_CN/mm/damon/faq.rst | 48 + Documentation/translations/zh_CN/mm/damon/index.rst | 32 Documentation/translations/zh_CN/mm/free_page_reporting.rst | 38 Documentation/translations/zh_CN/mm/frontswap.rst | 196 ++++ Documentation/translations/zh_CN/mm/highmem.rst | 128 ++ Documentation/translations/zh_CN/mm/hmm.rst | 361 ++++++++ Documentation/translations/zh_CN/mm/hugetlbfs_reserv.rst | 436 ++++++++++ Documentation/translations/zh_CN/mm/hwpoison.rst | 166 +++ Documentation/translations/zh_CN/mm/index.rst | 54 + Documentation/translations/zh_CN/mm/ksm.rst | 70 + Documentation/translations/zh_CN/mm/memory-model.rst | 135 +++ Documentation/translations/zh_CN/mm/mmu_notifier.rst | 97 ++ Documentation/translations/zh_CN/mm/numa.rst | 101 ++ Documentation/translations/zh_CN/mm/overcommit-accounting.rst | 86 + Documentation/translations/zh_CN/mm/page_frags.rst | 38 Documentation/translations/zh_CN/mm/page_owner.rst | 116 ++ Documentation/translations/zh_CN/mm/page_table_check.rst | 56 + Documentation/translations/zh_CN/mm/remap_file_pages.rst | 32 Documentation/translations/zh_CN/mm/split_page_table_lock.rst | 96 ++ Documentation/translations/zh_CN/mm/z3fold.rst | 31 Documentation/translations/zh_CN/mm/zsmalloc.rst | 78 + Documentation/translations/zh_CN/vm/active_mm.rst | 85 - Documentation/translations/zh_CN/vm/balance.rst | 81 - Documentation/translations/zh_CN/vm/damon/api.rst | 32 Documentation/translations/zh_CN/vm/damon/design.rst | 140 --- Documentation/translations/zh_CN/vm/damon/faq.rst | 48 - Documentation/translations/zh_CN/vm/damon/index.rst | 33 Documentation/translations/zh_CN/vm/free_page_reporting.rst | 38 Documentation/translations/zh_CN/vm/frontswap.rst | 196 ---- Documentation/translations/zh_CN/vm/highmem.rst | 128 -- Documentation/translations/zh_CN/vm/hmm.rst | 361 -------- Documentation/translations/zh_CN/vm/hugetlbfs_reserv.rst | 436 ---------- Documentation/translations/zh_CN/vm/hwpoison.rst | 166 --- Documentation/translations/zh_CN/vm/index.rst | 54 - Documentation/translations/zh_CN/vm/ksm.rst | 70 - Documentation/translations/zh_CN/vm/memory-model.rst | 135 --- Documentation/translations/zh_CN/vm/mmu_notifier.rst | 97 -- Documentation/translations/zh_CN/vm/numa.rst | 101 -- Documentation/translations/zh_CN/vm/overcommit-accounting.rst | 86 - Documentation/translations/zh_CN/vm/page_frags.rst | 38 Documentation/translations/zh_CN/vm/page_owner.rst | 116 -- Documentation/translations/zh_CN/vm/page_table_check.rst | 56 - Documentation/translations/zh_CN/vm/remap_file_pages.rst | 32 Documentation/translations/zh_CN/vm/split_page_table_lock.rst | 96 -- Documentation/translations/zh_CN/vm/z3fold.rst | 31 Documentation/translations/zh_CN/vm/zsmalloc.rst | 78 - Documentation/translations/zh_TW/index.rst | 2 Documentation/vm/.gitignore | 3 Documentation/vm/memory-model.rst | 177 ---- MAINTAINERS | 12 arch/loongarch/Kconfig | 2 arch/powerpc/include/asm/book3s/64/pgtable.h | 2 include/linux/hmm.h | 4 include/linux/memremap.h | 2 include/linux/mmu_notifier.h | 2 include/linux/sched/mm.h | 4 include/linux/swap.h | 2 mm/Kconfig | 2 mm/debug_vm_pgtable.c | 2 mm/frontswap.c | 2 mm/huge_memory.c | 2 mm/hugetlb.c | 6 mm/hugetlb_vmemmap.c | 2 mm/ksm.c | 4 mm/mmap.c | 2 mm/rmap.c | 8 mm/sparse-vmemmap.c | 2 mm/util.c | 2 tools/vm/page_owner_sort.c | 2 90 files changed, 2971 insertions(+), 2975 deletions(-) --- a/arch/loongarch/Kconfig~docs-rename-documentation-vm-to-documentation-mm +++ a/arch/loongarch/Kconfig @@ -410,7 +410,7 @@ config ARCH_SPARSEMEM_ENABLE Say Y to support efficient handling of sparse physical memory, for architectures which are either NUMA (Non-Uniform Memory Access) or have huge holes in the physical address space for other reasons. - See <file:Documentation/vm/numa.rst> for more. + See <file:Documentation/mm/numa.rst> for more. config ARCH_ENABLE_THP_MIGRATION def_bool y --- a/arch/powerpc/include/asm/book3s/64/pgtable.h~docs-rename-documentation-vm-to-documentation-mm +++ a/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -1273,7 +1273,7 @@ static inline void pmdp_set_wrprotect(st * should return true. * We should not call this on a hugetlb entry. We should check for HugeTLB * entry using vma->vm_flags - * The page table walk rule is explained in Documentation/vm/transhuge.rst + * The page table walk rule is explained in Documentation/mm/transhuge.rst */ static inline int pmd_trans_huge(pmd_t pmd) { --- a/Documentation/ABI/testing/sysfs-kernel-mm-ksm~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/ABI/testing/sysfs-kernel-mm-ksm @@ -41,7 +41,7 @@ Description: Kernel Samepage Merging dae sleep_millisecs: how many milliseconds ksm should sleep between scans. - See Documentation/vm/ksm.rst for more information. + See Documentation/mm/ksm.rst for more information. What: /sys/kernel/mm/ksm/merge_across_nodes Date: January 2013 --- a/Documentation/ABI/testing/sysfs-kernel-slab~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/ABI/testing/sysfs-kernel-slab @@ -37,7 +37,7 @@ Description: The alloc_calls file is read-only and lists the kernel code locations from which allocations for this cache were performed. The alloc_calls file only contains information if debugging is - enabled for that cache (see Documentation/vm/slub.rst). + enabled for that cache (see Documentation/mm/slub.rst). What: /sys/kernel/slab/<cache>/alloc_fastpath Date: February 2008 @@ -219,7 +219,7 @@ Contact: Pekka Enberg <penberg@cs.helsin Description: The free_calls file is read-only and lists the locations of object frees if slab debugging is enabled (see - Documentation/vm/slub.rst). + Documentation/mm/slub.rst). What: /sys/kernel/slab/<cache>/free_fastpath Date: February 2008 --- a/Documentation/admin-guide/kernel-parameters.txt~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/admin-guide/kernel-parameters.txt @@ -5407,7 +5407,7 @@ cache (risks via metadata attacks are mostly unchanged). Debug options disable merging on their own. - For more information see Documentation/vm/slub.rst. + For more information see Documentation/mm/slub.rst. slab_max_order= [MM, SLAB] Determines the maximum allowed order for slabs. @@ -5421,13 +5421,13 @@ slub_debug can create guard zones around objects and may poison objects when not in use. Also tracks the last alloc / free. For more information see - Documentation/vm/slub.rst. + Documentation/mm/slub.rst. slub_max_order= [MM, SLUB] Determines the maximum allowed order for slabs. A high setting may cause OOMs due to memory fragmentation. For more information see - Documentation/vm/slub.rst. + Documentation/mm/slub.rst. slub_min_objects= [MM, SLUB] The minimum number of objects per slab. SLUB will @@ -5436,12 +5436,12 @@ the number of objects indicated. The higher the number of objects the smaller the overhead of tracking slabs and the less frequently locks need to be acquired. - For more information see Documentation/vm/slub.rst. + For more information see Documentation/mm/slub.rst. slub_min_order= [MM, SLUB] Determines the minimum page order for slabs. Must be lower than slub_max_order. - For more information see Documentation/vm/slub.rst. + For more information see Documentation/mm/slub.rst. slub_merge [MM, SLUB] Same with slab_merge. --- a/Documentation/admin-guide/mm/concepts.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/admin-guide/mm/concepts.rst @@ -125,7 +125,7 @@ processor. Each bank is referred to as a constructs an independent memory management subsystem. A node has its own set of zones, lists of free and used pages and various statistics counters. You can find more details about NUMA in -:ref:`Documentation/vm/numa.rst <numa>` and in +:ref:`Documentation/mm/numa.rst <numa>` and in :ref:`Documentation/admin-guide/mm/numa_memory_policy.rst <numa_memory_policy>`. Page cache --- a/Documentation/admin-guide/mm/damon/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/admin-guide/mm/damon/index.rst @@ -4,7 +4,7 @@ Monitoring Data Accesses ======================== -:doc:`DAMON </vm/damon/index>` allows light-weight data access monitoring. +:doc:`DAMON </mm/damon/index>` allows light-weight data access monitoring. Using DAMON, users can analyze the memory access patterns of their systems and optimize those. --- a/Documentation/admin-guide/mm/damon/reclaim.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/admin-guide/mm/damon/reclaim.rst @@ -262,4 +262,4 @@ granularity reclamation. :: .. [1] https://research.google/pubs/pub48551/ .. [2] https://lwn.net/Articles/787611/ -.. [3] https://www.kernel.org/doc/html/latest/vm/free_page_reporting.html +.. [3] https://www.kernel.org/doc/html/latest/mm/free_page_reporting.html --- a/Documentation/admin-guide/mm/damon/usage.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/admin-guide/mm/damon/usage.rst @@ -30,11 +30,11 @@ DAMON provides below interfaces for diff <sysfs_interface>`. This will be removed after next LTS kernel is released, so users should move to the :ref:`sysfs interface <sysfs_interface>`. - *Kernel Space Programming Interface.* - :doc:`This </vm/damon/api>` is for kernel space programmers. Using this, + :doc:`This </mm/damon/api>` is for kernel space programmers. Using this, users can utilize every feature of DAMON most flexibly and efficiently by writing kernel space DAMON application programs for you. You can even extend DAMON for various address spaces. For detail, please refer to the interface - :doc:`document </vm/damon/api>`. + :doc:`document </mm/damon/api>`. .. _sysfs_interface: @@ -185,7 +185,7 @@ controls the monitoring overhead, exist. writing to and rading from the files. For more details about the intervals and monitoring regions range, please refer -to the Design document (:doc:`/vm/damon/design`). +to the Design document (:doc:`/mm/damon/design`). contexts/<N>/targets/ --------------------- @@ -404,7 +404,7 @@ Attributes Users can get and set the ``sampling interval``, ``aggregation interval``, ``update interval``, and min/max number of monitoring target regions by reading from and writing to the ``attrs`` file. To know about the monitoring -attributes in detail, please refer to the :doc:`/vm/damon/design`. For +attributes in detail, please refer to the :doc:`/mm/damon/design`. For example, below commands set those values to 5 ms, 100 ms, 1,000 ms, 10 and 1000, and then check it again:: --- a/Documentation/admin-guide/sysctl/vm.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/admin-guide/sysctl/vm.rst @@ -759,7 +759,7 @@ and don't use much of it. The default value is 0. -See Documentation/vm/overcommit-accounting.rst and +See Documentation/mm/overcommit-accounting.rst and mm/util.c::__vm_enough_memory() for more information. --- a/Documentation/core-api/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/core-api/index.rst @@ -88,7 +88,7 @@ Memory management ================= How to allocate and use memory in the kernel. Note that there is a lot -more memory-management documentation in Documentation/vm/index.rst. +more memory-management documentation in Documentation/mm/index.rst. .. toctree:: :maxdepth: 1 --- a/Documentation/filesystems/proc.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/filesystems/proc.rst @@ -1114,7 +1114,7 @@ CommitLimit yield a CommitLimit of 7.3G. For more details, see the memory overcommit documentation - in vm/overcommit-accounting. + in mm/overcommit-accounting. Committed_AS The amount of memory presently allocated on the system. The committed memory is a sum of all of the memory which --- a/Documentation/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/index.rst @@ -128,7 +128,7 @@ needed). sound/index crypto/index filesystems/index - vm/index + mm/index bpf/index usb/index PCI/index --- /dev/null +++ a/Documentation/mm/memory-model.rst @@ -0,0 +1,177 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. _physical_memory_model: + +===================== +Physical Memory Model +===================== + +Physical memory in a system may be addressed in different ways. The +simplest case is when the physical memory starts at address 0 and +spans a contiguous range up to the maximal address. It could be, +however, that this range contains small holes that are not accessible +for the CPU. Then there could be several contiguous ranges at +completely distinct addresses. And, don't forget about NUMA, where +different memory banks are attached to different CPUs. + +Linux abstracts this diversity using one of the two memory models: +FLATMEM and SPARSEMEM. Each architecture defines what +memory models it supports, what the default memory model is and +whether it is possible to manually override that default. + +All the memory models track the status of physical page frames using +struct page arranged in one or more arrays. + +Regardless of the selected memory model, there exists one-to-one +mapping between the physical page frame number (PFN) and the +corresponding `struct page`. + +Each memory model defines :c:func:`pfn_to_page` and :c:func:`page_to_pfn` +helpers that allow the conversion from PFN to `struct page` and vice +versa. + +FLATMEM +======= + +The simplest memory model is FLATMEM. This model is suitable for +non-NUMA systems with contiguous, or mostly contiguous, physical +memory. + +In the FLATMEM memory model, there is a global `mem_map` array that +maps the entire physical memory. For most architectures, the holes +have entries in the `mem_map` array. The `struct page` objects +corresponding to the holes are never fully initialized. + +To allocate the `mem_map` array, architecture specific setup code should +call :c:func:`free_area_init` function. Yet, the mappings array is not +usable until the call to :c:func:`memblock_free_all` that hands all the +memory to the page allocator. + +An architecture may free parts of the `mem_map` array that do not cover the +actual physical pages. In such case, the architecture specific +:c:func:`pfn_valid` implementation should take the holes in the +`mem_map` into account. + +With FLATMEM, the conversion between a PFN and the `struct page` is +straightforward: `PFN - ARCH_PFN_OFFSET` is an index to the +`mem_map` array. + +The `ARCH_PFN_OFFSET` defines the first page frame number for +systems with physical memory starting at address different from 0. + +SPARSEMEM +========= + +SPARSEMEM is the most versatile memory model available in Linux and it +is the only memory model that supports several advanced features such +as hot-plug and hot-remove of the physical memory, alternative memory +maps for non-volatile memory devices and deferred initialization of +the memory map for larger systems. + +The SPARSEMEM model presents the physical memory as a collection of +sections. A section is represented with struct mem_section +that contains `section_mem_map` that is, logically, a pointer to an +array of struct pages. However, it is stored with some other magic +that aids the sections management. The section size and maximal number +of section is specified using `SECTION_SIZE_BITS` and +`MAX_PHYSMEM_BITS` constants defined by each architecture that +supports SPARSEMEM. While `MAX_PHYSMEM_BITS` is an actual width of a +physical address that an architecture supports, the +`SECTION_SIZE_BITS` is an arbitrary value. + +The maximal number of sections is denoted `NR_MEM_SECTIONS` and +defined as + +.. math:: + + NR\_MEM\_SECTIONS = 2 ^ {(MAX\_PHYSMEM\_BITS - SECTION\_SIZE\_BITS)} + +The `mem_section` objects are arranged in a two-dimensional array +called `mem_sections`. The size and placement of this array depend +on `CONFIG_SPARSEMEM_EXTREME` and the maximal possible number of +sections: + +* When `CONFIG_SPARSEMEM_EXTREME` is disabled, the `mem_sections` + array is static and has `NR_MEM_SECTIONS` rows. Each row holds a + single `mem_section` object. +* When `CONFIG_SPARSEMEM_EXTREME` is enabled, the `mem_sections` + array is dynamically allocated. Each row contains PAGE_SIZE worth of + `mem_section` objects and the number of rows is calculated to fit + all the memory sections. + +The architecture setup code should call sparse_init() to +initialize the memory sections and the memory maps. + +With SPARSEMEM there are two possible ways to convert a PFN to the +corresponding `struct page` - a "classic sparse" and "sparse +vmemmap". The selection is made at build time and it is determined by +the value of `CONFIG_SPARSEMEM_VMEMMAP`. + +The classic sparse encodes the section number of a page in page->flags +and uses high bits of a PFN to access the section that maps that page +frame. Inside a section, the PFN is the index to the array of pages. + +The sparse vmemmap uses a virtually mapped memory map to optimize +pfn_to_page and page_to_pfn operations. There is a global `struct +page *vmemmap` pointer that points to a virtually contiguous array of +`struct page` objects. A PFN is an index to that array and the +offset of the `struct page` from `vmemmap` is the PFN of that +page. + +To use vmemmap, an architecture has to reserve a range of virtual +addresses that will map the physical pages containing the memory +map and make sure that `vmemmap` points to that range. In addition, +the architecture should implement :c:func:`vmemmap_populate` method +that will allocate the physical memory and create page tables for the +virtual memory map. If an architecture does not have any special +requirements for the vmemmap mappings, it can use default +:c:func:`vmemmap_populate_basepages` provided by the generic memory +management. + +The virtually mapped memory map allows storing `struct page` objects +for persistent memory devices in pre-allocated storage on those +devices. This storage is represented with struct vmem_altmap +that is eventually passed to vmemmap_populate() through a long chain +of function calls. The vmemmap_populate() implementation may use the +`vmem_altmap` along with :c:func:`vmemmap_alloc_block_buf` helper to +allocate memory map on the persistent memory device. + +ZONE_DEVICE +=========== +The `ZONE_DEVICE` facility builds upon `SPARSEMEM_VMEMMAP` to offer +`struct page` `mem_map` services for device driver identified physical +address ranges. The "device" aspect of `ZONE_DEVICE` relates to the fact +that the page objects for these address ranges are never marked online, +and that a reference must be taken against the device, not just the page +to keep the memory pinned for active use. `ZONE_DEVICE`, via +:c:func:`devm_memremap_pages`, performs just enough memory hotplug to +turn on :c:func:`pfn_to_page`, :c:func:`page_to_pfn`, and +:c:func:`get_user_pages` service for the given range of pfns. Since the +page reference count never drops below 1 the page is never tracked as +free memory and the page's `struct list_head lru` space is repurposed +for back referencing to the host device / driver that mapped the memory. + +While `SPARSEMEM` presents memory as a collection of sections, +optionally collected into memory blocks, `ZONE_DEVICE` users have a need +for smaller granularity of populating the `mem_map`. Given that +`ZONE_DEVICE` memory is never marked online it is subsequently never +subject to its memory ranges being exposed through the sysfs memory +hotplug api on memory block boundaries. The implementation relies on +this lack of user-api constraint to allow sub-section sized memory +ranges to be specified to :c:func:`arch_add_memory`, the top-half of +memory hotplug. Sub-section support allows for 2MB as the cross-arch +common alignment granularity for :c:func:`devm_memremap_pages`. + +The users of `ZONE_DEVICE` are: + +* pmem: Map platform persistent memory to be used as a direct-I/O target + via DAX mappings. + +* hmm: Extend `ZONE_DEVICE` with `->page_fault()` and `->page_free()` + event callbacks to allow a device-driver to coordinate memory management + events related to device-memory, typically GPU memory. See + Documentation/mm/hmm.rst. + +* p2pdma: Create `struct page` objects to allow peer devices in a + PCI/-E topology to coordinate direct-DMA operations between themselves, + i.e. bypass host memory. --- a/Documentation/translations/zh_CN/admin-guide/mm/damon/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/translations/zh_CN/admin-guide/mm/damon/index.rst @@ -13,7 +13,7 @@ ç??æµ?æ?°æ?®è®¿é?® ============ -:doc:`DAMON </vm/damon/index>` å??许轻é??级ç??æ?°æ?®è®¿é?®ç??æµ?ã??使ç?¨DAMONï¼? +:doc:`DAMON </mm/damon/index>` å??许轻é??级ç??æ?°æ?®è®¿é?®ç??æµ?ã??使ç?¨DAMONï¼? ç?¨æ?·å?¯ä»¥å??æ??ä»?们系ç»?ç??å??å?访é?®æ¨¡å¼?ï¼?并ä¼?å??å®?们ã?? .. toctree:: --- a/Documentation/translations/zh_CN/admin-guide/mm/damon/reclaim.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/translations/zh_CN/admin-guide/mm/damon/reclaim.rst @@ -229,4 +229,4 @@ DAMON_RECLAIMå??次ä»?ä¹?é?½ä¸?å??ï¼?è¿? .. [1] https://research.google/pubs/pub48551/ .. [2] https://lwn.net/Articles/787611/ -.. [3] https://www.kernel.org/doc/html/latest/vm/free_page_reporting.html +.. [3] https://www.kernel.org/doc/html/latest/mm/free_page_reporting.html --- a/Documentation/translations/zh_CN/admin-guide/mm/damon/usage.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/translations/zh_CN/admin-guide/mm/damon/usage.rst @@ -33,9 +33,9 @@ DAMON 为ä¸?å??ç??ç?¨æ?·æ??ä¾?äº?ä¸?é?¢è å?£ç?¸å??ã??è¿?å°?å?¨ä¸?ä¸?个LTSå??æ ¸å??å¸?å??被移é?¤ï¼?æ??以ç?¨æ?·åº?该转移å?° :ref:`sysfs interface <sysfs_interface>`ã?? - *å??æ ¸ç©ºé?´ç¼?ç¨?æ?¥å?£ã??* - :doc:`è¿? </vm/damon/api>` è¿?æ?¯ä¸ºå??æ ¸ç©ºé?´ç¨?åº?å??å??å¤?ç??ã??使ç?¨å®?ï¼?ç?¨æ?·å?¯ä»¥é??è¿?ä¸ºä½ ç¼?å??å?? + :doc:`è¿? </mm/damon/api>` è¿?æ?¯ä¸ºå??æ ¸ç©ºé?´ç¨?åº?å??å??å¤?ç??ã??使ç?¨å®?ï¼?ç?¨æ?·å?¯ä»¥é??è¿?ä¸ºä½ ç¼?å??å?? æ ¸ç©ºé?´ç??DAMONåº?ç?¨ç¨?åº?ï¼?æ??ç?µæ´»æ??æ??å?°å?©ç?¨DAMONç??æ¯?ä¸?个å??è?½ã??ä½ ç??è?³å?¯ä»¥ä¸ºå??ç§?å?°å??空é?´æ?©å±?DAMONã?? - 详ç»?æ??å?µè¯·å??è??æ?¥å?£ :doc:`æ??件 </vm/damon/api>`ã?? + 详ç»?æ??å?µè¯·å??è??æ?¥å?£ :doc:`æ??件 </mm/damon/api>`ã?? sysfsæ?¥å?£ ========= @@ -148,7 +148,7 @@ å??æ?´æ?°é?´é??(``update_us``)ä¸?个æ??ä å?¨ ``nr_regions`` ç?®å½?ä¸?ï¼?æ??两个æ??件å??å?«ç?¨äº?DAMONç??æµ?å?ºå??ç??ä¸?é??å??ä¸?é??ï¼?``min`` å?? ``max`` ï¼?ï¼? è¿?两个æ??件æ?§å?¶ç??ç??æµ?ç??å¼?é??ã??ä½ å?¯ä»¥é??è¿?å??è¿?äº?æ??件ç??å??å?¥å??读å?ºæ?¥è®¾ç½®å??è?·å??è¿?äº?å?¼ã?? -å?³äº?é?´é??å??ç??æµ?å?ºå??è??å?´ç??æ?´å¤?ç»?è??ï¼?请å??è??设计æ??件 (:doc:`/vm/damon/design`)ã?? +å?³äº?é?´é??å??ç??æµ?å?ºå??è??å?´ç??æ?´å¤?ç»?è??ï¼?请å??è??设计æ??件 (:doc:`/mm/damon/design`)ã?? contexts/<N>/targets/ --------------------- @@ -318,7 +318,7 @@ å±?æ?§ ---- ç?¨æ?·å?¯ä»¥é??è¿?读å??å??å??å?¥ ``attrs`` æ??件è?·å¾?å??设置 ``é??æ ·é?´é??`` ã?? ``è??é??é?´é??`` ã?? ``æ?´æ?°é?´é??`` -以å??ç??æµ?ç?®æ ?å?ºå??ç??æ??å°?/æ??大æ?°é??ã??è¦?详ç»?äº?解ç??æµ?å±?æ?§ï¼?请å??è?? `:doc:/vm/damon/design` ã??ä¾?å¦?ï¼? +以å??ç??æµ?ç?®æ ?å?ºå??ç??æ??å°?/æ??大æ?°é??ã??è¦?详ç»?äº?解ç??æµ?å±?æ?§ï¼?请å??è?? `:doc:/mm/damon/design` ã??ä¾?å¦?ï¼? ä¸?é?¢ç??å?½ä»¤å°?è¿?äº?å?¼è®¾ç½®ä¸º5msã??100msã??1000msã??10å??1000ï¼?ç?¶å??å??次æ£?æ?¥:: # cd <debugfs>/damon --- a/Documentation/translations/zh_CN/core-api/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/translations/zh_CN/core-api/index.rst @@ -101,7 +101,7 @@ å??å?管ç?? ======== å¦?ä½?å?¨å??æ ¸ä¸å??é??å??使ç?¨å??å?ã??请注æ??ï¼?å?¨ -:doc:`/vm/index` ä¸æ??æ?´å¤?ç??å??å?管ç??æ??æ¡£ã?? +:doc:`/mm/index` ä¸æ??æ?´å¤?ç??å??å?管ç??æ??æ¡£ã?? .. toctree:: :maxdepth: 1 --- a/Documentation/translations/zh_CN/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/translations/zh_CN/index.rst @@ -118,7 +118,7 @@ æ??们设æ³?æ·»å? ç??æ?¶å??â??â??å?¯è?½ä sound/index filesystems/index scheduler/index - vm/index + mm/index peci/index TODOList: --- /dev/null +++ a/Documentation/translations/zh_CN/mm/active_mm.rst @@ -0,0 +1,85 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/active_mm.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +========= +Active MM +========= + +è¿?æ?¯ä¸?å°?linuxä¹?ç?¶å??å¤?å¼?å??è??ç??ä¸?å°?é?®ä»¶ï¼?æ??以翻è¯?æ?¶æ??å°½é??ä¿?æ??é?®ä»¶æ ¼å¼?ç??å®?æ?´ã?? + +:: + + List: linux-kernel + Subject: Re: active_mm + From: Linus Torvalds <torvalds () transmeta ! com> + Date: 1999-07-30 21:36:24 + + å? 为æ??并ä¸?ç»?常å??解é??ï¼?æ??以已ç»?æ??é??å?°linux-kernelé?®ä»¶å??表ï¼?è??å½?æ??å??è¿?äº?ï¼? + ä¸?æ?´å¤?ç??人å?¨é??读å®?们æ?¶ï¼?æ??è§?å¾?æ£?æ??äº?ã?? + + 1999å¹´7æ??30æ?¥ æ??æ??äº?ï¼? David Mosberger å??é??ï¼? + > + > æ?¯å?¦æ??ä¸?个ç®?ç?ç??æ??è¿°ï¼?说æ??task_structä¸ç?? + > "mm" å?? "active_mm"åº?该å¦?ä½?使ç?¨ï¼? (å¦?æ?? + > è¿?个é?®é¢?å?¨é?®ä»¶å??表ä¸è®¨è®ºè¿?ï¼?æ??表示æ?æ??--æ??å?? + > å??度å??å??æ?¥ï¼?æ??ä¸?段æ?¶é?´æ²¡è?½å?³æ³¨linux-kerneläº?ï¼?ã?? + + å?ºæ?¬ä¸?ï¼?æ?°ç??设å®?æ?¯ï¼? + + - æ??们æ??â??ç??å®?å?°å??空é?´â??å??â??å?¿å??å?°å??空é?´â??ã??å?ºå?«å?¨äº?ï¼?å?¿å??å?°å??空é?´æ ¹æ?¬ä¸?å?³å¿?ç?¨ + æ?·çº§é¡µè¡¨ï¼?æ??以å½?æ??们å??ä¸?ä¸?æ??å??æ?¢å?°å?¿å??å?°å??空é?´æ?¶ï¼?æ??们å?ªæ?¯è®©ä»¥å??ç??å?°å??空é?´ + å¤?äº?æ´»å?¨ç?¶æ??ã?? + + ä¸?个â??å?¿å??å?°å??空é?´â??ç??æ??æ?¾ç?¨é??æ?¯ä»»ä½?ä¸?é??è¦?ä»»ä½?ç?¨æ?·æ? å°?ç??线ç¨?--æ??æ??ç??å??æ ¸çº¿ + ç¨?å?ºæ?¬ä¸?é?½å±?äº?è¿?ä¸?ç±»ï¼?ä½?å?³ä½¿æ?¯â??ç??æ£ç??â??线ç¨?ä¹?å?¯ä»¥æ??æ?¶è¯´å?¨ä¸?å®?æ?¶é?´å??å®?们ä¸? + ä¼?对ç?¨æ?·ç©ºé?´æ??å?´è¶£ï¼?è°?度å?¨ä¸?妨è¯?ç??é?¿å??å?¨å??æ?¢VMç?¶æ??ä¸?浪费æ?¶é?´ã??ç?®å??å?ªæ??è?? + å¼?ç??bdflush syncè?½å??å?°è¿?ä¸?ç?¹ã?? + + - â??tsk->mmâ?? æ??å?? â??ç??å®?å?°å??空é?´â??ã??对äº?ä¸?个å?¿å??è¿?ç¨?æ?¥è¯´ï¼?tsk->mmå°?æ?¯NULLï¼? + å?¶é?»è¾?å??å? æ?¯å?¿å??è¿?ç¨?å®?é??ä¸?æ ¹æ?¬å°± â??没æ??â?? ç??æ£ç??å?°å??空é?´ã?? + + - ç?¶è??ï¼?æ??们æ?¾ç?¶é??è¦?è·?踪æ??们为è¿?æ ·ç??å?¿å??ç?¨æ?·â??å?·ç?¨â??äº?å?ªä¸ªå?°å??空é?´ã??为æ¤ï¼?æ??们 + æ?? â??tsk->active_mmâ??ï¼?å®?æ?¾ç¤ºäº?å½?å??æ´»å?¨ç??å?°å??空é?´æ?¯ä»?ä¹?ã?? + + è§?å??æ?¯ï¼?对äº?ä¸?个æ??ç??å®?å?°å??空é?´ç??è¿?ç¨?ï¼?å?³tsk->mmæ?¯ non-NULLï¼?ï¼?active_mm + æ?¾ç?¶å¿?é¡»ä¸?ç??å®?ç??mmç?¸å??ã?? + + 对äº?ä¸?个å?¿å??è¿?ç¨?ï¼?tsk->mm == NULLï¼?è??tsk->active_mmæ?¯å?¿å??è¿?ç¨?è¿?è¡?æ?¶ + â??å??ç?¨â??ç??mmã??å½?å?¿å??è¿?ç¨?被è°?度走æ?¶ï¼?å??ç?¨ç??å?°å??空é?´è¢«è¿?å??并æ¸?é?¤ã?? + + 为äº?æ?¯æ??æ??æ??è¿?äº?ï¼?â??struct mm_structâ??ç?°å?¨æ??两个计æ?°å?¨ï¼?ä¸?个æ?¯ â??mm_usersâ?? + 计æ?°å?¨ï¼?å?³æ??å¤?å°? â??ç??æ£ç??å?°å??空é?´ç?¨æ?·â??ï¼?å?¦ä¸?个æ?¯ â??mm_countâ??计æ?°å?¨ï¼?å?³ â??lazyâ?? + ç?¨æ?·ï¼?å?³å?¿å??ç?¨æ?·ï¼?ç??æ?°é??ï¼?å¦?æ??æ??ä»»ä½?ç??æ£ç??ç?¨æ?·ï¼?å??å? 1ã?? + + é??常æ??å?µä¸?ï¼?è?³å°?æ??ä¸?个ç??æ£ç??ç?¨æ?·ï¼?ä½?ä¹?å?¯è?½æ?¯ç??æ£ç??ç?¨æ?·å?¨å?¦ä¸?个CPUä¸?é??å?ºï¼?è?? + ä¸?个lazyç??ç?¨æ?·ä»?å?¨æ´»å?¨ï¼?æ??ä»¥ä½ å®?é??ä¸?å¾?å?°ç??æ??å?µæ?¯ï¼?ä½ æ??ä¸?个å?°å??空é?´ **å?ª** + 被lazyç??ç?¨æ?·ä½¿ç?¨ã??è¿?é??常æ?¯ä¸?个ç?æ??ç??ç??å?½å?¨æ??ç?¶æ??ï¼?å? 为ä¸?æ?¦è¿?个线ç¨?被å®?æ??ç»?ä¸? + 个ç??æ£ç??线ç¨?ï¼?è¿?个 â??å?µå°¸â?? mmå°±ä¼?被é??æ?¾ï¼?å? 为 â??mm_countâ??å??æ??äº?é?¶ã?? + + å?¦å¤?ï¼?ä¸?个æ?°ç??è§?å??æ?¯ï¼?**没æ??人** å??æ?? â??init_mmâ?? ä½?为ä¸?个ç??æ£ç??MMäº?ã?? + â??init_mmâ??åº?该被认为å?ªæ?¯ä¸?个 â??没æ??å?¶ä»?ä¸?ä¸?æ??æ?¶ç??lazyä¸?ä¸?æ??â??ï¼?äº?å®?ä¸?ï¼?å®?主 + è¦?æ?¯å?¨å?¯å?¨æ?¶ä½¿ç?¨ï¼?å½?æ?¶è¿?没æ??ç??æ£ç??VM被å??建ã??å? æ¤ï¼?ç?¨æ?¥æ£?æ?¥ç??代ç ? + + if (current->mm == &init_mm) + + ä¸?è?¬æ?¥è¯´ï¼?åº?该ç?¨ + + if (!current->mm) + + å??代ä¸?é?¢ç??å??æ³?ï¼?è¿?æ?´æ??æ??ä¹?--æµ?è¯?å?ºæ?¬ä¸?æ?¯ â??æ??们æ?¯å?¦æ??ä¸?个ç?¨æ?·ç?¯å¢?â??ï¼?并ä¸?é??常 + ç?±ç¼ºé¡µå¼?常å¤?ç??ç¨?åº?å??类似ç??ä¸?西æ?¥å®?æ??ï¼?ã?? + + æ?»ä¹?ï¼?æ??å??æ??å?¨ftp.kernel.orgä¸?æ?¾äº?ä¸?个pre-patch-2.3.13-1ï¼?å? 为å®?ç¨?å¾®æ?¹ + å??äº?æ?¥å?£ä»¥é??é??alphaï¼?è°?ä¼?æ?³å?°å?¢ï¼?ä½?alphaä½?ç³»ç»?æ??ä¸?ä¸?æ??å??æ?¢ä»£ç ?å®?é??ä¸?æ??ç»?æ?¯ + æ??ä¸?é??ç??ä¹?ä¸?--ä¸?å??å?¶ä»?æ?¶æ??ç??MMå??å¯?å?å?¨ç?¶æ??æ?¯å??å¼?ç??ï¼?alphaç??PALcodeå°?两è?? + è¿?æ?¥èµ·æ?¥ï¼?ä½ é??è¦?å??æ?¶å??æ?¢ä¸¤è??ï¼?ã?? + + (æ??æ¡£æ?¥æº? http://marc.info/?l=linux-kernel&m=93337278602211&w=2) --- /dev/null +++ a/Documentation/translations/zh_CN/mm/balance.rst @@ -0,0 +1,81 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/balance.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +======== +å??å?平衡 +======== + +2000å¹´1æ??å¼?å§?ï¼?ä½?è??ï¼?Kanoj Sarcar <kanoj@xxxxxxx> + +对äº? !__GFP_HIGH å?? !__GFP_KSWAPD_RECLAIM 以å??é?? __GFP_IO ç??å??é??ï¼?é??è¦?è¿?è¡? +å??å?平衡ã?? + +è°?ç?¨è??é?¿å??å??æ?¶ç??第ä¸?个å??å? æ?¯è°?ç?¨è??ç?±äº?æ??æ??è?ªæ??é??æ??å¤?äº?ä¸æ?ç?¯å¢?ä¸è??æ? æ³?ç?¡ç? ã??第äº?个 +å??å? å?¯è?½æ?¯ï¼?è°?ç?¨è??æ?¿æ??å?¨ä¸?产ç??页é?¢å??æ?¶å¼?é??ç??æ??å?µä¸?å??é??失败ã??è¿?å?¯è?½å??ç??å?¨æ??0é?¶å??é?? +é??项ç??æ?ºä¼?主ä¹?é«?é?¶å??é??请æ±?ä¸ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?è°?ç?¨è??å?¯è?½ä¹?å¸?æ??é?¿å??å?¤é??kswapdã?? + +__GFP_IOå??é??请æ±?æ?¯ä¸ºäº?é?²æ¢æ??件系ç»?æ»é??ã?? + +å?¨æ²¡æ??é??ç?¡ç? å??é??请æ±?ç??æ??å?µä¸?ï¼?å??平衡似ä¹?æ?¯æ??害ç??ã??页é?¢å??æ?¶å?¯ä»¥è¢«æ??æ?£å?°å?¯å?¨ï¼?ä¹?å°±æ?¯ +说ï¼?å?ªæ??å?¨é??è¦?ç??æ?¶å??ï¼?ä¹?å°±æ?¯å?ºå??ç??空é?²å??å?为0ï¼?ï¼?è??ä¸?æ?¯è®©å®?æ??为ä¸?个主å?¨ç??è¿?ç¨?ã?? + +ä¹?å°±æ?¯è¯´ï¼?å??æ ¸åº?该å°?è¯?ä»?ç?´æ?¥æ? å°?æ± ä¸æ»¡è¶³å¯¹ç?´æ?¥æ? å°?页ç??请æ±?ï¼?è??ä¸?æ?¯å??é??å?°dmaæ± ä¸ï¼? +è¿?æ ·å°±å?¯ä»¥ä¿?æ??dmaæ± ä¸ºdma请æ±?ï¼?ä¸?管æ?¯ä¸?æ?¯å??å?ç??ï¼?æ??å¡«å??ã??类似ç??äº?论ä¹?é??ç?¨äº?é«?å??å? +å??ç?´æ?¥æ? å°?ç??页é?¢ã??ç?¸å??ï¼?å¦?æ??æ??å¾?å¤?空é?²ç??dma页ï¼?æ??好æ?¯é??è¿?ä»?dmaæ± ä¸å??é??ä¸?个æ?¥æ»¡è¶³ +常è§?ç??å??å?请æ±?ï¼?è??ä¸?æ?¯äº§ç??常è§?å?ºå??平衡ç??å¼?é??ã?? + +å?¨2.2ä¸ï¼?å?ªæ??å½?空é?²é¡µæ?»æ?°ä½?äº?æ?»å??å?ç??1/64æ?¶ï¼?æ??ä¼?å?¯å?¨å??å?平衡/页é?¢å??æ?¶ã??å¦?æ??dma +å??常è§?å??å?ç??æ¯?ä¾?å??é??ï¼?å?³ä½¿dmaå?ºå®?å?¨ç©ºäº?ï¼?ä¹?å¾?å?¯è?½ä¸?ä¼?è¿?è¡?平衡ã??2.2å·²ç»?å?¨ä¸?å??å??å? +大å°?ç??ç??产æ?ºå?¨ä¸?è¿?è¡?ï¼?å?³ä½¿æ??è¿?个é?®é¢?å?å?¨ï¼?ä¼¼ä¹?ä¹?å??å¾?ä¸?é??ã??å?¨2.3ä¸ï¼?ç?±äº?HIGHMEMç?? +å?å?¨ï¼?è¿?个é?®é¢?å??å¾?æ?´å? 严é??ã?? + +å?¨2.3ä¸ï¼?å?ºå??平衡å?¯ä»¥ç?¨ä¸¤ç§?æ?¹å¼?ä¹?ä¸?æ?¥å®?æ??ï¼?æ ¹æ?®å?ºå??ç??大å°?ï¼?å?¯è?½æ?¯ä½?级å?ºå??ç??大å°?ï¼?ï¼? +æ??们å?¯ä»¥å?¨å??å§?å??é?¶æ®µå?³å®?å?¨å¹³è¡¡ä»»ä½?å?ºå??æ?¶åº?该äº?å??å¤?å°?空é?²é¡µã??好ç??æ?¹é?¢æ?¯ï¼?å?¨å¹³è¡¡ç??æ?¶ +å??ï¼?æ??们ä¸?é??è¦?ç??ä½?级å?ºç??大å°?ï¼?å??ç??æ?¹é?¢æ?¯ï¼?æ??们å?¯è?½ä¼?å? 为忽ç?¥ä½?级å?ºå?¯è?½è¾?ä½?ç??使ç?¨ç?? +è??å??è¿?äº?é¢?ç¹?ç??平衡ã??å?¦å¤?ï¼?å?ªè¦?对å??é??ç¨?åº?ç¨?ä½?ä¿®æ?¹ï¼?å°±æ??å?¯è?½å°?memclass()å®?ç®?å??为ä¸? +个ç®?å??ç??ç?å¼?ã?? + +å?¦ä¸?个å?¯è?½ç??解å?³æ?¹æ¡?æ?¯ï¼?æ??们å?ªå?¨ä¸?个å?º **å??** å?¶æ??æ??ä½?级å?ºç??空é?²å??å?ä½?äº?该å?ºå??å?¶ +ä½?级å?ºæ?»å??å?ç??1/64æ?¶è¿?è¡?平衡ã??è¿?就解å?³äº?2.2ç??平衡é?®é¢?ï¼?并尽å?¯è?½å?°ä¿?æ??äº?ä¸?2.2è¡?为 +ç??æ?¥è¿?ã??å?¦å¤?ï¼?平衡ç®?æ³?å?¨å??ç§?æ?¶æ??ä¸?ç??å·¥ä½?æ?¹å¼?ä¹?æ?¯ä¸?æ ·ç??ï¼?è¿?äº?æ?¶æ??æ??ä¸?å??æ?°é??å??ç±»å??ç?? +å??å?å?ºã??å¦?æ??æ??们æ?³å??å¾?æ?´è?±å?¨ä¸?ç?¹ï¼?æ??们å?¯ä»¥å?¨æ?ªæ?¥ä¸ºä¸?å??å?ºå??ç??è?ªç?±é¡µé?¢å??é??ä¸?å??ç??æ??é??ã?? + +请注æ??ï¼?å¦?æ??æ?®é??å?ºç??大å°?ä¸?dmaå?ºç?¸æ¯?æ?¯å·¨å¤§ç??ï¼?é?£ä¹?å?¨å?³å®?æ?¯å?¦å¹³è¡¡æ?®é??å?ºç??æ?¶å??ï¼?è??è?? +空é?²ç??dma页就å??å¾?ä¸?é?£ä¹?é??è¦?äº?ã??é?£ä¹?第ä¸?个解å?³æ?¹æ¡?å°±å??å¾?æ?´æ??å?¸å¼?å??ã?? + +æ??é??ç??è¡¥ä¸?å®?ç?°äº?第äº?个解å?³æ?¹æ¡?ã??å®?è¿? â??ä¿®å¤?â??äº?两个é?®é¢?ï¼?é¦?å??ï¼?å?¨ä½?å??å?æ?¡ä»¶ä¸?ï¼?kswapd +被å?¤é??ï¼?å°±å??2.2ä¸ç??é??ç?¡ç? å??é??ã??第äº?ï¼?HIGHMEMå?ºä¹?被平衡äº?ï¼?以便ç»?replace_with_highmem() +ä¸?个äº?å??è?·å¾?HIGHMEM页ç??æ?ºä¼?ï¼?å??æ?¶ç¡®ä¿?HIGHMEMå??é??ä¸?ä¼?è?½å??æ?®é??å?ºã??è¿?ä¹?ç¡®ä¿?äº?HIGHMEM +页ä¸?ä¼?被æ³?é?²ï¼?ä¾?å¦?ï¼?å?¨ä¸?个HIGHMEM页å?¨äº¤æ?¢ç¼?å?ä¸ä½?没æ??被任ä½?人使ç?¨ç??æ??å?µä¸?ï¼?ã?? + +kswapdè¿?é??è¦?ç?¥é??å®?åº?该平衡å?ªäº?å?ºã??kswapd主è¦?æ?¯å?¨æ? æ³?è¿?è¡?平衡ç??æ??å?µä¸?é??è¦?ç??ï¼?å?¯è?½ +æ?¯å? 为æ??æ??ç??å??é??请æ±?é?½æ?¥è?ªä¸æ?ä¸?ä¸?æ??ï¼?è??æ??æ??ç??è¿?ç¨?ä¸?ä¸?æ??é?½å?¨ç?¡ç? ã??对äº?2.3ï¼? +kswapd并ä¸?ç??æ£é??è¦?平衡é«?å??å?å?ºï¼?å? 为ä¸æ?ä¸?ä¸?æ??并ä¸?请æ±?é«?å??å?页ã??kswapdç??zone +ç»?æ??ä½?ä¸ç??zone_wake_kswapdå?段æ?¥å?³å®?ä¸?个å?ºæ?¯å?¦é??è¦?平衡ã?? + +å¦?æ??ä»?è¿?ç¨?å??å?å??shmä¸å?·å??页é?¢å?¯ä»¥å??轻该页é?¢è??ç?¹ä¸ä»»ä½?å?ºç??å??å?å??å??ï¼?è??该å?ºç??å??å?å??å?? +å·²ç»?ä½?äº?å?¶æ°´ä½?ï¼?å??ä¼?è¿?è¡?å?·å??ã?? + +watemark[WMARK_MIN/WMARK_LOW/WMARK_HIGH]/low_on_memory/zone_wake_kswapdï¼? +è¿?äº?æ?¯æ¯?个å?ºç??å?段ï¼?ç?¨äº?ç¡®å®?ä¸?个å?ºä½?æ?¶é??è¦?平衡ã??å½?页é?¢æ?°ä½?äº?æ°´ä½?[WMARK_MIN]æ?¶ï¼? +hysteric ç??å?段low_on_memory被设置ã??è¿?个å?段ä¼?ä¸?ç?´è¢«è®¾ç½®ï¼?ç?´å?°ç©ºé?²é¡µæ?°å??æ??æ°´ä½? +[WMARK_HIGH]ã??å½?low_on_memory被设置æ?¶ï¼?页é?¢å??é??请æ±?å°?å°?è¯?é??æ?¾è¯¥å?ºå??ç??ä¸?äº?页é?¢ï¼?å¦?æ?? +请æ±?ä¸è®¾ç½®äº?GFP_WAITï¼?ã??ä¸?æ¤ç?¸å??ç??æ?¯ï¼?å?³å®?å?¤é??kswapd以é??æ?¾ä¸?äº?å?ºç??页ã??è¿?个å?³å®?ä¸?æ?¯å?ºäº? +hysteresis ç??ï¼?è??æ?¯å½?空é?²é¡µç??æ?°é??ä½?äº?watermark[WMARK_LOW]æ?¶å°±ä¼?è¿?è¡?ï¼?å?¨è¿?ç§?æ??å?µä¸?ï¼? +zone_wake_kswapdä¹?被设置ã?? + + +æ??æ??å?¬å?°ç??ï¼?è¶?æ£?ç??ï¼?æ?³æ³?ï¼? + +1. å?¨æ??ç»?å??åº?该影å??平衡ï¼?å?¯ä»¥è·?踪ä¸?个å?ºç??失败请æ±?ç??æ?°é??ï¼?并å??é¦?å?°å¹³è¡¡æ?¹æ¡?ä¸ï¼?jalvo@xxxxxxxxï¼?ã?? + +2. å®?ç?°ä¸?个类似äº?replace_with_highmem()ç??replace_with_regular()ï¼?以ä¿?ç??dma页é?¢ã?? + (lkd@xxxxxxxxxxxxxxxxxxxxxxxx) --- /dev/null +++ a/Documentation/translations/zh_CN/mm/damon/api.rst @@ -0,0 +1,32 @@ +.. SPDX-License-Identifier: GPL-2.0 + +:Original: Documentation/mm/damon/api.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +======= +APIå??è?? +======= + +å??æ ¸ç©ºé?´ç??ç¨?åº?å?¯ä»¥ä½¿ç?¨ä¸?é?¢ç??APIæ?¥ä½¿ç?¨DAMONç??æ¯?个å??è?½ã??ä½ æ??é??è¦?å??ç??å°±æ?¯å¼?ç?¨ ``damon.h`` ï¼? +å®?ä½?äº?æº?代ç ?æ ?ç??include/linux/ã?? + +ç»?æ??ä½? +====== + +该APIå?¨ä»¥ä¸?å??æ ¸ä»£ç ?ä¸: + +include/linux/damon.h + + +å?½æ?° +==== + +该APIå?¨ä»¥ä¸?å??æ ¸ä»£ç ?ä¸: + +mm/damon/core.c --- /dev/null +++ a/Documentation/translations/zh_CN/mm/damon/design.rst @@ -0,0 +1,140 @@ +.. SPDX-License-Identifier: GPL-2.0 + +:Original: Documentation/mm/damon/design.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +==== +设计 +==== + +å?¯é??ç½®ç??å±? +========== + +DAMONæ??ä¾?äº?æ?°æ?®è®¿é?®ç??æ?§å??è?½ï¼?å??æ?¶ä½¿å?¶å??ç¡®æ?§å??å¼?é??å?¯æ?§ã??å?ºæ?¬ç??访é?®ç??æ?§é??è¦?ä¾?èµ?äº?ç?®æ ?å?°å??空é?´ +并为ä¹?ä¼?å??ç??å?ºå??ã??å?¦ä¸?æ?¹é?¢ï¼?ä½?为DAMONç??æ ¸å¿?ï¼?å??ç¡®æ?§å??å¼?é??ç??æ??è¡¡æ?ºå?¶æ?¯å?¨çº¯é?»è¾?空é?´ä¸ã??DAMON +å°?è¿?两é?¨å??å??离å?¨ä¸?å??ç??å±?ä¸ï¼?并å®?ä¹?äº?å®?ç??æ?¥å?£ï¼?以å??许å??ç§?ä½?å±?次ç??å?ºå??å®?ç?°ä¸?æ ¸å¿?é?»è¾?ç??é??ç½®ã?? + +ç?±äº?è¿?ç§?å??离ç??设计å??å?¯é??ç½®ç??æ?¥å?£ï¼?ç?¨æ?·å?¯ä»¥é??è¿?é??ç½®æ ¸å¿?é?»è¾?å??é??å½?ç??ä½?级å?ºå??å®?ç?°æ?¥æ?©å±?DAMONç?? +ä»»ä½?å?°å??空é?´ã??å¦?æ??没æ??æ??ä¾?å??é??ç??ï¼?ç?¨æ?·å?¯ä»¥è?ªå·±å®?ç?°å?ºå??ã?? + +ä¾?å¦?ï¼?ç?©ç??å??å?ã??è??æ??å??å?ã??交æ?¢ç©ºé?´ã??é?£äº?ç?¹å®?ç??è¿?ç¨?ã??NUMAè??ç?¹ã??æ??件å??æ?¯æ??ç??å??å?设å¤?å°?被æ?¯æ??ã?? +å?¦å¤?ï¼?å¦?æ??æ??äº?æ?¶æ??æ??设å¤?æ?¯æ??ç?¹æ®?ç??ä¼?å??访é?®æ£?æ?¥å?ºå??ï¼?è¿?äº?å?ºå??å°?å¾?容æ??被é??ç½®ã?? + + +ç?¹å®?å?°å??空é?´å?ºå??ç??å??è??å®?ç?° +========================== + +å?ºæ?¬è®¿é?®ç??æµ?ç??ä½?级å?ºå??被å®?ä¹?为两é?¨å??ã??: + +1. ç¡®å®?å?°å??空é?´ç??ç??æµ?ç?®æ ?å?°å??è??å?´ +2. ç?®æ ?空é?´ä¸ç?¹å®?å?°å??è??å?´ç??访é?®æ£?æ?¥ã?? + +DAMONç?®å??为ç?©ç??å??è??æ??å?°å??空é?´æ??ä¾?äº?å?ºå??ç??å®?ç?°ã??ä¸?é?¢ä¸¤ä¸ªå°?è??æ??è¿°äº?è¿?äº?å·¥ä½?ç??æ?¹å¼?ã?? + + +å?ºäº?VMAç??ç?®æ ?å?°å??è??å?´æ??é? +------------------------- + +è¿?ä»?ä»?æ?¯é??对è??æ??å?°å??空é?´å?ºå??ç??å®?ç?°ã??对äº?ç?©ç??å?°å??空é?´ï¼?å?ªæ?¯è¦?æ±?ç?¨æ?·æ??å?¨è®¾ç½®ç??æ?§ç?®æ ?å?°å??è??å?´ã?? + +å?¨è¿?ç¨?ç??è¶?级巨大ç??è??æ??å?°å??空é?´ä¸ï¼?å?ªæ??å°?é?¨å??被æ? å°?å?°ç?©ç??å??å?并被访é?®ã??å? æ¤ï¼?è·?踪æ?ªæ? å°?ç??å?° +å??å?ºå??å?ªæ?¯ä¸?ç§?浪费ã??ç?¶è??ï¼?ç?±äº?DAMONå?¯ä»¥ä½¿ç?¨è?ªé??åº?å?ºå??è°?æ?´æ?ºå?¶æ?¥å¤?ç??ä¸?å®?ç¨?度ç??å?ªå£°ï¼?æ??以严 +æ ¼æ?¥è¯´ï¼?è·?踪æ¯?ä¸?个æ? å°?并ä¸?æ?¯å¿?é¡»ç??ï¼?ä½?å?¨æ??äº?æ??å?µä¸?ç??è?³ä¼?产ç??å¾?é«?ç??å¼?é??ã??ä¹?å°±æ?¯è¯´ï¼?ç??æµ?ç?®æ ? +å??é?¨è¿?äº?巨大ç??æ?ªæ? å°?å?ºå??åº?该被移é?¤ï¼?以ä¸?å? ç?¨è?ªé??åº?æ?ºå?¶ç??æ?¶é?´ã?? + +å?ºäº?è¿?个å??å? ï¼?è¿?个å®?ç?°å°?å¤?æ??ç??æ? å°?转æ?¢ä¸ºä¸?个ä¸?å??ç??å?ºå??ï¼?è¦?ç??å?°å??空é?´ç??æ¯?个æ? å°?å?ºå??ã??è¿?ä¸?个 +å?ºå??ä¹?é?´ç??两个空é??æ?¯ç»?å®?å?°å??空é?´ä¸ä¸¤ä¸ªæ??大ç??æ?ªæ? å°?å?ºå??ã??è¿?两个æ??大ç??æ?ªæ? å°?å?ºå??æ?¯å ?å??æ??ä¸?é?¢ +ç??mmap()å?ºå??ä¹?é?´ç??é?´é??ï¼?以å??å?¨å¤§å¤?æ?°æ??å?µä¸?æ??ä¸?é?¢ç??mmap()å?ºå??å??å ?ä¹?é?´ç??é?´é??ã??å? 为è¿?äº?é?´é?? +å?¨é??常ç??å?°å??空é?´ä¸æ?¯å¼?常巨大ç??ï¼?æ??é?¤è¿?äº?é?´é??就足以å??å?ºå??ç??ç??æ??è¡¡ã??ä¸?é?¢è¯¦ç»?说æ??äº?è¿?ä¸?ç?¹:: + + <heap> + <BIG UNMAPPED REGION 1> + <uppermost mmap()-ed region> + (small mmap()-ed regions and munmap()-ed regions) + <lowermost mmap()-ed region> + <BIG UNMAPPED REGION 2> + <stack> + + +å?ºäº?PTE访é?®ä½?ç??访é?®æ£?æ?¥ +----------------------- + +ç?©ç??å??è??æ??å?°å??空é?´ç??å®?ç?°é?½ä½¿ç?¨PTE Accessed-bitè¿?è¡?å?ºæ?¬è®¿é?®æ£?æ?¥ã??å?¯ä¸?ç??å?ºå?«å?¨äº?ä»?å?°å??ä¸ +æ?¾å?°ç?¸å?³ç??PTE访é?®ä½?ç??æ?¹å¼?ã??è??æ??å?°å??ç??å®?ç?°æ?¯ä¸ºè¯¥å?°å??ç??ç?®æ ?ä»»å?¡æ?¥æ?¾é¡µè¡¨ï¼?è??ç?©ç??å?°å??ç??å®?ç?°å?? +æ?¯æ?¥æ?¾ä¸?该å?°å??æ??æ? å°?å?³ç³»ç??æ¯?ä¸?个页表ã??é??è¿?è¿?ç§?æ?¹å¼?ï¼?å®?ç?°è??æ?¾å?°å¹¶æ¸?é?¤ä¸?ä¸?个é??æ ·ç?®æ ?å?°å??ç??ä½?ï¼? +并æ£?æ?¥è¯¥ä½?æ?¯å?¦å?¨ä¸?个é??æ ·å?¨æ??å??å??次设置ã??è¿?å?¯è?½ä¼?å¹²æ?°å?¶ä»?使ç?¨è®¿é?®ä½?ç??å??æ ¸å?ç³»ç»?ï¼?å?³ç©ºé?²é¡µè·? +踪å??å??æ?¶é?»è¾?ã??为äº?é?¿å??è¿?ç§?å¹²æ?°ï¼?DAMON使å?¶ä¸?空é?²é¡µé?¢è·?踪ç?¸äº?æ??æ?¥ï¼?并使ç?¨ ``PG_idle`` å?? +``PG_young`` 页é?¢æ ?å¿?æ?¥è§£å?³ä¸?å??æ?¶é?»è¾?ç??å?²çª?ï¼?å°±å??空é?²é¡µé?¢è·?踪é?£æ ·ã?? + + +ç?¬ç«?äº?å?°å??空é?´ç??æ ¸å¿?æ?ºå?¶ +======================== + +ä¸?é?¢å??个é?¨å??å??å?«æ??è¿°äº?DAMONç??æ ¸å¿?æ?ºå?¶å??äº?个ç??æµ?å±?æ?§ï¼?å?³ ``é??æ ·é?´é??`` ã?? ``è??é??é?´é??`` ã?? +``æ?´æ?°é?´é??`` ã?? ``æ??å°?å?ºå??æ?°`` å?? ``æ??大å?ºå??æ?°`` ã?? + + +访é?®é¢?ç??ç??æµ? +------------ + +DAMONç??è¾?å?ºæ?¾ç¤ºäº?å?¨ç»?å®?ç??æ?¶é?´å??å?ªäº?页é?¢ç??访é?®é¢?ç??æ?¯å¤?å°?ã??访é?®é¢?ç??ç??å??辨ç??æ?¯é??è¿?设置 +``é??æ ·é?´é??`` å?? ``è??é??é?´é??`` æ?¥æ?§å?¶ç??ã??详ç»?å?°è¯´ï¼?DAMONæ£?æ?¥æ¯?个 ``é??æ ·é?´é??`` 对æ¯? +个页é?¢ç??访é?®ï¼?并å°?ç»?æ??æ±?æ?»ã??æ?¢å?¥è¯?说ï¼?计ç®?æ¯?个页é?¢ç??访é?®æ¬¡æ?°ã??å?¨æ¯?个 ``è??å??é?´é??`` è¿? +å?»å??ï¼?DAMONè°?ç?¨å??å??ç?±ç?¨æ?·æ³¨å??ç??å??è°?å?½æ?°ï¼?以便ç?¨æ?·å?¯ä»¥é??读è??å??ç??ç»?æ??ï¼?ç?¶å??å??æ¸?é?¤è¿?äº?ç»? +æ??ã??è¿?å?¯ä»¥ç?¨ä»¥ä¸?ç®?å??ç??伪代ç ?æ?¥æ??è¿°:: + + while monitoring_on: + for page in monitoring_target: + if accessed(page): + nr_accesses[page] += 1 + if time() % aggregation_interval == 0: + for callback in user_registered_callbacks: + callback(monitoring_target, nr_accesses) + for page in monitoring_target: + nr_accesses[page] = 0 + sleep(sampling interval) + +è¿?ç§?æ?ºå?¶ç??ç??æµ?å¼?é??å°?é??ç??ç?®æ ?å·¥ä½?è´?è½½è§?模ç??å¢?é?¿è??ä»»æ??å¢?å? ã?? + + +å?ºäº?å?ºå??ç??æ?½æ ·è°?æ?¥ +------------------ + +为äº?é?¿å??å¼?é??ç??æ? é??å?¶å¢?å? ï¼?DAMONå°?å??å®?å?·æ??ç?¸å??访é?®é¢?ç??ç??ç?¸é?»é¡µé?¢å½?å?¥ä¸?个å?ºå??ã??å?ªè¦?ä¿?æ?? +è¿?个å??设ï¼?ä¸?个å?ºå??å??ç??页é?¢å?·æ??ç?¸å??ç??访é?®é¢?ç??ï¼?ï¼?该å?ºå??å??å°±å?ªé??è¦?æ£?æ?¥ä¸?个页é?¢ã??å? æ¤ï¼?对 +äº?æ¯?个 ``é??æ ·é?´é??`` ï¼?DAMONå?¨æ¯?个å?ºå??ä¸é??æ?ºæ??é??ä¸?个页é?¢ï¼?ç?å¾?ä¸?个 ``é??æ ·é?´é??`` ï¼?æ£? +æ?¥è¯¥é¡µé?¢æ?¯å?¦å??æ?¶è¢«è®¿é?®ï¼?å¦?æ??被访é?®å??å¢?å? 该å?ºå??ç??访é?®é¢?ç??ã??å? æ¤ï¼?ç??æµ?å¼?é??æ?¯å?¯ä»¥é??è¿?设置 +å?ºå??ç??æ?°é??æ?¥æ?§å?¶ç??ã??DAMONå??许ç?¨æ?·è®¾ç½®æ??å°?å??æ??大ç??å?ºå??æ?°é??æ?¥è¿?è¡?æ??è¡¡ã?? + +ç?¶è??ï¼?å¦?æ??å??设没æ??å¾?å?°ä¿?è¯?ï¼?è¿?个æ?¹æ¡?å°±ä¸?è?½ä¿?æ??è¾?å?ºç??è´¨é??ã?? + + +é??åº?æ?§å?ºå??è°?æ?´ +-------------- + +å?³ä½¿æ??å??ç??ç??æµ?ç?®æ ?å?ºå??被å¾?好å?°æ??建以满足å??设ï¼?å??ä¸?å?ºå??å??ç??页é?¢å?·æ??ç?¸ä¼¼ç??访é?®é¢?ç??ï¼?ï¼?æ?° +æ?®è®¿é?®æ¨¡å¼?ä¹?ä¼?被å?¨æ??å?°æ?¹å??ã??è¿?å°?导è?´ç??æµ?è´¨é??ä¸?é??ã??为äº?å°½å?¯è?½å?°ä¿?æ??å??设ï¼?DAMONæ ¹æ?®æ¯?个 +å?ºå??ç??访é?®é¢?ç??è?ªé??åº?å?°è¿?è¡?å??并å??æ??å??ã?? + +对äº?æ¯?个 ``è??é??å?ºé?´`` ï¼?å®?æ¯?è¾?ç?¸é?»å?ºå??ç??访é?®é¢?ç??ï¼?å¦?æ??é¢?ç??å·®å¼?è¾?å°?ï¼?å°±å??并è¿?äº?å?ºå??ã?? +ç?¶å??ï¼?å?¨å®?æ?¥å??并æ¸?é?¤æ¯?个å?ºå??ç??è??å??æ?¥å?¥é¢?ç??å??ï¼?å¦?æ??å?ºå??æ?»æ?°ä¸?è¶?è¿?ç?¨æ?·æ??å®?ç??æ??大å?ºå??æ?°ï¼? +å®?å°?æ¯?个å?ºå??æ??å??为两个æ??ä¸?个å?ºå??ã?? + +é??è¿?è¿?ç§?æ?¹å¼?ï¼?DAMONæ??ä¾?äº?å?¶æ??ä½³ç??è´¨é??å??æ??å°?ç??å¼?é??ï¼?å??æ?¶ä¿?æ??äº?ç?¨æ?·ä¸ºå?¶æ??衡设å®?ç??ç??é??ã?? + + +å?¨æ??ç?®æ ?空é?´æ?´æ?°å¤?ç?? +-------------------- + +ç??æµ?ç?®æ ?å?°å??è??å?´å?¯ä»¥å?¨æ??æ?¹å??ã??ä¾?å¦?ï¼?è??æ??å??å?å?¯ä»¥å?¨æ??å?°è¢«æ? å°?å??解æ? å°?ã??ç?©ç??å??å?å?¯ä»¥è¢« +ç?æ??æ??ã?? + +ç?±äº?å?¨æ??äº?æ??å?µä¸?å??å??å?¯è?½ç?¸å½?é¢?ç¹?ï¼?DAMONå??许ç??æ?§æ??ä½?æ£?æ?¥å?¨æ??å??å??ï¼?å??æ?¬å??å?æ? å°?å??å??ï¼? +并ä»?å?¨ç?¨æ?·æ??å®?ç??æ?¶é?´é?´é??ï¼? ``æ?´æ?°é?´é??`` ï¼?ä¸ç??æ¯?个æ?¶é?´æ®µï¼?å°?å?¶åº?ç?¨äº?ç??æ?§æ??ä½?ç?¸å?³ç?? +æ?°æ?®ç»?æ??ï¼?å¦?æ?½è±¡ç??ç??æ?§ç?®æ ?å??å?å?ºã?? \ No newline at end of file --- /dev/null +++ a/Documentation/translations/zh_CN/mm/damon/faq.rst @@ -0,0 +1,48 @@ +.. SPDX-License-Identifier: GPL-2.0 + +:Original: Documentation/mm/damon/faq.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +======== +常è§?é?®é¢? +======== + +为ä»?ä¹?æ?¯ä¸?个æ?°ç??å?ç³»ç»?ï¼?è??ä¸?æ?¯æ?©å±?perfæ??å?¶ä»?ç?¨æ?·ç©ºé?´å·¥å?·ï¼? +========================================================== + +é¦?å??ï¼?å? 为å®?é??è¦?å°½å?¯è?½ç??è½»é??级ï¼?以便å?¯ä»¥å?¨çº¿ä½¿ç?¨ï¼?æ??以åº?该é?¿å??ä»»ä½?ä¸?å¿?è¦?ç??å¼?é??ï¼?å¦?å??æ ¸-ç?¨æ?· +空é?´ç??ä¸?ä¸?æ??å??æ?¢æ??æ?¬ã??第äº?ï¼?DAMONç??ç?®æ ?æ?¯è¢«å??æ?¬å??æ ¸å?¨å??ç??å?¶ä»?ç¨?åº?æ??使ç?¨ã??å? æ¤ï¼?对ç?¹å®?å·¥å?· +ï¼?å¦?perfï¼?ç??ä¾?èµ?æ?§æ?¯ä¸?å?¯å??ç??ã??è¿?å°±æ?¯DAMONå?¨å??æ ¸ç©ºé?´å®?ç?°ç??两个æ??大ç??å??å? ã?? + + +â??é?²ç½®é¡µé?¢è·?踪â?? æ?? â??perf memâ?? å?¯ä»¥æ?¿ä»£DAMONå??ï¼? +============================================== + +é?²ç½®é¡µè·?踪æ?¯ç?©ç??å?°å??空é?´è®¿é?®æ£?æ?¥ç??ä¸?个ä½?å±?次ç??å??å§?æ?¹æ³?ã??â??perf memâ??ä¹?æ?¯ç±»ä¼¼ç??ï¼?尽管å®?å?¯ä»¥ +使ç?¨é??æ ·æ?¥å??å°?å¼?é??ã??å?¦ä¸?æ?¹é?¢ï¼?DAMONæ?¯ä¸?个æ?´é«?å±?次ç??æ¡?æ?¶ï¼?ç?¨äº?ç??æ?§å??ç§?å?°å??空é?´ã??å®?ä¸?注äº?å?? +å?管ç??ä¼?å??ï¼?并æ??ä¾?å¤?æ??ç??精度/å¼?é??å¤?ç??æ?ºå?¶ã??å? æ¤ï¼?â??空é?²é¡µé?¢è·?踪â?? å?? â??perf memâ?? å?¯ä»¥æ??ä¾? +DAMONè¾?å?ºç??ä¸?个å?é??ï¼?ä½?ä¸?è?½æ?¿ä»£DAMONã?? + + +DAMONæ?¯å?¦å?ªæ?¯æ??è??æ??å??å?ï¼? +========================= + +ä¸?ï¼?DAMONç??æ ¸å¿?æ?¯ç?¬ç«?äº?å?°å??空é?´ç??ã??ç?¨æ?·å?¯ä»¥å?¨DAMONæ ¸å¿?ä¸?å®?ç?°å??é??ç½®ç?¹å®?å?°å??空é?´ç??ä½?级å??å§? +é?¨å??ï¼?å??æ?¬ç??æµ?ç?®æ ?å?ºå??ç??æ??é? å??å®?é??ç??访é?®æ£?æ?¥ã??é??è¿?è¿?ç§?æ?¹å¼?ï¼?DAMONç?¨æ?·å?¯ä»¥ç?¨ä»»ä½?访é?®æ£?æ?¥æ?? +æ?¯æ?¥ç??æµ?ä»»ä½?å?°å??空é?´ã?? + +尽管å¦?æ¤ï¼?DAMONé»?认为è??æ??å??å?å??ç?©ç??å??å?æ??ä¾?äº?å?ºäº?vma/rmapè·?踪å??PTE访é?®ä½?æ£?æ?¥ç??å?°å??空é?´ +ç?¸å?³å??è?½ç??å®?ç?°ï¼?以ä¾?å??è??å??æ?¹ä¾¿ä½¿ç?¨ã?? + + +æ??å?¯ä»¥ç®?å??å?°ç??æµ?页é?¢ç??ç²?度å??ï¼? +============================== + +æ?¯ç??ï¼?ä½ å?¯ä»¥é??è¿?设置 ``min_nr_regions`` å±?æ?§é«?äº?å·¥ä½?é??大å°?é?¤ä»¥é¡µé?¢å¤§å°?ç??å?¼æ?¥å®?ç?°ã?? +å? 为ç??è§?ç?®æ ?å?ºå??ç??大å°?被强å?¶ä¸º ``>=page size`` ï¼?æ??以å?ºå??å??å?²ä¸?ä¼?产ç??ä»»ä½?å½±å??ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/damon/index.rst @@ -0,0 +1,32 @@ +.. SPDX-License-Identifier: GPL-2.0 + +:Original: Documentation/mm/damon/index.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +========================== +DAMON:æ?°æ?®è®¿é?®ç??è§?å?¨ +========================== + +DAMONæ?¯Linuxå??æ ¸ç??ä¸?个æ?°æ?®è®¿é?®ç??æ?§æ¡?æ?¶å?ç³»ç»?ã??DAMONç??æ ¸å¿?æ?ºå?¶ä½¿å?¶æ??为 +ï¼?è¯¥æ ¸å¿?æ?ºå?¶è¯¦è§?(Documentation/translations/zh_CN/mm/damon/design.rst)ï¼? + + - *å??确度* ï¼?ç??æµ?è¾?å?ºå¯¹DRAM级å?«ç??å??å?管ç??足å¤?æ??ç?¨ï¼?ä½?å?¯è?½ä¸?é??å??CPU Cache级å?«ï¼?ï¼? + - *è½»é??级* ï¼?ç??æ?§å¼?é??ä½?å?°å?¯ä»¥å?¨çº¿åº?ç?¨ï¼?ï¼?以å?? + - *å?¯æ?©å±?* ï¼?æ? 论ç?®æ ?å·¥ä½?è´?è½½ç??大å°?ï¼?å¼?é??ç??ä¸?é??å?¼é?½å?¨æ??å®?è??å?´å??ï¼?ã?? + +å? æ¤ï¼?å?©ç?¨è¿?个æ¡?æ?¶ï¼?å??æ ¸ç??å??å?管ç??æ?ºå?¶å?¯ä»¥å??å?ºé«?级å?³ç?ã??ä¼?导è?´é«?æ?°æ?®è®¿é?®ç??æ?§å¼?é??ç??å®? +éª?æ?§å??å?管ç??ä¼?å??å·¥ä½?å?¯ä»¥å??次è¿?è¡?ã??å??æ?¶ï¼?å?¨ç?¨æ?·ç©ºé?´ï¼?æ??ä¸?äº?ç?¹æ®?å·¥ä½?è´?è½½ç??ç?¨æ?·å?¯ä»¥ç¼?å?? +个æ?§å??ç??åº?ç?¨ç¨?åº?ï¼?以便æ?´å¥½å?°äº?解å??ä¼?å??ä»?们ç??å·¥ä½?è´?è½½å??ç³»ç»?ã?? + +.. toctree:: + :maxdepth: 2 + + faq + design + api --- /dev/null +++ a/Documentation/translations/zh_CN/mm/free_page_reporting.rst @@ -0,0 +1,38 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/_free_page_reporting.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + +========== +空é?²é¡µæ?¥å?? +========== + +空é?²é¡µæ?¥å??æ?¯ä¸?个APIï¼?设å¤?å?¯ä»¥é??è¿?å®?æ?¥æ³¨å??æ?¥æ?¶ç³»ç»?å½?å??æ?ªä½¿ç?¨ç??页é?¢å??表ã??è¿?å?¨è??æ?? +å??ç??æ??å?µä¸?æ?¯å¾?æ??ç?¨ç??ï¼?客æ?·æ?ºè?½å¤?使ç?¨è¿?äº?æ?°æ?®æ?¥é??ç?¥ç®¡ç??å?¨å®?ä¸?å??使ç?¨å??å?ä¸ç??æ??äº?页 +é?¢ã?? + +对äº?驱å?¨ï¼?é??常æ?¯æ°?ç??驱å?¨è¦?使ç?¨è¿?个å??è?½ï¼?å®?å°?å??é??å??å??å§?å??ä¸?个page_reporting_dev_info +ç»?æ??ä½?ã??å®?è¦?å¡«å??ç??ç»?æ??ä½?ä¸ç??å?段æ?¯ç?¨äº?å¤?ç??æ?£ç?¹å??表ç?? "report" å?½æ?°æ??é??ã??å®?è¿?å¿? +é¡»ä¿?è¯?æ¯?次è°?ç?¨è¯¥å?½æ?°æ?¶è?½å¤?ç??è?³å°?ç?¸å½?äº?PAGE_REPORTING_CAPACITYç??æ?£ç?¹å??表æ?¡ç?®ã?? +å??设没æ??å?¶ä»?页é?¢æ?¥å??设å¤?å·²ç»?注å??ï¼? 对page_reporting_registerç??è°?ç?¨å°?å??æ?¥å??æ¡? +æ?¶æ³¨å??页é?¢æ?¥å??æ?¥å?£ã?? + +ä¸?æ?¦æ³¨å??ï¼?页é?¢æ?¥å??APIå°?å¼?å§?å??驱å?¨æ?¥å??æ??æ?¹ç??页é?¢ã??APIå°?å?¨æ?¥å?£è¢«æ³¨å??å??2ç§?å¼?å§?æ?¥å?? +页é?¢ï¼?并å?¨ä»»ä½?足å¤?é«?ç??页é?¢è¢«é??æ?¾ä¹?å??2ç§?继ç»æ?¥å??ã?? + +æ?¥å??ç??页é?¢å°?被å?å?¨å?¨ä¼ é??ç»?æ?¥å??å?½æ?°ç??æ?£å??表ä¸ï¼?æ??å??ä¸?个æ?¡ç?®ç??ç»?æ??ä½?被设置å?¨æ?¡ç?® +nent-1ä¸ã?? å½?页é?¢è¢«æ?¥å??å?½æ?°å¤?ç??æ?¶ï¼?å??é??å?¨å°?æ? æ³?访é?®å®?们ã??ä¸?æ?¦æ?¥å??å?½æ?°å®?æ??ï¼?è¿?äº? +页å°?被è¿?å??å?°å®?们æ??è?·å¾?ç??è?ªç?±å?ºå??ã?? + +å?¨ç§»é?¤ä½¿ç?¨ç©ºé?²é¡µæ?¥å??ç??驱å?¨ä¹?å??ï¼?æ??å¿?è¦?è°?ç?¨page_reporting_unregisterï¼?以移é?¤ +ç?®å??被空é?²é¡µæ?¥å??使ç?¨ç??page_reporting_dev_infoç»?æ??ä½?ã??è¿?æ ·å??å°?é?»æ¢è¿?ä¸?æ¥ç??æ?¥ +å??é??è¿?该æ?¥å?£å??å?ºã??å¦?æ??å?¦ä¸?个驱å?¨æ??å??ä¸?驱å?¨è¢«æ³¨å??ï¼?å®?å°±æ??å?¯è?½æ?¢å¤?å??ä¸?个驱å?¨å?¨æ?¥å?? +空é?²é¡µæ?¹é?¢ç??å·¥ä½?ã?? + + +Alexander Duyck, 2019å¹´12æ??04æ?¥ --- /dev/null +++ a/Documentation/translations/zh_CN/mm/frontswap.rst @@ -0,0 +1,196 @@ +:Original: Documentation/mm/_free_page_reporting.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + +========= +Frontswap +========= + +Frontswap为交æ?¢é¡µæ??ä¾?äº?ä¸?个 â??transcendent memoryâ?? ç??æ?¥å?£ã??å?¨ä¸?äº?ç?¯å¢?ä¸ï¼?ç?± +äº?交æ?¢é¡µè¢«ä¿?å?å?¨RAMï¼?æ??类似RAMç??设å¤?ï¼?ä¸ï¼?è??ä¸?æ?¯äº¤æ?¢ç£?ç??ï¼?å? æ¤å?¯ä»¥è?·å¾?巨大ç??æ?§è?½ +è??ç??ï¼?æ??é«?ï¼?ã?? + +.. _Transcendent memory in a nutshell: https://lwn.net/Articles/454795/ + +Frontswapä¹?æ??以è¿?ä¹?å?½å??ï¼?æ?¯å? 为å®?å?¯ä»¥è¢«è®¤ä¸ºæ?¯ä¸?swap设å¤?ç??â??backâ??å?å?¨ç?¸å??ã??å? +å?¨å?¨è¢«è®¤ä¸ºæ?¯ä¸?个å??æ¥å¹¶å??å®?å?¨ç??é?¢å??页é?¢ç??â??伪RAM设å¤?â??ï¼?符å??transcendent memory +ï¼?å¦?Xenç??â??tmemâ??ï¼?æ??å??æ ¸å??å??缩å??å?ï¼?å??称â??zcacheâ??ï¼?æ??æ?ªæ?¥ç??类似RAMç??设å¤?ï¼?ç??è¦? +æ±?ï¼?è¿?个伪RAM设å¤?ä¸?è?½è¢«å??æ ¸ç?´æ?¥è®¿é?®æ??寻å??ï¼?å?¶å¤§å°?æ?ªç?¥ä¸?å?¯è?½é??æ?¶é?´å??å??ã??驱å?¨ç¨?åº?é??è¿? +è°?ç?¨frontswap_register_opså°?è?ªå·±ä¸?frontswapé?¾æ?¥èµ·æ?¥ï¼?以é??å½?å?°è®¾ç½®frontswap_ops +ç??å??è?½ï¼?å®?æ??ä¾?ç??å??è?½å¿?须符å??æ??äº?ç?ç?¥ï¼?å¦?ä¸?æ??示: + +ä¸?个 â??initâ?? å°?设å¤?å??å¤?好æ?¥æ?¶ä¸?æ??å®?ç??交æ?¢è®¾å¤?ç¼?å?·ï¼?å??称â??ç±»å??â??ï¼?ç?¸å?³ç??frontswap +交æ?¢é¡µã??ä¸?个 â??storeâ?? å°?æ??该页å¤?å?¶å?°transcendent memoryï¼?并ä¸?该页ç??ç±»å??å??å??移 +é??ç?¸å?³è??ã??ä¸?个 â??loadâ?? å°?æ??该页ï¼?å¦?æ??æ?¾å?°ç??è¯?ï¼?ä»?transcendent memoryå¤?å?¶å?°å??æ ¸ +å??å?ï¼?ä½?ä¸?ä¼?ä»?transcendent memoryä¸å? é?¤è¯¥é¡µã??ä¸?个 â??invalidate_pageâ?? å°?ä»? +transcendent memoryä¸å? é?¤è¯¥é¡µï¼?ä¸?个 â??invalidate_areaâ?? å°?å? é?¤æ??æ??ä¸?交æ?¢ç±»å?? +ç?¸å?³ç??页ï¼?ä¾?å¦?ï¼?å??swapoffï¼?并é??ç?¥ â??deviceâ?? æ??ç»?è¿?ä¸?æ¥å?å?¨è¯¥äº¤æ?¢ç±»å??ã?? + +ä¸?æ?¦ä¸?个页é?¢è¢«æ??å??å?å?¨ï¼?å?¨è¯¥é¡µé?¢ä¸?ç??å?¹é??å? è½½é??常ä¼?æ??å??ã??å? æ¤ï¼?å½?å??æ ¸å??ç?°è?ªå·±å¤?äº?é?? +è¦?交æ?¢é¡µé?¢ç??æ??å?µæ?¶ï¼?å®?é¦?å??å°?è¯?使ç?¨frontswapã??å¦?æ??å?å?¨ç??ç»?æ??æ?¯æ??å??ç??ï¼?é?£ä¹?æ?°æ?®å°±å·² +ç»?æ??å??ç??ä¿?å?å?°äº?transcendent memoryä¸ï¼?并ä¸?é?¿å??äº?ç£?ç??å??å?¥ï¼?å¦?æ??å??æ?¥å??读å??æ?°æ?®ï¼? +ä¹?é?¿å??äº?ç£?ç??读å??ã??å¦?æ??å?å?¨è¿?å??失败ï¼?transcendent memoryå·²ç»?æ??ç»?äº?该æ?°æ?®ï¼?ä¸?该页 +å?¯ä»¥å??å¾?常ä¸?æ ·è¢«å??å?¥äº¤æ?¢ç©ºé?´ã?? + +请注æ??ï¼?å¦?æ??ä¸?个页é?¢è¢«å?å?¨ï¼?è??该页é?¢å·²ç»?å?å?¨äº?transcendent memoryä¸ï¼?ä¸?个 â??é??å¤?â?? +ç??å?å?¨ï¼?ï¼?è¦?ä¹?å?å?¨æ??å??ï¼?æ?°æ?®è¢«è¦?ç??ï¼?è¦?ä¹?å?å?¨å¤±è´¥ï¼?该页é?¢è¢«åº?æ¢ã??è¿?ç¡®ä¿?äº?æ?§ç??æ?°æ?®æ°¸è¿? +ä¸?ä¼?ä»?frontswapä¸è?·å¾?ã?? + +å¦?æ??é??ç½®æ£ç¡®ï¼?对frontswapç??ç??æ?§æ?¯é??è¿? `/sys/kernel/debug/frontswap` ç?®å½?ä¸?ç?? +debugfså®?æ??ç??ã??frontswapç??æ??æ??æ?§å?¯ä»¥é??è¿?以ä¸?æ?¹å¼?æµ?é??ï¼?å?¨æ??æ??交æ?¢è®¾å¤?ä¸ï¼?: + +``failed_stores`` + æ??å¤?å°?次å?å?¨ç??å°?è¯?æ?¯å¤±è´¥ç?? + +``loads`` + å°?è¯?äº?å¤?å°?次å? è½½ï¼?åº?该å?¨é?¨æ??å??ï¼? + +``succ_stores`` + æ??å¤?å°?次å?å?¨ç??å°?è¯?æ?¯æ??å??ç?? + +``invalidates`` + å°?è¯?äº?å¤?å°?次ä½?åº? + +å??å?°å®?ç?°å?¯ä»¥æ??ä¾?é¢?å¤?ç??æ??æ ?ã?? + +ç»?常é?®å?°ç??é?®é¢? +============== + +* ä»·å?¼å?¨å?ªé??? + +å½?ä¸?个工ä½?è´?è½½å¼?å§?交æ?¢æ?¶ï¼?æ?§è?½å°±ä¼?ä¸?é??ã??Frontswapé??è¿?æ??ä¾?ä¸?个干å??ç??ã??å?¨æ??ç??æ?¥å?£æ?¥ +读å??å??å??å?¥äº¤æ?¢é¡µå?° â??transcendent memoryâ??ï¼?ä»?è??大大å¢?å? äº?许å¤?è¿?æ ·ç??å·¥ä½?è´?è½½ç??æ?§ +è?½ï¼?å?¦å??å??æ ¸æ?¯æ? æ³?ç?´æ?¥å¯»å??ç??ã??å½?æ?°æ?®è¢«è½¬æ?¢ä¸ºä¸?å??ç??å½¢å¼?å??大å°?ï¼?æ¯?å¦?å??缩ï¼?æ??è??被ç§?å¯? +移å?¨ï¼?对äº?ä¸?äº?类似RAMç??设å¤?æ?¥è¯´ï¼?è¿?å?¯è?½å¯¹å??平衡å¾?æ??ç?¨ï¼?æ?¶ï¼?è¿?个æ?¥å?£æ?¯ç??æ?³ç??ã??交æ?¢ +页ï¼?å??被驱é??ç??页é?¢ç¼?å?页ï¼?æ?¯è¿?ç§?æ¯?RAMæ?¢ä½?æ¯?ç£?ç??å¿«å¾?å¤?ç??â??伪RAM设å¤?â??ç??ä¸?大ç?¨é??ã?? + +Frontswap对å??æ ¸ç??å½±å??ç?¸å½?å°?ï¼?为å??ç§?ç³»ç»?é??ç½®ä¸æ?´å?¨æ??ã??æ?´ç?µæ´»ç??RAMå?©ç?¨æ??ä¾?äº?巨大ç?? +ç?µæ´»æ?§ï¼? + +å?¨å??ä¸?å??æ ¸ç??æ??å?µä¸?ï¼?å??称â??zcacheâ??ï¼?页é?¢è¢«å??缩并å?å?¨å?¨æ?¬å?°å??å?ä¸ï¼?ä»?è??å¢?å? äº?å?¯ä»¥å®? +å?¨ä¿?å?å?¨RAMä¸ç??å?¿å??页é?¢æ?»æ?°ã??Zcacheæ?¬è´¨ä¸?æ?¯ç?¨å??缩/解å??缩ç??CPUå?¨æ??æ?¢å??æ?´å¥½ç??å??å?å?© +ç?¨ç??ã??Benchmarksæµ?è¯?æ?¾ç¤ºï¼?å½?å??å?å??å??è¾?ä½?æ?¶ï¼?å? ä¹?没æ??å½±å??ï¼?è??å?¨é«?å??å?å??å??ä¸?ç??ä¸?äº? +å·¥ä½?è´?è½½ä¸?ï¼?å??æ??æ??æ?¾ç??æ?§è?½æ?¹å??ï¼?25%以ä¸?ï¼?ã?? + +â??RAMsterâ?? å?¨zcacheç??å?ºç¡?ä¸?å¢?å? äº?对é??群系ç»?ç?? â??peer-to-peerâ?? transcendent memory +ç??æ?¯æ??ã??Frontswap页é?¢å??zcacheä¸?æ ·è¢«æ?¬å?°å??缩ï¼?ä½?é??å??被â??remotifiedâ?? å?°å?¦ä¸?个系 +ç»?ç??RAMã??è¿?使å¾?RAMå?¯ä»¥æ ¹æ?®é??è¦?å?¨æ??å?°æ?¥å??è´?载平衡ï¼?ä¹?å°±æ?¯è¯´ï¼?å½?ç³»ç»?Aè¶?è½½æ?¶ï¼?å®?å?¯ä»¥ +交æ?¢å?°ç³»ç»?Bï¼?å??ä¹?亦ç?¶ã??RAMsterä¹?å?¯ä»¥è¢«é??ç½®æ??ä¸?个å??å?æ??å?¡å?¨ï¼?å? æ¤é??群ä¸ç??许å¤?æ??å?¡å?¨ +å?¯ä»¥æ ¹æ?®é??è¦?å?¨æ??å?°äº¤æ?¢å?°é??ç½®æ??大é??å??å?ç??å??ä¸?æ??å?¡å?¨ä¸?......è??ä¸?é??è¦?é¢?å??é??ç½®æ¯?个客æ?· +æ??å¤?å°?å??å?å?¯ç?¨ + +å?¨è??æ??æ??å?µä¸?ï¼?è??æ??å??ç??å?¨é?¨æ??ä¹?å?¨äº?ç»?计å?°å°?ç?©ç??èµ?æº?å?¨å¤?个è??æ??æ?ºç??ä¸?å??é??æ±?ä¹?é?´è¿?è¡?å¤? +ç?¨ã??对äº?RAMæ?¥è¯´ï¼?è¿?ç??ç??å¾?é?¾å??å?°ï¼?è??ä¸?å?¨ä¸?æ?¹å??å??æ ¸ç??æ??å?µä¸?ï¼?è¦?å??好è¿?ä¸?ç?¹ç??å?ªå??å?ºæ?¬ä¸? +æ?¯å¤±è´¥ç??ï¼?é?¤äº?ä¸?äº?广为人ç?¥ç??ç?¹æ®?æ??å?µä¸?ç??å·¥ä½?è´?è½½ï¼?ã??å?·ä½?æ?¥è¯´ï¼?Xen Transcendent Memory +å??端å??许管ç??å?¨æ?¥æ??ç??RAM â??fallowâ??ï¼?ä¸?ä»?å?¯ä»¥å?¨å¤?个è??æ??æ?ºä¹?é?´è¿?è¡?â??time-sharedâ??ï¼? +è??ä¸?页é?¢å?¯ä»¥è¢«å??缩å??é??å¤?å?©ç?¨ï¼?以ä¼?å??RAMç??å?©ç?¨ç??ã??å½?客æ?·æ??ä½?ç³»ç»?被诱导交å?ºæ?ªå??å??å?©ç?¨ +ç??RAMæ?¶ï¼?å¦? â??selfballooningâ??ï¼?ï¼?çª?ç?¶å?ºç?°ç??æ??å¤?å??å?å??å??å?¯è?½ä¼?导è?´äº¤æ?¢ï¼?frontswap +å??许è¿?äº?页é?¢è¢«äº¤æ?¢å?°ç®¡ç??å?¨RAMä¸æ??ä»?管ç??å?¨RAMä¸äº¤æ?¢ï¼?å¦?æ??æ?´ä½?主æ?ºç³»ç»?å??å?æ?¡ä»¶å??许ï¼?ï¼? +ä»?è??å??轻计å??å¤?交æ?¢å?¯è?½å¸¦æ?¥ç??å?¯æ??ç??æ?§è?½å½±å??ã?? + +ä¸?个KVMç??å®?ç?°æ£å?¨è¿?è¡?ä¸ï¼?并ä¸?å·²ç»?被RFC'edå?°lkmlã??è??ä¸?ï¼?å?©ç?¨frontswapï¼?对NVMä½?为 +å??å?æ?©å±?æ??æ?¯ç??è°?æ?¥ä¹?å?¨è¿?è¡?ä¸ã?? + +* å½?ç?¶ï¼?å?¨æ??äº?æ??å?µä¸?å?¯è?½æ??æ?§è?½ä¸?ç??ä¼?å?¿ï¼?ä½?frontswapç??空é?´/æ?¶é?´å¼?é??æ?¯å¤?å°?ï¼? + +å¦?æ?? CONFIG_FRONTSWAP 被ç¦?ç?¨ï¼?æ¯?个 frontswap é?©å?é?½ä¼?ç¼?è¯?æ??空ï¼?å?¯ä¸?ç??å¼?é??æ?¯æ¯? +个 swapon'ed swap 设å¤?ç??å? 个é¢?å¤?å?è??ã??å¦?æ?? CONFIG_FRONTSWAP 被å?¯ç?¨ï¼?ä½?没æ?? +frontswapç?? â??backendâ?? å¯?å?å?¨ï¼?æ¯?读æ??å??ä¸?个交æ?¢é¡µå°±ä¼?æ??ä¸?个é¢?å¤?ç??å?¨å±?å??é??ï¼?è??ä¸? +æ?¯é?¶ã??å¦?æ?? CONFIG_FRONTSWAP 被å?¯ç?¨ï¼?并ä¸?æ??ä¸?个frontswapç??backendå¯?å?å?¨ï¼?并ä¸? +å??端æ¯?次 â??storeâ?? 请æ±?é?½å¤±è´¥ï¼?å?³å°½ç®¡å£°ç§°å?¯è?½ï¼?ä½?没æ??æ??ä¾?å??å?ï¼?ï¼?CPU ç??å¼?é??ä»?ç?¶å?¯ä»¥ +忽ç?¥ä¸?计 - å? 为æ¯?次frontswap失败é?½æ?¯å?¨äº¤æ?¢é¡µå??å?°ç£?ç??ä¹?å??ï¼?ç³»ç»?å¾?å?¯è?½æ?¯ I/O ç»?å®? +ç??ï¼?æ? 论å¦?ä½?使ç?¨ä¸?å°?é?¨å??ç?? CPU é?½æ?¯ä¸?ç?¸å?³ç??ã?? + +è?³äº?空é?´ï¼?å¦?æ??CONFIG_FRONTSWAP被å?¯ç?¨ï¼?并ä¸?æ??ä¸?个frontswapç??backend注å??ï¼?é?£ä¹? +æ¯?个交æ?¢è®¾å¤?ç??æ¯?个交æ?¢é¡µé?½ä¼?被å??é??ä¸?个æ¯?ç?¹ã??è¿?æ?¯å?¨å??æ ¸å·²ç»?为æ¯?个交æ?¢è®¾å¤?ç??æ¯?个交æ?¢ +页å??é??ç??8ä½?ï¼?å?¨2.6.34ä¹?å??æ?¯16ä½?ï¼?ä¸?å¢?å? ç??ã??(Hugh Dickinsè§?å¯?å?°ï¼?frontswapå?¯è?½ +ä¼?å?·å??ç?°æ??ç??8个æ¯?ç?¹ï¼?ä½?æ?¯æ??们以å??å??æ?¥æ??å¿?è¿?个å°?ç??ä¼?å??é?®é¢?)ã??对äº?æ ?å??ç??4K页é?¢å¤§å°?ç?? +é??常大ç??交æ?¢ç??ï¼?è¿?å¾?ç½?è§?ï¼?ï¼?è¿?æ?¯æ¯?32GB交æ?¢ç??1MBå¼?é??ã?? + +å½?交æ?¢é¡µå?å?¨å?¨transcendent memoryä¸è??ä¸?æ?¯å??å?°ç£?ç??ä¸?æ?¶ï¼?æ??ä¸?个å?¯ä½?ç?¨ï¼?å?³è¿?å?¯è?½ä¼? +产ç??æ?´å¤?ç??å??å?å??å??ï¼?æ??å?¯è?½è¶?è¿?å?¶ä»?ç??ä¼?ç?¹ã??ä¸?个backendï¼?æ¯?å¦?zcacheï¼?å¿?é¡»å®?ç?°ç?ç?¥ +æ?¥ä»?ç»?ï¼?ä½?å?¨æ??å?°ï¼?管ç??å??å?é??å?¶ï¼?以确ä¿?è¿?ç§?æ??å?µä¸?ä¼?å??ç??ã?? + +* 好å?§ï¼?é?£å°±ç?¨å??æ ¸éª?客è?½ç??解ç??æ?¯è¯æ?¥å¿«é??æ¦?è¿°ä¸?ä¸?è¿?个frontswapè¡¥ä¸?ç??ä½?ç?¨å¦?ä½?ï¼? + +æ??们å??设å?¨å??æ ¸å??å§?å??è¿?ç¨?ä¸ï¼?ä¸?个frontswap ç?? â??backendâ?? å·²ç»?注å??äº?ï¼?è¿?个注å??表 +æ??è¿?个frontswap ç?? â??backendâ?? å?¯ä»¥è®¿é?®ä¸?äº?ä¸?被å??æ ¸ç?´æ?¥è®¿é?®ç??â??å??å?â??ã??å®?å?°åº?æ?? +ä¾?äº?å¤?å°?å??å?æ?¯å®?å?¨å?¨æ??å??é??æ?ºç??ã?? + +æ¯?å½?ä¸?个交æ?¢è®¾å¤?被交æ?¢æ?¶ï¼?å°±ä¼?è°?ç?¨frontswap_init()ï¼?æ??交æ?¢è®¾å¤?ç??ç¼?å?·ï¼?å??称â??ç±» +å??â??ï¼?ä½?为ä¸?个å??æ?°ä¼ ç»?å®?ã??è¿?å°±é??ç?¥äº?frontswapï¼?以æ??å¾? â??storeâ?? ä¸?该å?·ç ?ç?¸å?³ç??交 +æ?¢é¡µç??å°?è¯?ã?? + +æ¯?å½?交æ?¢å?ç³»ç»?å??å¤?å°?ä¸?个页é?¢å??å?¥äº¤æ?¢è®¾å¤?æ?¶ï¼?å??è§?swap_writepage()ï¼?ï¼?å°±ä¼?è°?ç?¨ +frontswap_storeã??Frontswapä¸?frontswap backendå??å??ï¼?å¦?æ??backend说å®?没æ??空 +é?´ï¼?frontswap_storeè¿?å??-1ï¼?å??æ ¸å°±ä¼?ç?§å¸¸æ??页æ?¢å?°äº¤æ?¢è®¾å¤?ä¸?ã??注æ??ï¼?æ?¥è?ªfrontswap +backendç??å??åº?对å??æ ¸æ?¥è¯´æ?¯ä¸?å?¯é¢?æµ?ç??ï¼?å®?å?¯è?½é??æ?©ä»?ä¸?æ?¥å??ä¸?个页é?¢ï¼?å?¯è?½æ?¥å??æ¯?ä¹?个 +页é?¢ï¼?ä¹?å?¯è?½æ?¥å??æ¯?ä¸?个页é?¢ã??ä½?æ?¯å¦?æ??backendç¡®å®?æ?¥å??äº?ä¸?个页é?¢ï¼?é?£ä¹?è¿?个页é?¢ç??æ?° +æ?®å·²ç»?被å¤?å?¶å¹¶ä¸?ç±»å??å??å??移é??ç?¸å?³è??äº?ï¼?è??ä¸?backendä¿?è¯?äº?æ?°æ?®ç??æ??ä¹?æ?§ã??å?¨è¿?ç§?æ??å?µ +ä¸?ï¼?frontswapå?¨äº¤æ?¢è®¾å¤?ç??â??frontswap_mapâ?? ä¸è®¾ç½®äº?ä¸?个ä½?ï¼?对åº?äº?交æ?¢è®¾å¤?ä¸?ç?? +页é?¢å??移é??ï¼?å?¦å??å®?å°±ä¼?å°?æ?°æ?®å??å?¥è¯¥è®¾å¤?ã?? + +å½?交æ?¢å?ç³»ç»?é??è¦?交æ?¢ä¸?个页é?¢æ?¶ï¼?swap_readpage()ï¼?ï¼?å®?é¦?å??è°?ç?¨frontswap_load()ï¼? +æ£?æ?¥frontswap_mapï¼?ç??è¿?个页é?¢æ?¯å?¦æ?©å??被frontswap backendæ?¥å??ã??å¦?æ??æ?¯ï¼?该页 +ç??æ?°æ?®å°±ä¼?ä»?frontswapå??端填å??ï¼?æ?¢å?¥å°±å®?æ??äº?ã??å¦?æ??ä¸?æ?¯ï¼?æ£å¸¸ç??交æ?¢ä»£ç ?å°?被æ?§è¡?ï¼? +以便ä»?ç??æ£ç??交æ?¢è®¾å¤?ä¸?è?·å¾?è¿?ä¸?页ç??æ?°æ?®ã?? + +æ??以æ¯?次frontswap backendæ?¥å??ä¸?个页é?¢æ?¶ï¼?交æ?¢è®¾å¤?ç??读å??å??ï¼?å?¯è?½ï¼?交æ?¢è®¾å¤?ç??å?? +å?¥é?½è¢« â??frontswap backend storeâ?? å??ï¼?å?¯è?½ï¼?â??frontswap backend loadsâ?? +æ??å??代ï¼?è¿?å?¯è?½ä¼?å¿«å¾?å¤?ã?? + +* frontswapä¸?è?½è¢«é??置为ä¸?个 â??ç?¹æ®?ç??â?? 交æ?¢è®¾å¤?ï¼?å®?ç??ä¼?å??级è¦?é«?äº?ä»»ä½?ç??æ£ç??交æ?¢ + 设å¤?ï¼?ä¾?å¦?å??zswapï¼?æ??è??å?¯è?½æ?¯swap-over-nbd/NFSï¼?ï¼? + +é¦?å??ï¼?ç?°æ??ç??交æ?¢å?ç³»ç»?ä¸?å??许æ??ä»»ä½?ç§?ç±»ç??交æ?¢å±?次ç»?æ??ã??ä¹?许å®?å?¯ä»¥è¢«é??å??以é??åº?å±?次 +ç»?æ??ï¼?ä½?è¿?å°?é??è¦?ç?¸å½?大ç??æ?¹å??ã??å?³ä½¿å®?被é??å??ï¼?ç?°æ??ç??交æ?¢å?ç³»ç»?ä¹?使ç?¨äº?å??I/Oå±?ï¼?å®? +å??å®?交æ?¢è®¾å¤?æ?¯å?ºå®?大å°?ç??ï¼?å?¶ä¸ç??ä»»ä½?页é?¢é?½æ?¯å?¯çº¿æ?§å¯»å??ç??ã??Frontswapå? ä¹?没æ??触 +å??ç?°æ??ç??交æ?¢å?ç³»ç»?ï¼?è??æ?¯å?´ç»?ç??å??I/Oå?ç³»ç»?ç??é??å?¶ï¼?æ??ä¾?äº?大é??ç??ç?µæ´»æ?§å??å?¨æ??æ?§ã?? + +ä¾?å¦?ï¼?frontswap backend对任ä½?交æ?¢é¡µç??æ?¥å??æ?¯å®?å?¨ä¸?å?¯é¢?æµ?ç??ã??è¿?对frontswap backend +ç??å®?ä¹?è?³å?³é??è¦?ï¼?å? 为å®?èµ?äº?äº?backendå®?å?¨å?¨æ??ç??å?³å®?æ??ã??å?¨zcacheä¸ï¼?人们æ? æ³?é¢? +å??ç?¥é??ä¸?个页é?¢ç??å?¯å??缩æ?§å¦?ä½?ã??å?¯å??缩æ?§ â??å·®â?? ç??页é?¢ä¼?被æ??ç»?ï¼?è?? â??å·®â?? æ?¬èº«ä¹?å?¯ +ä»¥æ ¹æ?®å½?å??ç??å??å?é??å?¶å?¨æ??å?°å®?ä¹?ã?? + +æ¤å¤?ï¼?frontswapæ?¯å®?å?¨å??æ¥ç??ï¼?è??ç??æ£ç??交æ?¢è®¾å¤?ï¼?æ ¹æ?®å®?ä¹?ï¼?æ?¯å¼?æ¥ç??ï¼?并ä¸?使ç?¨ +å??I/Oã??å??I/Oå±?ä¸?ä»?æ?¯ä¸?å¿?è¦?ç??ï¼?è??ä¸?å?¯è?½è¿?è¡? â??ä¼?å??â??ï¼?è¿?对é?¢å??RAMç??设å¤?æ?¥è¯´æ?¯ +ä¸?å??é??ç??ï¼?å??æ?¬å°?ä¸?äº?页é?¢ç??å??å?¥å»¶è¿?ç?¸å½?é?¿ç??æ?¶é?´ã??å??æ¥æ?¯å¿?é¡»ç??ï¼?以确ä¿?å??端ç??å?¨ +æ??æ?§ï¼?并é?¿å??æ£?æ??ç??ç«?äº?æ?¡ä»¶ï¼?è¿?å°?ä¸?å¿?è¦?å?°å¤§å¤§å¢?å? frontswapå??/æ??å??I/Oå?ç³»ç»?ç?? +å¤?æ??æ?§ã??ä¹?å°±æ?¯è¯´ï¼?å?ªæ??æ??å??ç?? â??storeâ?? å?? â??loadâ?? æ??ä½?æ?¯é??è¦?å??æ¥ç??ã??ä¸?个ç?¬ç«? +ç??å¼?æ¥çº¿ç¨?å?¯ä»¥è?ªç?±å?°æ??ä½?ç?±frontswapå?å?¨ç??页é?¢ã??ä¾?å¦?ï¼?RAMsterä¸ç?? â??remotificationâ?? +线ç¨?使ç?¨æ ?å??ç??å¼?æ¥å??æ ¸å¥?æ?¥å?ï¼?å°?å??缩ç??frontswap页é?¢ç§»å?¨å?°è¿?ç¨?æ?ºå?¨ã??å??æ ·ï¼? +KVMç??客æ?·æ?¹å®?ç?°å?¯ä»¥è¿?è¡?客æ?·å??å??缩ï¼?并使ç?¨ â??batchedâ?? hypercallsã?? + +å?¨è??æ??å??ç?¯å¢?ä¸ï¼?å?¨æ??æ?§å??许管ç??ç¨?åº?ï¼?æ??主æ?ºæ??ä½?ç³»ç»?ï¼?å??â??intelligent overcommitâ??ã?? +ä¾?å¦?ï¼?å®?å?¯ä»¥é??æ?©å?ªæ?¥å??页é?¢ï¼?ç?´å?°ä¸»æ?ºäº¤æ?¢å?¯è?½å?³å°?å??ç??ï¼?ç?¶å??强迫客æ?·æ?ºå??ä»?们 +è?ªå·±ç??交æ?¢ã?? + +transcendent memoryè§?æ ¼ç??frontswapæ??ä¸?个å??å¤?ã??å? 为任ä½? â??storeâ?? é?½å?¯ +è?½å¤±è´¥ï¼?æ??以å¿?é¡»å?¨ä¸?个ç??æ£ç??交æ?¢è®¾å¤?ä¸?æ??ä¸?个ç??æ£ç??æ??槽æ?¥äº¤æ?¢é¡µé?¢ã??å? æ¤ï¼? +frontswapå¿?é¡»ä½?为æ¯?个交æ?¢è®¾å¤?ç?? â??å½±å?â?? æ?¥å®?ç?°ï¼?å®?æ??å?¯è?½å®¹çº³äº¤æ?¢è®¾å¤?å?¯è?½ +容纳ç??æ¯?ä¸?个页é?¢ï¼?ä¹?æ??å?¯è?½æ ¹æ?¬ä¸?容纳任ä½?页é?¢ã??è¿?æ??å?³ç??frontswapä¸?è?½å??å?«æ¯? +swap设å¤?æ?»æ?°æ?´å¤?ç??页é?¢ã??ä¾?å¦?ï¼?å¦?æ??å?¨æ??äº?å®?è£?ä¸?没æ??é??置交æ?¢è®¾å¤?ï¼?frontswap +就没æ??ç?¨ã??æ? 交æ?¢è®¾å¤?ç??便æ?ºå¼?设å¤?ä»?ç?¶å?¯ä»¥ä½¿ç?¨frontswapï¼?ä½?æ?¯è¿?ç§?设å¤?ç?? +backendå¿?é¡»é??ç½®æ??ç§? â??ghostâ?? 交æ?¢è®¾å¤?ï¼?并确ä¿?å®?æ°¸è¿?ä¸?ä¼?被使ç?¨ã?? + + +* 为ä»?ä¹?ä¼?æ??è¿?ç§?å?³äº? â??é??å¤?å?å?¨â?? ç??å¥?æ?ªå®?ä¹?ï¼?å¦?æ??ä¸?个页é?¢ä»¥å??被æ??å??å?°å?å?¨è¿?ï¼? + é?¾é??å®?ä¸?è?½æ?»æ?¯è¢«æ??å??å?°è¦?ç??å??ï¼? + +å? ä¹?æ?»æ?¯å?¯ä»¥ç??ï¼?ä¸?ï¼?æ??æ?¶ä¸?è?½ã??è??è??ä¸?个ä¾?å?ï¼?æ?°æ?®è¢«å??缩äº?ï¼?å??æ?¥ç??4K页é?¢è¢«å?? +缩å?°äº?1Kã??ç?°å?¨ï¼?æ??人è¯?å?¾ç?¨ä¸?å?¯å??缩ç??æ?°æ?®è¦?ç??该页ï¼?å? æ¤ä¼?å? ç?¨æ?´ä¸ª4Kã??ä½?æ?¯ +backend没æ??æ?´å¤?ç??空é?´äº?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?è¿?个å?å?¨å¿?须被æ??ç»?ã??æ¯?å½?frontswap +æ??ç»?ä¸?个ä¼?è¦?ç??ç??å?å?¨æ?¶ï¼?å®?ä¹?å¿?须使æ?§ç??æ?°æ?®ä½?åº?ï¼?并确ä¿?å®?ä¸?å??被访é?®ã??å? 为交 +æ?¢å?ç³»ç»?ä¼?æ??æ?°ç??æ?°æ?®å??å?°è¯»äº¤æ?¢è®¾å¤?ä¸?ï¼?è¿?æ?¯ç¡®ä¿?ä¸?è?´æ?§ç??æ£ç¡®å??æ³?ã?? + +* 为ä»?ä¹?frontswapè¡¥ä¸?ä¼?å??建æ?°ç??头æ??件swapfile.hï¼? + +frontswap代ç ?ä¾?èµ?äº?ä¸?äº?swapå?ç³»ç»?å??é?¨ç??æ?°æ?®ç»?æ??ï¼?è¿?äº?æ?°æ?®ç»?æ??å¤?å¹´æ?¥ä¸?ç?´ +å?¨é??æ??å??å?¨å±?ä¹?é?´æ?¥å??移å?¨ã??è¿?ä¼¼ä¹?æ?¯ä¸?个å??ç??ç??妥å??ï¼?å°?å®?们å®?ä¹?为å?¨å±?ï¼?ä½?å?¨ä¸? +个æ?°ç??å??å?«æ??件ä¸å£°æ??å®?们ï¼?该æ??件ä¸?被å??å?«swap.hç??大é??æº?æ??件æ??å??å?«ã?? + +Dan Magenheimerï¼?æ??å??æ?´æ?°äº?2012å¹´4æ??9æ?¥ --- /dev/null +++ a/Documentation/translations/zh_CN/mm/highmem.rst @@ -0,0 +1,128 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/highmem.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + +========== +é«?å??å?å¤?ç?? +========== + +ä½?è??: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx> + +.. contents:: :local: + +é«?å??å?æ?¯ä»?ä¹?ï¼? +============== + +å½?ç?©ç??å??å?ç??大å°?æ?¥è¿?æ??è¶?è¿?è??æ??å??å?ç??æ??大大å°?æ?¶ï¼?å°±ä¼?使ç?¨é«?å??å?ï¼?highmemï¼?ã??å?¨è¿?ä¸?ç?¹ä¸?ï¼?å?? +æ ¸ä¸?å?¯è?½å?¨ä»»ä½?æ?¶å??é?½ä¿?æ??æ??æ??å?¯ç?¨ç??ç?©ç??å??å?ç??æ? å°?ã??è¿?æ??å?³ç??å??æ ¸é??è¦?å¼?å§?使ç?¨å®?æ?³è®¿é?®ç??ç?©ç??å?? +å?ç??临æ?¶æ? å°?ã?? + +没æ??被永ä¹?æ? å°?è¦?ç??ç??é?£é?¨å??ï¼?ç?©ç??ï¼?å??å?å°±æ?¯æ??们æ??说ç?? "é«?å??å?"ã??对äº?è¿?个边ç??ç??ç¡®å??ä½?ç½®ï¼?æ?? +å??ç§?æ?¶æ??ä¸?ç??é??å?¶ã?? + +ä¾?å¦?ï¼?å?¨i386æ?¶æ??ä¸ï¼?æ??们é??æ?©å°?å??æ ¸æ? å°?å?°æ¯?个è¿?ç¨?ç??è??æ??空é?´ï¼?è¿?æ ·æ??们就ä¸?å¿?为å??æ ¸ç??è¿?å?¥/é?? +å?ºä»?å?ºå?¨é?¨ç??TLBä½?åº?代价ã??è¿?æ??å?³ç??å?¯ç?¨ç??è??æ??å??å?空é?´ï¼?i386ä¸?为4GiBï¼?å¿?é¡»å?¨ç?¨æ?·å??å??æ ¸ç©ºé?´ä¹? +é?´è¿?è¡?å??å??ã?? + +使ç?¨è¿?ç§?æ?¹æ³?ç??æ?¶æ??ç??ä¼ ç»?å??é??æ?¹å¼?æ?¯3:1ï¼?3GiBç?¨äº?ç?¨æ?·ç©ºé?´ï¼?顶é?¨ç??1GiBç?¨äº?å??æ ¸ç©ºé?´ã??:: + + +--------+ 0xffffffff + | Kernel | + +--------+ 0xc0000000 + | | + | User | + | | + +--------+ 0x00000000 + +è¿?æ??å?³ç??å??æ ¸å?¨ä»»ä½?æ?¶å??æ??å¤?å?¯ä»¥æ? å°?1GiBç??ç?©ç??å??å?ï¼?ä½?æ?¯ç?±äº?æ??们é??è¦?è??æ??å?°å??空é?´æ?¥å??å?¶ä»?äº? +æ??--å??æ?¬è®¿é?®å?¶ä½?ç?©ç??å??å?ç??临æ?¶æ? å°?--å®?é??ç??ç?´æ?¥æ? å°?é??常ä¼?æ?´å°?ï¼?é??常å?¨~896MiBå·¦å?³ï¼?ã?? + +å?¶ä»?æ??mmä¸?ä¸?æ??æ ?ç¾ç??TLBç??æ?¶æ??å?¯ä»¥æ??ç?¬ç«?ç??å??æ ¸å??ç?¨æ?·æ? å°?ã??ç?¶è??ï¼?ä¸?äº?硬件ï¼?å¦?ä¸?äº?ARMï¼?å?¨ä½¿ +ç?¨mmä¸?ä¸?æ??æ ?ç¾æ?¶ï¼?å?¶è??æ??空é?´æ??é??ã?? + + +临æ?¶è??æ??æ? å°? +============ + +å??æ ¸å??å?«å? ç§?å??建临æ?¶æ? å°?ç??æ?¹æ³?ã??: + +* vmap(). è¿?å?¯ä»¥ç?¨æ?¥å°?å¤?个ç?©ç??页é?¿æ??æ? å°?å?°ä¸?个è¿?ç»ç??è??æ??空é?´ã??å®?é??è¦?synchronization + æ?¥è§£é?¤æ? å°?ã?? + +* kmap(). è¿?å??许对å??个页é?¢è¿?è¡?ç?æ??æ? å°?ã??å®?é??è¦?synchronizationï¼?ä½?å?¨ä¸?å®?ç¨?度ä¸?被æ??é??ã?? + å½?以åµ?å¥?æ?¹å¼?使ç?¨æ?¶ï¼?å®?ä¹?å¾?容æ??å?ºç?°æ»é??ï¼?å? æ¤ä¸?建议å?¨æ?°ä»£ç ?ä¸ä½¿ç?¨å®?ã?? + +* kmap_atomic(). è¿?å??许对å??个页é?¢è¿?è¡?é??常ç?ç??æ?¶é?´æ? å°?ã??ç?±äº?æ? å°?被é??å?¶å?¨å??å¸?å®?ç??CPUä¸?ï¼? + å®?表ç?°å¾?å¾?好ï¼?ä½?å??å¸?ä»»å?¡å? æ¤è¢«è¦?æ±?ç??å?¨è¯¥CPUä¸?ç?´å?°å®?å®?æ??ï¼?以å??å?¶ä»?ä»»å?¡å??代å®?ç??æ? å°?ã?? + + kmap_atomic() ä¹?å?¯ä»¥ç?±ä¸æ?ä¸?ä¸?æ??使ç?¨ï¼?å? 为å®?ä¸?ç?¡ç? ï¼?è??ä¸?è°?ç?¨è??å?¯è?½å?¨è°?ç?¨kunmap_atomic() + ä¹?å??æ??ç?¡ç? ã?? + + å?¯ä»¥å??设k[un]map_atomic()ä¸?ä¼?失败ã?? + + +使ç?¨kmap_atomic +=============== + +ä½?æ?¶ä½?å?°ä½¿ç?¨ kmap_atomic() æ?¯å¾?ç?´æ?¥ç??ã??å½?代ç ?æ?³è¦?访é?®ä¸?个å?¯è?½ä»?é«?å??å?ï¼?è§?__GFP_HIGHMEMï¼? +å??é??ç??页é?¢ç??å??容æ?¶ï¼?ä¾?å¦?å?¨é¡µç¼?å?ä¸ç??页é?¢ï¼?å°±ä¼?使ç?¨å®?ã??该APIæ??两个å?½æ?°ï¼?å®?们ç??使ç?¨æ?¹å¼?ä¸? +ä¸?é?¢ç±»ä¼¼:: + + /* æ?¾å?°æ??å?´è¶£ç??页é?¢ã?? */ + struct page *page = find_get_page(mapping, offset); + + /* è?·å¾?对该页å??容ç??访é?®æ??ã?? */ + void *vaddr = kmap_atomic(page); + + /* 对该页ç??å??容å??ä¸?äº?å¤?ç??ã?? */ + memset(vaddr, 0, PAGE_SIZE); + + /* 解é?¤è¯¥é¡µé?¢ç??æ? å°?ã?? */ + kunmap_atomic(vaddr); + +注æ??ï¼?kunmap_atomic()è°?ç?¨ç??æ?¯kmap_atomic()è°?ç?¨ç??ç»?æ??è??ä¸?æ?¯å??æ?°ã?? + +å¦?æ??ä½ é??è¦?æ? å°?两个页é?¢ï¼?å? ä¸ºä½ æ?³ä»?ä¸?个页é?¢å¤?å?¶å?°å?¦ä¸?个页é?¢ï¼?ä½ é??è¦?ä¿?æ??kmap_atomicè°?ç?¨ä¸¥ +æ ¼åµ?å¥?ï¼?å¦?:: + + vaddr1 = kmap_atomic(page1); + vaddr2 = kmap_atomic(page2); + + memcpy(vaddr1, vaddr2, PAGE_SIZE); + + kunmap_atomic(vaddr2); + kunmap_atomic(vaddr1); + + +临æ?¶æ? å°?ç??æ??æ?¬ +============== + +å??建临æ?¶æ? å°?ç??代价å?¯è?½ç?¸å½?é«?ã??ä½?ç³»æ?¶æ??å¿?é¡»æ??ä½?å??æ ¸ç??页表ã??æ?°æ?®TLBå??/æ??MMUç??å¯?å?å?¨ã?? + +å¦?æ??CONFIG_HIGHMEM没æ??被设置ï¼?é?£ä¹?å??æ ¸ä¼?å°?è¯?ç?¨ä¸?ç?¹è®¡ç®?æ?¥å??建æ? å°?ï¼?å°?页é?¢ç»?æ??å?°å??转æ?¢æ?? +æ??å??页é?¢å??容ç??æ??é??ï¼?è??ä¸?æ?¯å?»æ?£é¼?æ? å°?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?解æ? å°?æ??ä½?å?¯è?½æ?¯ä¸?个空æ??ä½?ã?? + +å¦?æ??CONFIG_MMU没æ??被设置ï¼?é?£ä¹?å°±ä¸?å?¯è?½æ??临æ?¶æ? å°?å??é«?å??å?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?ä¹?å°?使ç?¨è®¡ç®?æ?¹æ³?ã?? + + +i386 PAE +======== + +å?¨æ??äº?æ??å?µä¸?ï¼?i386 æ?¶æ??å°?å??è®¸ä½ å?¨ 32 ä½?æ?ºå?¨ä¸?å®?è£?å¤?è¾¾ 64GiB ç??å??å?ã??ä½?è¿?æ??ä¸?äº?å??æ??: + +* Linuxé??è¦?为系ç»?ä¸ç??æ¯?个页é?¢å»ºç«?ä¸?个页帧ç»?æ??ï¼?è??ä¸?页帧é??è¦?é©»å?¨æ°¸ä¹?æ? å°?ä¸ï¼?è¿?æ??å?³ç??ï¼? + +* ä½ æ??å¤?å?¯ä»¥æ??896M/sizeof(struct page)页帧ï¼?ç?±äº?页ç»?æ??ä½?æ?¯32å?è??ç??ï¼?æ??以æ??ç»?ä¼?æ?? + 112Gç??页ï¼?ç?¶è??ï¼?å??æ ¸é??è¦?å?¨å??å?ä¸å?å?¨æ?´å¤?ç??页帧...... + +* PAEä½¿ä½ ç??页表å??大--è¿?使系ç»?å??æ?¢ï¼?å? 为æ?´å¤?ç??æ?°æ?®é??è¦?å?¨TLBå¡«å??ç?æ?¹é?¢è¢«è®¿é?®ã??ä¸?个好å¤? + æ?¯ï¼?PAEæ??æ?´å¤?ç??PTEä½?ï¼?å?¯ä»¥æ??ä¾?å??NXå??PATè¿?æ ·ç??é«?级å??è?½ã?? + +ä¸?è?¬ç??建议æ?¯ï¼?ä½ ä¸?è¦?å?¨32ä½?æ?ºå?¨ä¸?使ç?¨è¶?è¿?8GiBç??空é?´--尽管æ?´å¤?ç??空é?´å?¯è?½å¯¹ä½ å??ä½ ç??å·¥ä½? +é??æ??ç?¨ï¼?ä½?ä½ å? ä¹?æ?¯é? ä½ è?ªå·±--ä¸?è¦?æ??æ??å??æ ¸å¼?å??è??ç??ç??ä¼?å¾?å?³å¿?äº?æ??ç??è¿?å±?æ??å?µã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/hmm.rst @@ -0,0 +1,361 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/hmm.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + +================== +å¼?æ??å??å?管ç?? (HMM) +================== + +æ??ä¾?å?ºç¡?设æ?½å??帮å?©ç¨?åº?以å°?é??常è§?å??å?ï¼?设å¤?å??å?ï¼?å¦?æ?¿ä¸? GPU å??å?ï¼?é??æ??å?°å¸¸è§?å??æ ¸è·¯å¾?ä¸ï¼?å?¶ +å?ºç?³æ?¯æ¤ç±»å??å?ç??ä¸?ç?¨struct pageï¼?请å??é??æ?¬æ??æ¡£ç??第 5 è?³ 7 è??ï¼?ã?? + +HMM è¿?为 SVMï¼?å?±äº«è??æ??å??å?ï¼?æ??ä¾?äº?å?¯é??ç??帮å?©ç¨?åº?ï¼?å?³å??许设å¤?é??æ??å?°è®¿é?®ä¸? CPU ä¸?è?´ç??ç¨?åº? +å?°å??ï¼?è¿?æ??å?³ç?? CPU ä¸?ç??ä»»ä½?æ??æ??æ??é??ä¹?æ?¯è¯¥è®¾å¤?ç??æ??æ??æ??é??ã??è¿?对äº?ç®?å??é«?级å¼?æ??计ç®?ç??使ç?¨å??å¾? +å¿?ä¸?å?¯å°?ï¼?å?¶ä¸ GPUã??DSP æ?? FPGA ç?¨äº?代表è¿?ç¨?æ?§è¡?å??ç§?计ç®?ã?? + +æ?¬æ??æ¡£å??为以ä¸?é?¨å??ï¼?å?¨ç¬¬ä¸?é?¨å??ä¸ï¼?æ??æ?示äº?ä¸?使ç?¨ç?¹å®?äº?设å¤?ç??å??å?å??é??å?¨ç?¸å?³ç??é?®é¢?ã??å?¨ç¬¬äº? +é?¨å??ä¸ï¼?æ??æ?示äº?许å¤?å¹³å?°å?ºæ??ç??硬件é??å?¶ã??第ä¸?é?¨å??æ¦?è¿°äº? HMM 设计ã??第å??é?¨å??解é??äº? CPU 页 +表é??å??ç??å·¥ä½?å??ç??以å?? HMM å?¨è¿?ç§?æ??å?µä¸?ç??ç?®ç??ã??第äº?é?¨å??å¤?ç??å??æ ¸ä¸å¦?ä½?表示设å¤?å??å?ã??æ??å??ï¼? +æ??å??ä¸?è??ä»?ç»?äº?ä¸?个æ?°ç??è¿?移å?©æ??ï¼?å®?å??许å?©ç?¨è®¾å¤? DMA å¼?æ??ã?? + +.. contents:: :local: + +使ç?¨ç?¹å®?äº?设å¤?ç??å??å?å??é??å?¨ç??é?®é¢? +================================ + +å?·æ??大é??æ?¿è½½å??å?ï¼?å? GBï¼?ç??设å¤?ï¼?å¦? GPUï¼?å??æ?¥é??è¿?ä¸?ç?¨é©±å?¨ç¨?åº?ç?¹å®? API 管ç??å?¶å??å?ã??è¿?ä¼? +é? æ??设å¤?驱å?¨ç¨?åº?å??é??å??管ç??ç??å??å?ä¸?常è§?åº?ç?¨ç¨?åº?å??å?ï¼?ç§?æ??å?¿å??ã??å?±äº«å??å?æ??常è§?æ??件æ?¯æ??å??å?ï¼? +ä¹?é?´ç??é??æ?ã??ä»?è¿?é??å¼?å§?ï¼?æ??å°?æ??è¿?个æ?¹é?¢ç§°ä¸ºå??å?²ç??å?°å??空é?´ã??æ??使ç?¨å?±äº«å?°å??空é?´æ?¥æ??代ç?¸å??ç??æ??å?µï¼? +å?³ï¼?设å¤?å?¯ä»¥é??æ??å?°ä½¿ç?¨ä»»ä½?åº?ç?¨ç¨?åº?å??å?å?ºå??ã?? + +å??å?²ç??å?°å??空é?´ç??å??ç??æ?¯å? 为设å¤?å?ªè?½è®¿é?®é??è¿?设å¤?ç?¹å®? API å??é??ç??å??å?ã??è¿?æ??å?³ç??ä»?设å¤?ç??è§?度æ?¥ +ç??ï¼?ç¨?åº?ä¸ç??æ??æ??å??å?对象并ä¸?å¹³ç?ï¼?è¿?使å¾?ä¾?èµ?äº?广æ³?ç??åº?ç??大å??ç¨?åº?å??å¾?å¤?æ??ã?? + +å?·ä½?æ?¥è¯´ï¼?è¿?æ??å?³ç??æ?³è¦?å?©ç?¨å?? GPU è¿?æ ·ç??设å¤?ç??代ç ?é??è¦?å?¨é??ç?¨å??é??ç??å??å?ï¼?mallocã??mmap +ç§?æ??ã??mmap å?±äº«ï¼?å??é??è¿?设å¤?驱å?¨ç¨?åº? API å??é??ç??å??å?ä¹?é?´å¤?å?¶å¯¹è±¡ï¼?è¿?ä»?ç?¶ä»¥ mmap ç»?æ??ï¼? +ä½?æ?¯æ?¯è®¾å¤?æ??件ï¼?ã?? + +对äº?å¹³é?¢æ?°æ?®é??ï¼?æ?°ç»?ã??ç½?æ ¼ã??å?¾å??â?¦â?¦ï¼?ï¼?è¿?并ä¸?é?¾å®?ç?°ï¼?ä½?对äº?å¤?æ??æ?°æ?®é??ï¼?å??表ã??æ ?â?¦â?¦ï¼?ï¼? +å¾?é?¾å??å?°æ£ç¡®ã??å¤?å?¶ä¸?个å¤?æ??ç??æ?°æ?®é??é??è¦?é??æ?°æ? å°?å?¶æ¯?个å??ç´ ä¹?é?´ç??æ??æ??æ??é??å?³ç³»ã??è¿?å¾?容æ??å?ºé??ï¼? +è??ä¸?ç?±äº?æ?°æ?®é??å??å?°å??ç??é??å¤?ï¼?ç¨?åº?æ?´é?¾è°?è¯?ã?? + +å??å?²å?°å??空é?´ä¹?æ??å?³ç??åº?ä¸?è?½é??æ??å?°ä½¿ç?¨å®?们ä»?æ ¸å¿?ç¨?åº?æ??å?¦ä¸?个åº?ä¸è?·å¾?ç??æ?°æ?®ï¼?å? æ¤æ¯?个åº?å?¯è?½ +ä¸?å¾?ä¸?使ç?¨è®¾å¤?ç?¹å®?ç??å??å?å??é??å?¨æ?¥é??å¤?å?¶è¾?å?¥æ?°æ?®é??ã??大å??项ç?®ä¼?å? æ¤å??å?°å½±å??ï¼?并å? 为å??ç§?å??å? +æ?·è´?è??浪费èµ?æº?ã?? + +å¤?å?¶æ¯?个åº?ç??API以æ?¥å??æ¯?个设å¤?ç?¹å®?å??é??å?¨å??é??ç??å??å?ä½?为è¾?å?¥æ??è¾?å?ºï¼?并ä¸?æ?¯ä¸?个å?¯è¡?ç??é??æ?©ã?? +è¿?å°?导è?´åº?å?¥å?£ç?¹ç??ç»?å??ç??ç?¸ã?? + +æ??å??ï¼?é??ç??é«?级è¯è¨?ç»?æ??ï¼?å?¨ C++ ä¸ï¼?å½?ç?¶ä¹?å?¨å?¶ä»?è¯è¨?ä¸ï¼?ç??è¿?æ¥ï¼?ç¼?è¯?å?¨ç?°å?¨æ??å?¯è?½å?¨æ²¡æ??ç¨? +åº?å??å¹²é¢?ç??æ??å?µä¸?å?©ç?¨ GPU å??å?¶ä»?设å¤?ã??æ??äº?ç¼?è¯?å?¨è¯?å?«ç??模å¼?ä»?é??ç?¨äº?å?±äº«å?°å??空é?´ã??对æ??æ?? +å?¶ä»?模å¼?ï¼?使ç?¨å?±äº«å?°å??空é?´ä¹?æ?´å??ç??ã?? + + +I/O æ?»çº¿ã??设å¤?å??å?ç?¹æ?§ +====================== + +ç?±äº?ä¸?äº?é??å?¶ï¼?I/O æ?»çº¿å??å¼±äº?å?±äº«å?°å??空é?´ã??大å¤?æ?° I/O æ?»çº¿å?ªå??许ä»?设å¤?å?°ä¸»å??å?ç??å?ºæ?¬ +å??å?访é?®ï¼?ç??è?³ç¼?å?ä¸?è?´æ?§é??常æ?¯å?¯é??ç??ã??ä»? CPU 访é?®è®¾å¤?å??å?ç??è?³æ?´å? æ??é??ã??é??常æ??å?µä¸?ï¼?å®? +ä¸?æ?¯ç¼?å?ä¸?è?´ç??ã?? + +å¦?æ??æ??们å?ªè??è?? PCIE æ?»çº¿ï¼?é?£ä¹?设å¤?å?¯ä»¥è®¿é?®ä¸»å??å?ï¼?é??常é??è¿? IOMMUï¼?并ä¸? CPU ç¼?å?ä¸? +è?´ã??ä½?æ?¯ï¼?å®?å?ªå??许设å¤?对主å?å?¨å?¨è¿?è¡?ä¸?ç»?æ??é??ç??å??å?æ??ä½?ã??è¿?å?¨å?¦ä¸?个æ?¹å??ä¸?æ?´ç³?ï¼?CPU +å?ªè?½è®¿é?®æ??é??è??å?´ç??设å¤?å??å?ï¼?è??ä¸?è?½å¯¹å?¶æ?§è¡?å??å?æ??ä½?ã??å? æ¤ï¼?ä»?å??æ ¸ç??è§?度æ?¥ç??ï¼?设å¤?å??å?ä¸? +è?½è¢«è§?为ä¸?常è§?å??å?ç?å??ã?? + +å?¦ä¸?个严é??ç??å? ç´ æ?¯å¸¦å®½æ??é??ï¼?约 32GBytes/sï¼?PCIE 4.0 å?? 16 é??é??ï¼?ã??è¿?æ¯?æ??å¿«ç?? GPU +å??å? (1 TBytes/s) æ?¢ 33 å??ã??æ??å??ä¸?个é??å?¶æ?¯å»¶è¿?ã??ä»?设å¤?访é?®ä¸»å??å?ç??延è¿?æ¯?设å¤?访é?®è?ª +å·±ç??å??å?æ?¶é«?ä¸?个æ?°é??级ã?? + +ä¸?äº?å¹³å?°æ£å?¨å¼?å??æ?°ç?? I/O æ?»çº¿æ??对 PCIE ç??æ·»å? /ä¿®æ?¹ä»¥è§£å?³å?¶ä¸ä¸?äº?é??å?¶ +ï¼?OpenCAPIã??CCIXï¼?ã??å®?们主è¦?å??许 CPU å??设å¤?ä¹?é?´ç??å??å??ç¼?å?ä¸?è?´æ?§ï¼?并å??许æ?¶æ??æ?¯æ??ç??æ?? +æ??å??å?æ??ä½?ã??é??æ?¾ç??æ?¯ï¼?并é??æ??æ??å¹³å?°é?½é?µå¾ªè¿?ä¸?è¶?å?¿ï¼?并ä¸?ä¸?äº?主è¦?æ?¶æ??没æ??é??对è¿?äº?é?®é¢?ç??硬 +件解å?³æ?¹æ¡?ã?? + +å? æ¤ï¼?为äº?使å?±äº«å?°å??空é?´æ??æ??ä¹?ï¼?æ??们ä¸?ä»?å¿?é¡»å??许设å¤?访é?®ä»»ä½?å??å?ï¼?è??ä¸?è¿?å¿?é¡»å??许任ä½?å?? +å?å?¨è®¾å¤?使ç?¨æ?¶è¿?移å?°è®¾å¤?å??å?ï¼?å?¨è¿?移æ?¶é?»æ¢ CPU 访é?®ï¼?ã?? + + +å?±äº«å?°å??空é?´å??è¿?移 +================== + +HMM æ??ç®?æ??ä¾?两个主è¦?å??è?½ã??第ä¸?个æ?¯é??è¿?å¤?å?¶cpu页表å?°è®¾å¤?页表ä¸æ?¥å?±äº«å?°å??空é?´ï¼?å? æ¤å¯¹ +äº?è¿?ç¨?å?°å??空é?´ä¸ç??ä»»ä½?æ??æ??主å??å?å?°å??ï¼?ç?¸å??ç??å?°å??æ??å??ç?¸å??ç??ç?©ç??å??å?ã?? + +为äº?å®?ç?°è¿?ä¸?ç?¹ï¼?HMM æ??ä¾?äº?ä¸?ç»?帮å?©ç¨?åº?æ?¥å¡«å??设å¤?页表ï¼?å??æ?¶è·?踪 CPU 页表æ?´æ?°ã??设å¤?页表 +æ?´æ?°ä¸?å?? CPU 页表æ?´æ?°é?£ä¹?容æ??ã??è¦?æ?´æ?°è®¾å¤?页表ï¼?æ?¨å¿?é¡»å??é??ä¸?个ç¼?å?²å?ºï¼?æ??使ç?¨é¢?å??å??é??ç?? +ç¼?å?²å?ºæ± ï¼?并å?¨å?¶ä¸å??å?¥ GPU ç?¹å®?å?½ä»¤ä»¥æ?§è¡?æ?´æ?°ï¼?å??æ¶?æ? å°?ã??ç¼?å?失æ??å??å?·æ?°ç?ï¼?ã??è¿?ä¸?è?½é?? +è¿?æ??æ??设å¤?ç??é??ç?¨ä»£ç ?æ?¥å®?æ??ã??å? æ¤ï¼?为ä»?ä¹?HMMæ??ä¾?äº?帮å?©å?¨ï¼?å?¨æ??硬件ç??å?·ä½?ç»?è??ç??ç»?设å¤?驱 +å?¨ç¨?åº?ç??å??æ?¶ï¼?æ??ä¸?å??å?¯ä»¥è??è??ç??å? ç´ é?½è??è??è¿?å?»äº?ã?? + +HMM æ??ä¾?ç??第äº?ç§?æ?ºå?¶æ?¯ä¸?ç§?æ?°ç?? ZONE_DEVICE å??å?ï¼?å®?å??许为设å¤?å??å?ç??æ¯?个页é?¢å??é??ä¸?个 +struct pageã??è¿?äº?页é?¢å¾?ç?¹æ®?ï¼?å? 为 CPU æ? æ³?æ? å°?å®?们ã??ç?¶è??ï¼?å®?们å??许使ç?¨ç?°æ??ç??è¿?移æ?º +å?¶å°?主å??å?è¿?移å?°è®¾å¤?å??å?ï¼?ä»? CPU ç??è§?度æ?¥ç??ï¼?ä¸?å??ç??èµ·æ?¥é?½å??æ?¯æ?¢å?ºå?°ç£?ç??ç??页é?¢ã??使ç?¨ +struct pageå?¯ä»¥ä¸?ç?°æ??ç?? mm æ?ºå?¶è¿?è¡?æ??ç®?å??ã??æ??å¹²å??ç??é??æ??ã??å??次ï¼?HMM ä»?æ??ä¾?帮å?©ç¨?åº?ï¼? +é¦?å??为设å¤?å??å?ç?æ??æ??æ?°ç?? ZONE_DEVICE å??å?ï¼?ç?¶å??æ?§è¡?è¿?移ã??è¿?移å??容å??æ?¶é?´ç??ç?ç?¥å?³å®?ç?? +ç»?设å¤?驱å?¨ç¨?åº?ã?? + +请注æ??ï¼?ä»»ä½? CPU 对设å¤?页é?¢ç??访é?®é?½ä¼?触å??缺页å¼?常并è¿?移å??主å??å?ã??ä¾?å¦?ï¼?å½?æ?¯æ??ç»?å®?CPU +å?°å?? A ç??页é?¢ä»?主å??å?页é?¢è¿?移å?°è®¾å¤?页é?¢æ?¶ï¼?对å?°å?? A ç??ä»»ä½? CPU 访é?®é?½ä¼?触å??缺页å¼?常 +并å?¯å?¨å??主å??å?ç??è¿?移ã?? + +å?å??è¿?两个ç?¹æ?§ï¼?HMM ä¸?ä»?å??许设å¤?é??å??è¿?ç¨?å?°å??空é?´å¹¶ä¿?æ?? CPU å??设å¤?页表å??æ¥ï¼?è??ä¸?è¿?é?? +è¿?è¿?移设å¤?æ£å?¨ä½¿ç?¨ç??æ?°æ?®é??é?¨å??æ?¥å?©ç?¨è®¾å¤?å??å?ã?? + + +å?°å??空é?´é??å??å®?ç?°å??API +===================== + +å?°å??空é?´é??å??ç??主è¦?ç?®æ ?æ?¯å??许å°?ä¸?å®?è??å?´ç?? CPU 页表å¤?å?¶å?°ä¸?个设å¤?页表ä¸ï¼?HMM æ??å?©äº? +ä¿?æ??两è??å??æ¥ã??æ?³è¦?é??å??è¿?ç¨?å?°å??空é?´ç??设å¤?驱å?¨ç¨?åº?å¿?é¡»ä»?注å?? mmu_interval_notifier +å¼?å§?:: + + int mmu_interval_notifier_insert(struct mmu_interval_notifier *interval_sub, + struct mm_struct *mm, unsigned long start, + unsigned long length, + const struct mmu_interval_notifier_ops *ops); + +å?¨ ops->invalidate() å??è°?æ??é?´ï¼?设å¤?驱å?¨ç¨?åº?å¿?须对è??å?´æ?§è¡?æ?´æ?°æ??ä½?ï¼?å°?è??å?´æ ?记为å?ª +读ï¼?æ??å®?å?¨å??æ¶?æ? å°?ç?ï¼?ã??设å¤?å¿?é¡»å?¨é©±å?¨ç¨?åº?å??è°?è¿?å??ä¹?å??å®?æ??æ?´æ?°ã?? + +å½?设å¤?驱å?¨ç¨?åº?æ?³è¦?å¡«å??ä¸?个è??æ??å?°å??è??å?´æ?¶ï¼?å®?å?¯ä»¥ä½¿ç?¨:: + + int hmm_range_fault(struct hmm_range *range); + +å¦?æ??请æ±?å??访é?®ï¼?å®?å°?å?¨ä¸¢å¤±æ??å?ªè¯»æ?¡ç?®ä¸?触å??缺页å¼?常ï¼?è§?ä¸?æ??ï¼?ã??缺页å¼?常使ç?¨é??ç?¨ç?? mm 缺 +页å¼?常代ç ?è·¯å¾?ï¼?å°±å?? CPU 缺页å¼?常ä¸?æ ·ã?? + +è¿?两个å?½æ?°é?½å°? CPU 页表æ?¡ç?®å¤?å?¶å?°å®?们ç?? pfns æ?°ç»?å??æ?°ä¸ã??该æ?°ç»?ä¸ç??æ¯?个æ?¡ç?®å¯¹åº?äº?è??æ?? +è??å?´ä¸ç??ä¸?个å?°å??ã??HMM æ??ä¾?äº?ä¸?ç»?æ ?å¿?æ?¥å¸®å?©é©±å?¨ç¨?åº?è¯?å?«ç?¹æ®?ç?? CPU 页表项ã?? + +å?¨ sync_cpu_device_pagetables() å??è°?ä¸é??å®?æ?¯é©±å?¨ç¨?åº?å¿?é¡»å°?é??ç??æ??é??è¦?ç??æ?¹é?¢ï¼?以ä¿? +æ??äº?ç?©æ£ç¡®å??æ¥ã??使ç?¨æ¨¡å¼?æ?¯:: + + int driver_populate_range(...) + { + struct hmm_range range; + ... + + range.notifier = &interval_sub; + range.start = ...; + range.end = ...; + range.hmm_pfns = ...; + + if (!mmget_not_zero(interval_sub->notifier.mm)) + return -EFAULT; + + again: + range.notifier_seq = mmu_interval_read_begin(&interval_sub); + mmap_read_lock(mm); + ret = hmm_range_fault(&range); + if (ret) { + mmap_read_unlock(mm); + if (ret == -EBUSY) + goto again; + return ret; + } + mmap_read_unlock(mm); + + take_lock(driver->update); + if (mmu_interval_read_retry(&ni, range.notifier_seq) { + release_lock(driver->update); + goto again; + } + + /* Use pfns array content to update device page table, + * under the update lock */ + + release_lock(driver->update); + return 0; + } + +driver->update é??ä¸?驱å?¨ç¨?åº?å?¨å?¶ invalidate() å??è°?ä¸ä½¿ç?¨ç??é??ç?¸å??ã??该é??å¿?é¡»å?¨è°?ç?¨ +mmu_interval_read_retry() ä¹?å??ä¿?æ??ï¼?以é?¿å??ä¸?并å?? CPU 页表æ?´æ?°å??ç??ä»»ä½?ç«?äº?ã?? + +å?©ç?¨ default_flags å?? pfn_flags_mask +==================================== + +hmm_range ç»?æ??æ?? 2 个å?段ï¼?default_flags å?? pfn_flags_maskï¼?å®?们æ??å®?æ?´ä¸ªè??å?´ +ç??æ??é??æ??å¿«ç?§ç?ç?¥ï¼?è??ä¸?å¿?为 pfns æ?°ç»?ä¸ç??æ¯?个æ?¡ç?®è®¾ç½®å®?们ã?? + +ä¾?å¦?ï¼?å¦?æ??设å¤?驱å?¨ç¨?åº?é??è¦?è?³å°?å?·æ??读å??æ??é??ç??è??å?´ç??页é?¢ï¼?å®?ä¼?设置:: + + range->default_flags = HMM_PFN_REQ_FAULT; + range->pfn_flags_mask = 0; + +并å¦?ä¸?æ??è¿°è°?ç?¨ hmm_range_fault()ã??è¿?å°?å¡«å??è?³å°?å?·æ??读å??æ??é??ç??è??å?´å??ç??æ??æ??页é?¢ã?? + +ç?°å?¨å??设驱å?¨ç¨?åº?æ?³è¦?å??å??æ ·ç??äº?æ??ï¼?é?¤äº?å®?æ?³è¦?æ?¥æ??å??æ??é??ç??è??å?´å??ç??ä¸?页ã??ç?°å?¨é©±å?¨ç¨?åº?设 +ç½®:: + + range->default_flags = HMM_PFN_REQ_FAULT; + range->pfn_flags_mask = HMM_PFN_REQ_WRITE; + range->pfns[index_of_write] = HMM_PFN_REQ_WRITE; + +æ??äº?è¿?个ï¼?HMM å°?å?¨è?³å°?读å??ï¼?å?³æ??æ??ï¼?ç??æ??æ??页é?¢ä¸å¼?常ï¼?并ä¸?对äº?å?°å?? +== range->start + (index_of_write << PAGE_SHIFT) å®?å°?å¼?常å??å?¥æ??é??ï¼?å?³ï¼?å¦?æ?? +CPU pte 没æ??设置å??æ??é??ï¼?é?£ä¹?HMMå°?è°?ç?¨handle_mm_fault()ã?? + +hmm_range_fault å®?æ??å??ï¼?æ ?å¿?ä½?被设置为页表ç??å½?å??ç?¶æ??ï¼?å?³ HMM_PFN_VALID | å¦?æ??页 +é?¢å?¯å??ï¼?å°?设置 HMM_PFN_WRITEã?? + + +ä»?æ ¸å¿?å??æ ¸ç??è§?度表示å??管ç??设å¤?å??å? +================================== + +å°?è¯?äº?å? ç§?ä¸?å??ç??设计æ?¥æ?¯æ??设å¤?å??å?ã??第ä¸?个使ç?¨ç?¹å®?äº?设å¤?ç??æ?°æ?®ç»?æ??æ?¥ä¿?å?æ??å?³è¿?移å??å? +ç??ä¿¡æ?¯ï¼?HMM å°?è?ªèº«æ??æ?¥å?° mm 代ç ?ç??å??个ä½?ç½®ï¼?以å¤?ç??对设å¤?å??å?æ?¯æ??ç??å?°å??ç??ä»»ä½?访é?®ã?? +äº?å®?è¯?æ??ï¼?è¿?æ??ç»?å¤?å?¶äº? struct page ç??大é?¨å??å?段ï¼?并ä¸?è¿?é??è¦?æ?´æ?°è®¸å¤?å??æ ¸ä»£ç ?è·¯å¾?æ?? +è?½ç??解è¿?ç§?æ?°ç??å??å?ç±»å??ã?? + +大å¤?æ?°å??æ ¸ä»£ç ?è·¯å¾?ä»?ä¸?å°?è¯?访é?®é¡µé?¢å??é?¢ç??å??å?ï¼?è??å?ªå?³å¿?struct pageç??å??容ã??æ£å? 为å¦?æ¤ï¼? +HMM å??æ?¢å?°ç?´æ?¥ä½¿ç?¨ struct page ç?¨äº?设å¤?å??å?ï¼?è¿?使å¾?大å¤?æ?°å??æ ¸ä»£ç ?è·¯å¾?ä¸?ç?¥é??å·®å¼?ã?? +æ??们å?ªé??è¦?ç¡®ä¿?没æ??人è¯?å?¾ä»? CPU 端æ? å°?è¿?äº?页é?¢ã?? + +移å?¥å??移å?ºè®¾å¤?å??å? +================== + +ç?±äº? CPU æ? æ³?ç?´æ?¥è®¿é?®è®¾å¤?å??å?ï¼?å? æ¤è®¾å¤?驱å?¨ç¨?åº?å¿?须使ç?¨ç¡¬ä»¶ DMA æ??设å¤?ç?¹å®?ç??å? è½½/å? +å?¨æ??令æ?¥è¿?移æ?°æ?®ã??migrate_vma_setup()ã??migrate_vma_pages() å?? +migrate_vma_finalize() å?½æ?°æ?¨å?¨ä½¿é©±å?¨ç¨?åº?æ?´æ??äº?ç¼?å??并é??ä¸è·¨é©±å?¨ç¨?åº?ç??é??ç?¨ä»£ç ?ã?? + +å?¨å°?页é?¢è¿?移å?°è®¾å¤?ç§?æ??å??å?ä¹?å??ï¼?é??è¦?å??建ç?¹æ®?ç??设å¤?ç§?æ?? ``struct page`` ã??è¿?äº?å°?ç?¨ +ä½?ç?¹æ®?ç??â??交æ?¢â??页表æ?¡ç?®ï¼?以便 CPU è¿?ç¨?å?¨å°?è¯?访é?®å·²è¿?移å?°è®¾å¤?ä¸?ç?¨å??å?ç??页é?¢æ?¶ä¼?å??ç??å¼?常ã?? + +è¿?äº?å?¯ä»¥é??è¿?以ä¸?æ?¹å¼?å??é??å??é??æ?¾:: + + struct resource *res; + struct dev_pagemap pagemap; + + res = request_free_mem_region(&iomem_resource, /* number of bytes */, + "name of driver resource"); + pagemap.type = MEMORY_DEVICE_PRIVATE; + pagemap.range.start = res->start; + pagemap.range.end = res->end; + pagemap.nr_range = 1; + pagemap.ops = &device_devmem_ops; + memremap_pages(&pagemap, numa_node_id()); + + memunmap_pages(&pagemap); + release_mem_region(pagemap.range.start, range_len(&pagemap.range)); + +è¿?æ??devm_request_free_mem_region(), devm_memremap_pages(), +devm_memunmap_pages() å?? devm_release_mem_region() å½?èµ?æº?å?¯ä»¥ç»?å®?å?° ``struct device``. + +æ?´ä½?è¿?移æ¥éª¤ç±»ä¼¼äº?å?¨ç³»ç»?å??å?ä¸è¿?移 NUMA 页é?¢(see :ref:`Page migration <page_migration>`) ï¼? +ä½?è¿?äº?æ¥éª¤å??为设å¤?驱å?¨ç¨?åº?ç?¹å®?代ç ?å??å?±äº«å?¬å?±ä»£ç ?: + +1. ``mmap_read_lock()`` + + 设å¤?驱å?¨ç¨?åº?å¿?é¡»å°? ``struct vm_area_struct`` ä¼ é??ç»?migrate_vma_setup()ï¼? + å? æ¤é??è¦?å?¨è¿?移æ??é?´ä¿?ç?? mmap_read_lock() æ?? mmap_write_lock()ã?? + +2. ``migrate_vma_setup(struct migrate_vma *args)`` + + 设å¤?驱å?¨å??å§?å??äº? ``struct migrate_vma`` ç??å?段ï¼?并å°?该æ??é??ä¼ é??ç»? + migrate_vma_setup()ã??``args->flags`` å?段æ?¯ç?¨æ?¥è¿?滤å?ªäº?æº?页é?¢åº?该被è¿?移ã?? + ä¾?å¦?ï¼?设置 ``MIGRATE_VMA_SELECT_SYSTEM`` å°?å?ªè¿?移系ç»?å??å?ï¼?设置 + ``MIGRATE_VMA_SELECT_DEVICE_PRIVATE`` å°?å?ªè¿?移驻ç??å?¨è®¾å¤?ç§?æ??å??å?ä¸ç??页 + é?¢ã??å¦?æ??å??è??被设置ï¼? ``args->pgmap_owner`` å?段被ç?¨æ?¥è¯?å?«é©±å?¨æ??æ?¥æ??ç??设å¤? + ç§?æ??页ã??è¿?å°±é?¿å??äº?è¯?å?¾è¿?移驻ç??å?¨å?¶ä»?设å¤?ä¸ç??设å¤?ç§?æ??页ã??ç?®å??ï¼?å?ªæ??å?¿å??ç??ç§?æ??VMA + è??å?´å?¯ä»¥è¢«è¿?移å?°ç³»ç»?å??å?å??设å¤?ç§?æ??å??å?ã?? + + migrate_vma_setup()æ??å??ç??第ä¸?æ¥æ?¯ç?¨ ``mmu_notifier_invalidate_range_start()`` + å?? ``mmu_notifier_invalidate_range_end()`` è°?ç?¨æ?¥é??å??设å¤?å?¨å?´ç??页表ï¼?使 + å?¶ä»?设å¤?ç??MMUæ? æ??ï¼?以便å?¨ ``args->src`` æ?°ç»?ä¸å¡«å??è¦?è¿?移ç??PFNã?? + ``invalidate_range_start()`` å??è°?ä¼ é??ç»?ä¸?个``struct mmu_notifier_range`` ï¼? + å?¶ ``event`` å?段设置为MMU_NOTIFY_MIGRATEï¼? ``owner`` å?æ®µè®¾ç½®ä¸ºä¼ é??ç»? + migrate_vma_setup()ç?? ``args->pgmap_owner`` å?段ã??è¿?å??许设å¤?驱å?¨è·³è¿?æ? + æ??å??å??è°?ï¼?å?ªæ? æ??å??é?£äº?å®?é??æ£å?¨è¿?移ç??设å¤?ç§?æ??MMUæ? å°?ã??è¿?ä¸?ç?¹å°?å?¨ä¸?ä¸?è??详ç»?解é??ã?? + + + å?¨é??å??页表æ?¶ï¼?ä¸?个 ``pte_none()`` æ?? ``is_zero_pfn()`` æ?¡ç?®å¯¼è?´ä¸?个æ??æ?? + ç?? â??zeroâ?? PFN å?å?¨å?¨ ``args->src`` é?µå??ä¸ã??è¿?让驱å?¨å??é??设å¤?ç§?æ??å??å?并æ¸? + é?¤å®?ï¼?è??ä¸?æ?¯å¤?å?¶ä¸?个é?¶é¡µã??å?°ç³»ç»?å??å?æ??设å¤?ç§?æ??ç»?æ??页ç??æ??æ??PTEæ?¡ç?®å°?被 + ``lock_page()``é??å®?ï¼?ä¸?LRUé??离ï¼?å¦?æ??ç³»ç»?å??å?å??设å¤?ç§?æ??页ä¸?å?¨LRUä¸?ï¼?ï¼?ä»?è¿? + ç¨?ä¸å??æ¶?æ? å°?ï¼?并æ??å?¥ä¸?个ç?¹æ®?ç??è¿?移PTEæ?¥ä»£æ?¿å??æ?¥ç??PTEã?? migrate_vma_setup() + è¿?æ¸?é?¤äº? ``args->dst`` æ?°ç»?ã?? + +3. 设å¤?驱å?¨ç¨?åº?å??é??ç?®æ ?页é?¢å¹¶å°?æº?页é?¢å¤?å?¶å?°ç?®æ ?页é?¢ã?? + + 驱å?¨ç¨?åº?æ£?æ?¥æ¯?个 ``src`` æ?¡ç?®ä»¥æ?¥ç??该 ``MIGRATE_PFN_MIGRATE`` ä½?æ?¯å?¦å·² + 设置并跳è¿?æ?ªè¿?移ç??æ?¡ç?®ã??设å¤?驱å?¨ç¨?åº?è¿?å?¯ä»¥é??è¿?ä¸?å¡«å??页é?¢ç?? ``dst`` æ?°ç»?æ?¥é?? + æ?©è·³è¿?页é?¢è¿?移ã?? + + ç?¶å??ï¼?驱å?¨ç¨?åº?å??é??ä¸?个设å¤?ç§?æ?? struct page æ??ä¸?个系ç»?å??å?页ï¼?ç?¨ ``lock_page()`` + é??å®?该页ï¼?并å°? ``dst`` æ?°ç»?æ?¡ç?®å¡«å?¥:: + + dst[i] = migrate_pfn(page_to_pfn(dpage)); + + ç?°å?¨é©±å?¨ç¨?åº?ç?¥é??è¿?个页é?¢æ£å?¨è¢«è¿?移ï¼?å®?å?¯ä»¥ä½¿è®¾å¤?ç§?æ?? MMU æ? å°?æ? æ??并å°?设å¤?ç§?æ?? + å??å?å¤?å?¶å?°ç³»ç»?å??å?æ??å?¦ä¸?个设å¤?ç§?æ??页é?¢ã??ç?±äº?æ ¸å¿? Linux å??æ ¸ä¼?å¤?ç?? CPU 页表失 + æ??ï¼?å? æ¤è®¾å¤?驱å?¨ç¨?åº?å?ªé??使å?¶è?ªå·±ç?? MMU æ? å°?失æ??ã?? + + 驱å?¨ç¨?åº?å?¯ä»¥ä½¿ç?¨ ``migrate_pfn_to_page(src[i])`` æ?¥è?·å??æº?设å¤?ç?? + ``struct page`` é?¢ï¼?并å°?æº?页é?¢å¤?å?¶å?°ç?®æ ?设å¤?ä¸?ï¼?å¦?æ??æ??é??为 ``NULL`` ï¼?æ?? + å?³ç??æº?页é?¢æ²¡æ??被填å??å?°ç³»ç»?å??å?ä¸ï¼?å??æ¸?é?¤ç?®æ ?设å¤?ç??ç§?æ??å??å?ã?? + +4. ``migrate_vma_pages()`` + + è¿?ä¸?æ¥æ?¯å®?é??â??æ??交â??è¿?移ç??å?°æ?¹ã?? + + å¦?æ??æº?页æ?¯ ``pte_none()`` æ?? ``is_zero_pfn()`` 页ï¼?è¿?æ?¶æ?°å??é??ç??页ä¼?被æ?? + å?¥å?°CPUç??页表ä¸ã??å¦?æ??ä¸?个CPU线ç¨?å?¨å??ä¸?页é?¢ä¸?å??ç??å¼?常ï¼?è¿?å?¯è?½ä¼?失败ã??ç?¶è??ï¼?页 + 表被é??å®?ï¼?å?ªæ??ä¸?个æ?°é¡µä¼?被æ??å?¥ã??å¦?æ??å®?失å?»äº?ç«?äº?ï¼?设å¤?驱å?¨å°?ç??å?° + ``MIGRATE_PFN_MIGRATE`` ä½?被æ¸?é?¤ã?? + + å¦?æ??æº?页被é??å®?ã??é??离ç?ï¼?æº? ``struct page`` ä¿¡æ?¯ç?°å?¨è¢«å¤?å?¶å?°ç?®æ ? + ``struct page`` ï¼?æ??ç»?å®?æ??CPU端ç??è¿?移ã?? + +5. 设å¤?驱å?¨ä¸ºä»?å?¨è¿?移ç??页é?¢æ?´æ?°è®¾å¤?MMU页表ï¼?å??æ»?æ?ªè¿?移ç??页é?¢ã?? + + å¦?æ?? ``src`` æ?¡ç?®ä»?ç?¶æ?? ``MIGRATE_PFN_MIGRATE`` ä½?被设置ï¼?设å¤?驱å?¨å?¯ä»¥ + æ?´æ?°è®¾å¤?MMUï¼?å¦?æ?? ``MIGRATE_PFN_WRITE`` ä½?被设置ï¼?å??设置å??å?¯ç?¨ä½?ã?? + +6. ``migrate_vma_finalize()`` + + è¿?ä¸?æ¥ç?¨æ?°é¡µç??页表项æ?¿æ?¢ç?¹æ®?ç??è¿?移页表项ï¼?并é??æ?¾å¯¹æº?å??ç?®ç?? ``struct page`` + ç??å¼?ç?¨ã?? + +7. ``mmap_read_unlock()`` + + ç?°å?¨å?¯ä»¥é??æ?¾é??äº?ã?? + +ç?¬å? 访é?®å?å?¨å?¨ +============== + +ä¸?äº?设å¤?å?·æ??诸å¦?å??å?PTEä½?ç??å??è?½ï¼?å?¯ä»¥ç?¨æ?¥å®?ç?°å¯¹ç³»ç»?å??å?ç??å??å?访é?®ã??为äº?æ?¯æ??对ä¸? +个å?±äº«ç??è??æ??å??å?页ç??å??å?æ??ä½?ï¼?è¿?æ ·ç??设å¤?é??è¦?对该页ç??访é?®æ?¯æ??ä»?ç??ï¼?è??ä¸?æ?¯æ?¥è?ªCPU +ç??ä»»ä½?ç?¨æ?·ç©ºé?´è®¿é?®ã?? ``make_device_exclusive_range()`` å?½æ?°å?¯ä»¥ç?¨æ?¥ä½¿ä¸? +个å??å?è??å?´ä¸?è?½ä»?ç?¨æ?·ç©ºé?´è®¿é?®ã?? + +è¿?å°?ç?¨ç?¹æ®?ç??交æ?¢æ?¡ç?®æ?¿æ?¢ç»?å®?è??å?´å??ç??æ??æ??页ç??æ? å°?ã??ä»»ä½?è¯?å?¾è®¿é?®äº¤æ?¢æ?¡ç?®ç??è¡?为é?½ä¼? +导è?´ä¸?个å¼?常ï¼?该å¼?常ä¼?é??è¿?ç?¨å??å§?æ? å°?æ?¿æ?¢è¯¥æ?¡ç?®è??å¾?å?°æ?¢å¤?ã??驱å?¨ç¨?åº?ä¼?被é??ç?¥æ? å°?å·² +ç»?被MMUé??ç?¥å?¨æ?¹å??ï¼?ä¹?å??å®?å°?ä¸?å??æ??对该页ç??ç?¬å? 访é?®ã??ç?¬å? 访é?®è¢«ä¿?è¯?æ??ç»å?°é©±å?¨ç¨?åº? +æ?¾å¼?页é?¢é??å??页é?¢å¼?ç?¨ä¸ºæ¢ï¼?è¿?æ?¶é¡µé?¢ä¸?ç??ä»»ä½?CPUå¼?常é?½å?¯ä»¥æ??æ??è¿°è¿?è¡?ã?? + +å??å? cgroup (memcg) å?? rss ç»?计 +=============================== + +ç?®å??ï¼?设å¤?å??å?被è§?为 rss 计æ?°å?¨ä¸ç??ä»»ä½?常è§?页é?¢ï¼?å¦?æ??设å¤?页é?¢ç?¨äº?å?¿å??ï¼?å??为å?¿å??ï¼? +å¦?æ??设å¤?页é?¢ç?¨äº?æ??件æ?¯æ??页é?¢ï¼?å??为æ??件ï¼?å¦?æ??设å¤?页é?¢ç?¨äº?å?±äº«å??å?ï¼?å??为 shmemï¼?ã?? +è¿?æ?¯ä¸ºäº?ä¿?æ??ç?°æ??åº?ç?¨ç¨?åº?ç??æ??æ??é??æ?©ï¼?è¿?äº?åº?ç?¨ç¨?åº?å?¯è?½å?¨ä¸?ç?¥æ??ç??æ??å?µä¸?å¼?å§?使ç?¨è®¾å¤? +å??å?ï¼?è¿?è¡?ä¸?å??å½±å??ã?? + +ä¸?个缺ç?¹æ?¯ OOM æ??æ??å?¯è?½ä¼?æ??æ»ä½¿ç?¨å¤§é??设å¤?å??å?è??ä¸?æ?¯å¤§é??常è§?ç³»ç»?å??å?ç??åº?ç?¨ç¨?åº?ï¼? +å? æ¤ä¸?ä¼?é??æ?¾å¤ªå¤?ç³»ç»?å??å?ã??å?¨å?³å®?以ä¸?å??æ?¹å¼?计ç®?设å¤?å??å?ä¹?å??ï¼?æ??们å¸?æ??æ?¶é??æ?´å¤?å?³ +äº?åº?ç?¨ç¨?åº?å??ç³»ç»?å?¨å?å?¨è®¾å¤?å??å?ç??æ??å?µä¸?å?¨å??å?å??å??ä¸?å¦?ä½?å??åº?ç??å®?é??ç»?éª?ã?? + +对å??å? cgroup å??å?ºäº?ç?¸å??ç??å?³å®?ã??设å¤?å??å?页é?¢æ ¹æ?®ç?¸å??ç??å??å? cgroup 计ç®?ï¼?常è§? +页é?¢å°?被计ç®?å?¨å??ã??è¿?ç¡®å®?ç®?å??äº?è¿?å?ºè®¾å¤?å??å?ç??è¿?移ã??è¿?ä¹?æ??å?³ç??ä»?设å¤?å??å?è¿?移å??常è§? +å??å?ä¸?ä¼?失败ï¼?å? 为å®?ä¼?è¶?è¿?å??å? cgroup é??å?¶ã??ä¸?æ?¦æ??们对设å¤?å??å?ç??使ç?¨æ?¹å¼?å??å?¶å¯¹ +å??å?èµ?æº?æ?§å?¶ç??å½±å??æ??äº?æ?´å¤?ç??äº?解ï¼?æ??们å?¯è?½ä¼?å?¨å??é?¢é??æ?°è??è??è¿?个é??æ?©ã?? + +请注æ??ï¼?设å¤?å??å?æ°¸è¿?ä¸?è?½ç?±è®¾å¤?驱å?¨ç¨?åº?æ??é??è¿? GUP å?ºå®?ï¼?å? æ¤æ¤ç±»å??å?å?¨è¿?ç¨?é??å?ºæ?¶ +æ?»æ?¯è¢«é??æ?¾ç??ã??æ??è??å?¨å?±äº«å??å?æ??æ??件æ?¯æ??å??å?ç??æ??å?µä¸?ï¼?å½?å? é?¤æ??å??ä¸?个å¼?ç?¨æ?¶ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/hugetlbfs_reserv.rst @@ -0,0 +1,436 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/hugetlbfs_reserv.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + +============== +Hugetlbfs é¢?ç?? +============== + +æ¦?è¿° +==== + +:ref:`hugetlbpage` ä¸æ??è¿°ç??巨页é??常æ?¯é¢?å??å??é??ç»?åº?ç?¨ç¨?åº?使ç?¨ç??ã??å¦?æ??VMAæ?? +示è¦?使ç?¨å·¨é¡µï¼?è¿?äº?巨页ä¼?å?¨ç¼ºé¡µå¼?常æ?¶è¢«å®?ä¾?å??å?°ä»»å?¡ç??å?°å??空é?´ã??å¦?æ??å?¨ç¼ºé¡µå¼?常 +æ?¶æ²¡æ??巨页å?å?¨ï¼?ä»»å?¡å°±ä¼?被å??é??ä¸?个SIGBUSï¼?并ç»?常ä¸?é«?å?´å?°æ»å?»ã??å?¨å? å?¥å·¨é¡µæ?¯ +æ??å??ä¸?ä¹?ï¼?人们å?³å®?ï¼?å?¨mmap()æ?¶æ£?æµ?巨页ç??ç?缺æ??å?µä¼?æ?´å¥½ã??è¿?个æ?³æ³?æ?¯ï¼?å¦?æ?? +没æ??足å¤?ç??巨页æ?¥è¦?ç??æ? å°?ï¼?mmap()å°?失败ã??è¿?é¦?å??æ?¯å?¨mmap()æ?¶å?¨ä»£ç ?ä¸å??ä¸?个 +ç®?å??ç??æ£?æ?¥ï¼?以确å®?æ?¯å?¦æ??足å¤?ç??空é?²å·¨é¡µæ?¥è¦?ç??æ? å°?ã??å°±å??å??æ ¸ä¸ç??大å¤?æ?°ä¸?西ä¸? +æ ·ï¼?代ç ?é??ç??æ?¶é?´ç??æ?¨ç§»è??ä¸?æ?å??å±?ã??ç?¶è??ï¼?å?ºæ?¬ç??æ?³æ³?æ?¯å?¨mmap()æ?¶ â??é¢?ç??â?? +巨页ï¼?以确ä¿?巨页å?¯ä»¥ç?¨äº?该æ? å°?ä¸ç??缺页å¼?常ã??ä¸?é?¢ç??æ??è¿°è¯?å?¾æ??è¿°å?¨v4.10å??æ ¸ +ä¸æ?¯å¦?ä½?è¿?è¡?巨页é¢?ç??å¤?ç??ç??ã?? + + +读è?? +==== +è¿?个æ??述主è¦?æ?¯é??对æ£å?¨ä¿®æ?¹hugetlbfs代ç ?ç??å??æ ¸å¼?å??è??ã?? + + +æ?°æ?®ç»?æ?? +======== + +resv_huge_pages + è¿?æ?¯ä¸?个å?¨å±?ç??ï¼?per-hstateï¼?é¢?ç??ç??巨页ç??计æ?°ã??é¢?ç??ç??巨页å?ªå¯¹é¢?ç??å®?们ç??ä»» + å?¡å?¯ç?¨ã??å? æ¤ï¼?ä¸?è?¬å?¯ç?¨ç??巨页ç??æ?°é??被计ç®?为(``free_huge_pages - resv_huge_pages``)ã?? +Reserve Map + é¢?ç??æ? å°?ç?±ä»¥ä¸?ç»?æ??ä½?æ??è¿°:: + + struct resv_map { + struct kref refs; + spinlock_t lock; + struct list_head regions; + long adds_in_progress; + struct list_head region_cache; + long region_cache_count; + }; + + ç³»ç»?ä¸æ¯?个巨页æ? å°?é?½æ??ä¸?个é¢?ç??æ? å°?ã??resv_mapä¸ç??regionså??表æ??è¿°äº?æ? å°?ä¸ç?? + å?ºå??ã??ä¸?个å?ºå??被æ??述为:: + + struct file_region { + struct list_head link; + long from; + long to; + }; + + file_regionç»?æ??ä½?ç?? â??fromâ?? å?? â??toâ?? å?段æ?¯è¿?å?¥æ? å°?ç??巨页索å¼?ã??æ ¹æ?®æ? å°?ç??ç±»å??ï¼?å?¨ + reserv_map ä¸ç??ä¸?个å?ºå??å?¯è?½è¡¨ç¤ºè¯¥è??å?´å?å?¨é¢?ç??ï¼?æ??é¢?ç??ä¸?å?å?¨ã?? +Flags for MAP_PRIVATE Reservations + è¿?äº?被å?å?¨å?¨é¢?ç??ç??æ? å°?æ??é??ç??åº?é?¨ã?? + + ``#define HPAGE_RESV_OWNER (1UL << 0)`` + 表示该任å?¡æ?¯ä¸?该æ? å°?ç?¸å?³ç??é¢?ç??ç??æ??æ??è??ã?? + ``#define HPAGE_RESV_UNMAPPED (1UL << 1)`` + 表示æ??å??æ? å°?æ¤è??å?´ï¼?并å??建å?¨å¤?ï¼?ç??ä»»å?¡ç?±äº?COW失败è??ä»?该任å?¡ï¼?å?ä»»å?¡ï¼?ä¸å??æ¶?æ? + å°?äº?ä¸?个页é?¢ã?? +Page Flags + PagePrivate页é?¢æ ?å¿?æ?¯ç?¨æ?¥æ??示å?¨é??æ?¾å·¨é¡µæ?¶å¿?é¡»æ?¢å¤?巨页ç??é¢?ç??ã??æ?´å¤?ç»?è??å°?å?¨ + â??é??æ?¾å·¨é¡µâ?? ä¸?è??ä¸è®¨è®ºã?? + + +é¢?ç??æ? å°?ä½?ç½®ï¼?ç§?æ??æ??å?±äº«ï¼? +========================== + +ä¸?个巨页æ? å°?æ??段è¦?ä¹?æ?¯ç§?æ??ç??ï¼?è¦?ä¹?æ?¯å?±äº«ç??ã??å¦?æ??æ?¯ç§?æ??ç??ï¼?å®?é??常å?ªå¯¹ä¸?个å?°å??空é?´ +ï¼?ä»»å?¡ï¼?å?¯ç?¨ã??å¦?æ??æ?¯å?±äº«ç??ï¼?å®?å?¯ä»¥è¢«æ? å°?å?°å¤?个å?°å??空é?´ï¼?ä»»å?¡ï¼?ã??对äº?è¿?两ç§?ç±»å??ç??æ? å°?ï¼? +é¢?ç??æ? å°?ç??ä½?ç½®å??è¯ä¹?æ?¯æ??æ?¾ä¸?å??ç??ã??ä½?ç½®ç??å·®å¼?æ?¯ï¼? + +- 对äº?ç§?æ??æ? å°?ï¼?é¢?ç??æ? å°?æ??å?¨VMAç»?æ??ä½?ä¸?ã??å?·ä½?æ?¥è¯´ï¼?å°±æ?¯vma->vm_private_dataã??è¿?个ä¿? + ç??æ? å°?æ?¯å?¨å??建æ? å°?ï¼?mmap(MAP_PRIVATE)ï¼?æ?¶å??建ç??ã?? +- 对äº?å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?æ??å?¨inodeä¸?ã??å?·ä½?æ?¥è¯´ï¼?å°±æ?¯inode->i_mapping->private_dataã?? + ç?±äº?å?±äº«æ? å°?æ?»æ?¯ç?±hugetlbfsæ??件系ç»?ä¸ç??æ??件æ?¯æ??ï¼?hugetlbfs代ç ?ç¡®ä¿?æ¯?个è??ç?¹å??å?«ä¸?个é¢? + ç??æ? å°?ã??å? æ¤ï¼?é¢?ç??æ? å°?å?¨å??建è??ç?¹æ?¶è¢«å??é??ã?? + + +å??建é¢?ç?? +======== +å½?å??建ä¸?个巨大ç??æ??页é?¢æ?¯æ??ç??å?±äº«å??å?段ï¼?shmget(SHM_HUGETLB)ï¼?æ??é??è¿?mmap(MAP_HUGETLB) +å??建ä¸?个æ? å°?æ?¶ï¼?å°±ä¼?å??建é¢?ç??ã??è¿?äº?æ??ä½?ä¼?导è?´å¯¹å?½æ?°hugetlb_reserve_pages()ç??è°?ç?¨:: + + int hugetlb_reserve_pages(struct inode *inode, + long from, long to, + struct vm_area_struct *vma, + vm_flags_t vm_flags) + +hugetlb_reserve_pages()å??ç??第ä¸?件äº?æ?¯æ£?æ?¥å?¨è°?ç?¨shmget()æ??mmap()æ?¶æ?¯å?¦æ??å®?äº?NORESERVE +æ ?å¿?ã??å¦?æ??æ??å®?äº?NORESERVEï¼?é?£ä¹?è¿?个å?½æ?°ç«?å?³è¿?å??ï¼?å? 为ä¸?é??è¦?é¢?ç??ã?? + +å??æ?°'from'å??'to'æ?¯æ? å°?æ??å?ºç¡?æ??件ç??巨页索å¼?ã??对äº?shmget()ï¼?'from'æ?»æ?¯0ï¼?'to'对åº?äº?段/æ? å°? +ç??é?¿åº¦ã??对äº?mmap()ï¼?offsetå??æ?°å?¯ä»¥ç?¨æ?¥æ??å®?è¿?å?¥åº?å±?æ??件ç??å??移é??ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?'from'å??'to' +å??æ?°å·²ç»?被è¿?个å??移é??æ??è°?æ?´ã?? + +PRIVATEå??SHAREDæ? å°?ä¹?é?´ç??ä¸?个å¾?大ç??å?ºå?«æ?¯é¢?ç??å?¨é¢?ç??æ? å°?ä¸ç??表示æ?¹å¼?ã?? + +- 对äº?å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?ä¸ç??æ?¡ç?®è¡¨ç¤ºå¯¹åº?页é?¢ç??é¢?ç??å?å?¨æ??æ?¾ç»?å?å?¨ã??å½?é¢?ç??被æ¶?è??æ?¶ï¼?é¢?ç??æ? å°?ä¸?被 + ä¿®æ?¹ã?? +- 对äº?ç§?æ??æ? å°?ï¼?é¢?ç??æ? å°?ä¸æ²¡æ??æ?¡ç?®è¡¨ç¤ºç?¸åº?页é?¢å?å?¨é¢?ç??ã??é??ç??é¢?ç??被æ¶?è??ï¼?æ?¡ç?®è¢«æ·»å? å?°é¢?ç??æ? å°?ä¸ã?? + å? æ¤ï¼?é¢?ç??æ? å°?ä¹?å?¯ç?¨äº?ç¡®å®?å?ªäº?é¢?ç??已被æ¶?è??ã?? + +对äº?ç§?æ??æ? å°?ï¼?hugetlb_reserve_pages()å??建é¢?ç??æ? å°?并å°?å?¶æ??å?¨VMAç»?æ??ä½?ä¸?ã??æ¤å¤?ï¼? +HPAGE_RESV_OWNERæ ?å¿?被设置ï¼?以表æ??该VMAæ?¥æ??é¢?ç??ã?? + +é¢?ç??æ? å°?被æ?¥é??以确å®?å½?å??æ? å°?/段é??è¦?å¤?å°?巨页é¢?ç??ã??对äº?ç§?æ??æ? å°?ï¼?è¿?å§?ç»?æ?¯ä¸?个å?¼ï¼?to - fromï¼?ã?? +ç?¶è??ï¼?对äº?å?±äº«æ? å°?æ?¥è¯´ï¼?ä¸?äº?é¢?ç??å?¯è?½å·²ç»?å?å?¨äº?(to - from)ç??è??å?´å??ã??å?³äº?å¦?ä½?å®?ç?°è¿?ä¸?ç?¹ç??ç»?è??ï¼? +请å??è§? :ref:`é¢?ç??æ? å°?ç??ä¿®æ?¹ <resv_map_modifications>` ä¸?è??ã?? + +该æ? å°?å?¯è?½ä¸?ä¸?个å?æ± ï¼?subpoolï¼?ç?¸å?³è??ã??å¦?æ??æ?¯è¿?æ ·ï¼?å°?æ?¥è¯¢å?æ± ä»¥ç¡®ä¿?æ??足å¤?ç??空é?´ç?¨äº?æ? å°?ã??å?æ± +æ??å?¯è?½å·²ç»?é¢?ç??äº?å?¯ç?¨äº?æ? å°?ç??é¢?ç??空é?´ã??æ?´å¤?ç»?è??请å??è§? :ref: `å?æ± é¢?ç?? <sub_pool_resv>` +ä¸?è??ã?? + +å?¨å?¨è¯¢äº?é¢?ç??æ? å°?å??å?æ± ä¹?å??ï¼?å°±ç?¥é??äº?é??è¦?ç??æ?°é¢?ç??æ?°é??ã??hugetlb_acct_memory()å?½æ?°è¢«è°?ç?¨ä»¥æ£?æ?¥ +并è?·å??æ??è¦?æ±?ç??é¢?ç??æ?°é??ã??hugetlb_acct_memory()è°?ç?¨å?°å?¯è?½å??é??å??è°?æ?´å?©ä½?页æ?°ç??å?½æ?°ã??ç?¶è??ï¼?å?¨è¿? +äº?å?½æ?°ä¸ï¼?代ç ?å?ªæ?¯æ£?æ?¥ä»¥ç¡®ä¿?æ??足å¤?ç??空é?²ç??巨页æ?¥å®¹çº³é¢?ç??ã??å¦?æ??æ??ç??è¯?ï¼?å?¨å±?é¢?ç??计æ?°resv_huge_pages +ä¼?被è°?æ?´ï¼?å¦?ä¸?æ??示:: + + if (resv_needed <= (resv_huge_pages - free_huge_pages)) + resv_huge_pages += resv_needed; + +注æ??ï¼?å?¨æ£?æ?¥å??è°?æ?´è¿?äº?计æ?°å?¨æ?¶ï¼?å?¨å±?é??hugetlb_lockä¼?被é¢?ç??ã?? + +å¦?æ??æ??足å¤?ç??空é?²ç??巨页ï¼?并ä¸?å?¨å±?计æ?°resv_huge_pages被è°?æ?´ï¼?é?£ä¹?ä¸?æ? å°?ç?¸å?³ç??é¢?ç??æ? å°?被修æ?¹ä»¥ +å??æ? é¢?ç??ã??å?¨å?±äº«æ? å°?ç??æ??å?µä¸?ï¼?å°?å?å?¨ä¸?个file_regionï¼?å??æ?¬'from'-'to'è??å?´ã??对äº?ç§?æ??æ? å°?ï¼? +ä¸?对é¢?ç??æ? å°?è¿?è¡?ä¿®æ?¹ï¼?å? 为没æ??æ?¡ç?®è¡¨ç¤ºå?å?¨é¢?ç??ã?? + +å¦?æ??hugetlb_reserve_pages()æ??å??ï¼?å?¨å±?é¢?ç??æ?°å??ä¸?æ? å°?ç?¸å?³ç??é¢?ç??æ? å°?å°?æ ¹æ?®é??è¦?被修æ?¹ï¼?以确ä¿? +å?¨'from'-'to'è??å?´å??å?å?¨é¢?ç??ã?? + +æ¶?è??é¢?ç??/å??é??ä¸?个巨页 +=========================== + +å½?ä¸?é¢?ç??ç?¸å?³ç??巨页å?¨ç?¸åº?ç??æ? å°?ä¸è¢«å??é??å??å®?ä¾?å??æ?¶ï¼?é¢?ç??就被æ¶?è??äº?ã??该å??é??æ?¯å?¨å?½æ?°alloc_huge_page() +ä¸è¿?è¡?ç??:: + + struct page *alloc_huge_page(struct vm_area_struct *vma, + unsigned long addr, int avoid_reserve) + +alloc_huge_pageè¢«ä¼ é??ç»?ä¸?个VMAæ??é??å??ä¸?个è??æ??å?°å??ï¼?å? æ¤å®?å?¯ä»¥æ?¥é??é¢?ç??æ? å°?以确å®?æ?¯å?¦å?å?¨é¢?ç??ã?? +æ¤å¤?ï¼?alloc_huge_pageé??è¦?ä¸?个å??æ?°avoid_reserveï¼?该å??æ?°è¡¨ç¤ºå?³ä½¿ç??èµ·æ?¥å·²ç»?为æ??å®?ç??å?°å??é¢?ç??äº? +é¢?ç??ï¼?ä¹?ä¸?åº?该使ç?¨é¢?ç??ã??avoid_reserveå??æ?°æ??常被ç?¨äº?å??æ?¶æ?·è´?å??页é?¢è¿?移ç??æ??å?µä¸?ï¼?å?³ç?°æ??页é?¢ç??é¢? +å¤?æ?·è´?被å??é??ã?? + + +è°?ç?¨è¾?å?©å?½æ?°vma_needs_reservation()æ?¥ç¡®å®?æ?¯å?¦å?å?¨å¯¹æ? å°?(vma)ä¸å?°å??ç??é¢?ç??ã??å?³äº?è¿?个å?½æ?°ç??详 +ç»?å??容ï¼?请å??è§? :ref:`é¢?ç??æ? å°?帮å?©å?½æ?° <resv_map_helpers>` ä¸?è??ã??ä»? +vma_needs_reservation()è¿?å??ç??å?¼é??常为0æ??1ã??å¦?æ??该å?°å??å?å?¨é¢?ç??ï¼?å??为0ï¼?å¦?æ??ä¸?å?å?¨é¢?ç??ï¼?å??为1ã?? +å¦?æ??ä¸?å?å?¨é¢?ç??ï¼?并ä¸?æ??ä¸?个ä¸?æ? å°?ç?¸å?³è??ç??å?æ± ï¼?å??æ?¥è¯¢å?æ± ä»¥ç¡®å®?å®?æ?¯å?¦å??å?«é¢?ç??ã??å¦?æ??å?æ± å??å?«é¢?ç??ï¼? +å??å?¯å°?å?¶ä¸ä¸?个ç?¨äº?该å??é??ã??ç?¶è??ï¼?å?¨ä»»ä½?æ??å?µä¸?ï¼?avoid_reserveå??æ?°é?½ä¼?ä¼?å??è??è??为å??é??使ç?¨é¢?ç??ã??å?¨ +ç¡®å®?é¢?ç??æ?¯å?¦å?å?¨å¹¶å?¯ç?¨äº?å??é??å??ï¼?è°?ç?¨dequeue_huge_page_vma()å?½æ?°ã??è¿?个å?½æ?°é??è¦?两个ä¸?é¢?ç??æ??å?³ +ç??å??æ?°ï¼? + +- avoid_reserveï¼?è¿?æ?¯ä¼ é??ç»?alloc_huge_page()ç??å??ä¸?个å?¼/å??æ?°ã?? +- chgï¼?尽管è¿?个å??æ?°ç??ç±»å??æ?¯longï¼?ä½?å?ªæ??0æ??1ç??å?¼è¢«ä¼ é??ç»?dequeue_huge_page_vmaã??å¦?æ??该å?¼ä¸º0ï¼? + å??表æ??å?å?¨é¢?ç??ï¼?å?³äº?å?¯è?½ç??é?®é¢?ï¼?请å??è§? â??é¢?ç??å??å??å?ç?ç?¥â?? ä¸?è??ï¼?ã??å¦?æ??å?¼ + 为1ï¼?å??表示ä¸?å?å?¨é¢?ç??ï¼?å¦?æ??å?¯è?½ç??è¯?ï¼?å¿?é¡»ä»?å?¨å±?空é?²æ± ä¸å??å?ºè¯¥é¡µã?? + +ä¸?VMAç??å??å?ç?ç?¥ç?¸å?³ç??空é?²å??表被æ??ç´¢å?°ä¸?个空é?²é¡µã??å¦?æ??æ?¾å?°äº?ä¸?个页é?¢ï¼?å½?该页é?¢ä»?空é?²å??表ä¸ç§»é?¤æ?¶ï¼? +free_huge_pagesç??å?¼è¢«é??å??ã??å¦?æ??æ??ä¸?个ä¸?该页ç?¸å?³ç??é¢?ç??ï¼?å°?è¿?è¡?以ä¸?è°?æ?´:: + + SetPagePrivate(page); /* 表示å??é??è¿?个页é?¢æ¶?è??äº?ä¸?个é¢?ç??ï¼? + * å¦?æ??é??å?°é??误ï¼?以è?³äº?å¿?é¡»é??æ?¾è¿?个页é?¢ï¼?é¢?ç??å°?被 + * æ?¢å¤?ã?? */ + resv_huge_pages--; /* å??å°?å?¨å±?é¢?ç??计æ?° */ + +注æ??ï¼?å¦?æ??æ?¾ä¸?å?°æ»¡è¶³VMAå??å?ç?ç?¥ç??巨页ï¼?å°?å°?è¯?使ç?¨ä¼?ä¼´å??é??å?¨å??é??ä¸?个ã??è¿?就带æ?¥äº?è¶?å?ºé¢?ç??è??å?´ +ç??å?©ä½?巨页å??è¶?é¢?å??é??ç??é?®é¢?ã??å?³ä½¿å??é??äº?ä¸?个å¤?ä½?ç??页é?¢ï¼?ä¹?ä¼?è¿?è¡?ä¸?ä¸?é?¢ä¸?æ ·ç??å?ºäº?é¢?ç??ç??è°?æ?´: +SetPagePrivate(page) å?? resv_huge_pages--. + +å?¨è?·å¾?ä¸?个æ?°ç??巨页å??ï¼?(page)->private被设置为ä¸?该页é?¢ç?¸å?³ç??å?æ± ç??å?¼ï¼?å¦?æ??å®?å?å?¨ç??è¯?ã??å½?页 +é?¢è¢«é??æ?¾æ?¶ï¼?è¿?å°?被ç?¨äº?å?æ± ç??计æ?°ã?? + +ç?¶å??è°?ç?¨å?½æ?°vma_commit_reservation()ï¼?æ ¹æ?®é¢?ç??ç??æ¶?è??æ??å?µè°?æ?´é¢?ç??æ? å°?ã??ä¸?è?¬æ?¥è¯´ï¼?è¿?æ¶?å?? +å?°ç¡®ä¿?页é?¢å?¨å?ºå??æ? å°?ç??file_regionç»?æ??ä½?ä¸è¢«è¡¨ç¤ºã??对äº?é¢?ç??å?å?¨ç??å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?ä¸ç??æ?¡ç?® +å·²ç»?å?å?¨ï¼?æ??以ä¸?å??ä»»ä½?æ?¹å??ã??ç?¶è??ï¼?å¦?æ??å?±äº«æ? å°?ä¸æ²¡æ??é¢?ç??ï¼?æ??è??è¿?æ?¯ä¸?个ç§?æ??æ? å°?ï¼?å??å¿?é¡»å??建ä¸? +个æ?°ç??æ?¡ç?®ã?? + +注æ??ï¼?å¦?æ??æ?¾ä¸?å?°æ»¡è¶³VMAå??å?ç?ç?¥ç??巨页ï¼?å°?å°?è¯?使ç?¨ä¼?ä¼´å??é??å?¨å??é??ä¸?个ã??è¿?就带æ?¥äº?è¶?å?ºé¢?ç??è??å?´ +ç??å?©ä½?巨页å??è¿?度å??é??ç??é?®é¢?ã??å?³ä½¿å??é??äº?ä¸?个å¤?ä½?ç??页é?¢ï¼?ä¹?ä¼?è¿?è¡?ä¸?ä¸?é?¢ä¸?æ ·ç??å?ºäº?é¢?ç??ç??è°?æ?´ã?? +SetPagePrivate(page)å??resv_huge_pages-ã?? + +å?¨è?·å¾?ä¸?个æ?°ç??巨页å??ï¼?(page)->private被设置为ä¸?该页é?¢ç?¸å?³ç??å?æ± ç??å?¼ï¼?å¦?æ??å®?å?å?¨ç??è¯?ã??å½?页 +é?¢è¢«é??æ?¾æ?¶ï¼?è¿?å°?被ç?¨äº?å?æ± ç??计æ?°ã?? + +ç?¶å??è°?ç?¨å?½æ?°vma_commit_reservation()ï¼?æ ¹æ?®é¢?ç??ç??æ¶?è??æ??å?µè°?æ?´é¢?ç??æ? å°?ã??ä¸?è?¬æ?¥è¯´ï¼?è¿?æ¶?å?? +å?°ç¡®ä¿?页é?¢å?¨å?ºå??æ? å°?ç??file_regionç»?æ??ä½?ä¸è¢«è¡¨ç¤ºã??对äº?é¢?ç??å?å?¨ç??å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?ä¸ç??æ?¡ç?® +å·²ç»?å?å?¨ï¼?æ??以ä¸?å??ä»»ä½?æ?¹å??ã??ç?¶è??ï¼?å¦?æ??å?±äº«æ? å°?ä¸æ²¡æ??é¢?ç??ï¼?æ??è??è¿?æ?¯ä¸?个ç§?æ??æ? å°?ï¼?å??å¿?é¡»å??建 +ä¸?个æ?°ç??æ?¡ç?®ã?? + +å?¨alloc_huge_page()å¼?å§?è°?ç?¨vma_needs_reservation()å??页é?¢å??é??å??è°?ç?¨ +vma_commit_reservation()ä¹?é?´ï¼?é¢?ç??æ? å°?æ??å?¯è?½è¢«æ?¹å??ã??å¦?æ??hugetlb_reserve_pageså?¨å?± +享æ? å°?ä¸ä¸ºå??ä¸?页é?¢è¢«è°?ç?¨ï¼?è¿?å°?æ?¯å?¯è?½ç??ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?é¢?ç??计æ?°å??å?æ± ç©ºé?²é¡µè®¡æ?°ä¼?æ??ä¸?个å??å·®ã?? +è¿?ç§?ç½?è§?ç??æ??å?µå?¯ä»¥é??è¿?æ¯?è¾?vma_needs_reservationå??vma_commit_reservationç??è¿?å??å?¼æ?¥ +è¯?å?«ã??å¦?æ??æ£?æµ?å?°è¿?ç§?ç«?äº?ï¼?å?æ± å??å?¨å±?é¢?ç??计æ?°å°?被è°?æ?´ä»¥è¿?è¡?è¡¥å?¿ã??å?³äº?è¿?äº?å?½æ?°ç??æ?´å¤?ä¿¡æ?¯ï¼?请 +å??è§? :ref:`é¢?ç??æ? å°?帮å?©å?½æ?° <resv_map_helpers>` ä¸?è??ã?? + + +å®?ä¾?å??巨页 +========== + +å?¨å·¨é¡µå??é??ä¹?å??ï¼?页é?¢é??常被添å? å?°å??é??ä»»å?¡ç??页表ä¸ã??å?¨æ¤ä¹?å??ï¼?å?±äº«æ? å°?ä¸ç??页é?¢è¢«æ·»å? å?°é¡µé?¢ç¼? +å?ä¸ï¼?ç§?æ??æ? å°?ä¸ç??页é?¢è¢«æ·»å? å?°å?¿å??å??å??æ? å°?ä¸ã??å?¨è¿?两ç§?æ??å?µä¸?ï¼?PagePrivateæ ?å¿?被æ¸?é?¤ã??å? æ¤ï¼? +å½?ä¸?个已ç»?å®?ä¾?å??ç??巨页被é??æ?¾æ?¶ï¼?ä¸?ä¼?对å?¨å±?é¢?ç??计æ?°ï¼?resv_huge_pagesï¼?è¿?è¡?è°?æ?´ã?? + + +é??æ?¾å·¨é¡µ +======== + +巨页é??æ?¾æ?¯ç?±å?½æ?°free_huge_page()æ?§è¡?ç??ã??è¿?个å?½æ?°æ?¯hugetlbfså¤?å??页ç??æ??æ??å?¨ã??å? æ¤ï¼?å®?å?ªä¼ +é??ä¸?个æ??å??页é?¢ç»?æ??ä½?ç??æ??é??ã??å½?ä¸?个巨页被é??æ?¾æ?¶ï¼?å?¯è?½é??è¦?è¿?è¡?é¢?ç??计ç®?ã??å¦?æ??该页ä¸?å??å?«ä¿? +ç??ç??å?æ± ç?¸å?³è??ï¼?æ??è??该页å?¨é??误路å¾?ä¸?被é??æ?¾ï¼?å¿?é¡»æ?¢å¤?å?¨å±?é¢?ç??计æ?°ï¼?å°±ä¼?å?ºç?°è¿?ç§?æ??å?µã?? + +page->privateå?段æ??å??ä¸?该页ç?¸å?³ç??ä»»ä½?å?æ± ã??å¦?æ??PagePrivateæ ?å¿?被设置ï¼?å®?表æ??å?¨å±?é¢?ç??计æ?° +åº?该被è°?æ?´ï¼?å?³äº?å¦?ä½?设置è¿?äº?æ ?å¿?ç??ä¿¡æ?¯ï¼?请å??è§? +:ref: `æ¶?è??é¢?ç??/å??é??ä¸?个巨页 <consume_resv>` ï¼?ã?? + + +该å?½æ?°é¦?å??è°?ç?¨hugepage_subpool_put_pages()æ?¥å¤?ç??该页ã??å¦?æ??è¿?个å?½æ?°è¿?å??ä¸?个0ç??å?¼ï¼?ä¸?ç?äº? +ä¼ é??ç??1ç??å?¼ï¼?ï¼?å®?表æ??é¢?ç??ä¸?å?æ± ç?¸å?³è??ï¼?è¿?个æ?°é??æ?¾ç??页é?¢å¿?须被ç?¨æ?¥ä¿?æ??å?æ± é¢?ç??ç??æ?°é??è¶?è¿?æ??å°?å?¼ã?? +å? æ¤ï¼?å?¨è¿?ç§?æ??å?µä¸?ï¼?å?¨å±?resv_huge_pages计æ?°å?¨è¢«é??å¢?ã?? + +å¦?æ??页é?¢ä¸è®¾ç½®äº?PagePrivateæ ?å¿?ï¼?é?£ä¹?å?¨å±?resv_huge_pages计æ?°å?¨å°?æ°¸è¿?被é??å¢?ã?? + +å?æ± é¢?ç?? +======== + +æ??ä¸?个ç»?æ??ä½?hstateä¸?æ¯?个巨页尺寸ç?¸å?³è??ã??hstateè·?踪æ??æ??æ??å®?大å°?ç??巨页ã??ä¸?个å?æ± ä»£è¡¨ä¸? +个hstateä¸ç??页é?¢å?é??ï¼?å®?ä¸?ä¸?个已æ??è½½ç??hugetlbfsæ??件系ç»?ç?¸å?³ + +å½?ä¸?个hugetlbfsæ??件系ç»?被æ??è½½æ?¶ï¼?å?¯ä»¥æ??å®?min_sizeé??项ï¼?å®?表示æ??件系ç»?æ??é??ç??æ??å°?ç??巨页æ?°é??ã?? +å¦?æ??æ??å®?äº?è¿?个é??项ï¼?ä¸?min_sizeç?¸å¯¹åº?ç??巨页ç??æ?°é??å°?被é¢?ç??ç»?æ??件系ç»?使ç?¨ã??è¿?个æ?°å?å?¨ç»?æ??ä½? +hugepage_subpoolç??min_hpageså?段ä¸è¢«è·?踪ã??å?¨æ??è½½æ?¶ï¼?hugetlb_acct_memory(min_hpages) +被è°?ç?¨ä»¥é¢?ç??æ??å®?æ?°é??ç??巨页ã??å¦?æ??å®?们ä¸?è?½è¢«é¢?ç??ï¼?æ??载就ä¼?失败ã?? + +å½?ä»?å?æ± ä¸è?·å??æ??é??æ?¾é¡µé?¢æ?¶ï¼?ä¼?è°?ç?¨hugepage_subpool_get/put_pages()å?½æ?°ã?? +hugepage_subpool_get/put_pagesè¢«ä¼ é??ç»?巨页æ?°é??ï¼?以æ¤æ?¥è°?æ?´å?æ± ç?? â??å·²ç?¨é¡µé?¢â?? 计æ?° +ï¼?get为ä¸?é??ï¼?put为ä¸?å??ï¼?ã??é??常æ??å?µä¸?ï¼?å¦?æ??å?æ± ä¸æ²¡æ??足å¤?ç??页é?¢ï¼?å®?们ä¼?è¿?å??ä¸?ä¼ é??ç??ç?¸å??ç??å?¼æ?? +ä¸?个é??误ã?? + +ç?¶è??ï¼?å¦?æ??é¢?ç??ä¸?å?æ± ç?¸å?³è??ï¼?å?¯è?½ä¼?è¿?å??ä¸?个å°?äº?ä¼ é??å?¼ç??è¿?å??å?¼ã??è¿?个è¿?å??å?¼è¡¨ç¤ºå¿?é¡»è¿?è¡?ç??é¢?å¤?å?¨å±? +æ± è°?æ?´ç??æ?°é??ã??ä¾?å¦?ï¼?å??设ä¸?个å?æ± å??å?«3个é¢?ç??ç??巨页ï¼?æ??人è¦?æ±?5个ã??ä¸?å?æ± ç?¸å?³ç??3个é¢?ç??页å?¯ä»¥ç?¨æ?¥ +满足é?¨å??请æ±?ã??ä½?æ?¯ï¼?å¿?é¡»ä»?å?¨å±?æ± ä¸è?·å¾?2个页é?¢ã??为äº?å??è°?ç?¨è??转达è¿?ä¸?ä¿¡æ?¯ï¼?å°?è¿?å??å?¼2ã??ç?¶å??ï¼?è°?ç?¨ +è??è¦?è´?è´£ä»?å?¨å±?æ± ä¸è?·å??å?¦å¤?两个页é?¢ã?? + + +COWå??é¢?ç?? +========== + +ç?±äº?å?±äº«æ? å°?é?½æ??å??并使ç?¨ç?¸å??ç??åº?å±?页é?¢ï¼?COWæ??大ç??é¢?ç??é?®é¢?æ?¯ç§?æ??æ? å°?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?两个任å?¡å?¯ +以æ??å??å??ä¸?个å??å??å??é??ç??页é?¢ã??ä¸?个任å?¡è¯?å?¾å??å?°è¯¥é¡µï¼?æ??以å¿?é¡»å??é??ä¸?个æ?°ç??页ï¼?以便æ¯?个任å?¡é?½æ??å??å®? +è?ªå·±ç??页ã?? + +å½?该页æ??å??被å??é??æ?¶ï¼?该页ç??é¢?ç??被æ¶?è??äº?ã??å½?ç?±äº?COWè??è¯?å?¾å??é??ä¸?个æ?°ç??页é?¢æ?¶ï¼?æ??å?¯è?½æ²¡æ??空é?²ç??å·¨ +页ï¼?å??é??ä¼?失败ã?? + +å½?æ??å??å??建ç§?æ??æ? å°?æ?¶ï¼?é??è¿?设置æ??æ??è??ç??é¢?ç??æ? å°?æ??é??ä¸ç??HPAGE_RESV_OWNERä½?æ?¥æ ?è®°æ? å°?ç??æ??æ??è??ã?? +ç?±äº?æ??æ??è??å??建äº?æ? å°?ï¼?æ??æ??è??æ?¥æ??ä¸?æ? å°?ç?¸å?³ç??æ??æ??é¢?ç??ã??å? æ¤ï¼?å½?ä¸?个å??å¼?常å??ç??并ä¸?没æ??å?¯ç?¨ç??页é?¢ +æ?¶ï¼?对é¢?ç??ç??æ??æ??è??å??é??æ??æ??è??é??å??ä¸?å??ç??è¡?å?¨ã?? + +å?¨å??ç??å¼?常ç??ä»»å?¡ä¸?æ?¯æ??æ??è??ç??æ??å?µä¸?ï¼?å¼?常å°?失败ï¼?该任å?¡é??常ä¼?æ?¶å?°ä¸?个SIGBUSã?? + +å¦?æ??æ??æ??è??æ?¯å??ç??å¼?常ç??ä»»å?¡ï¼?æ??们å¸?æ??å®?è?½å¤?æ??å??ï¼?å? 为å®?æ?¥æ??å??å§?ç??é¢?ç??ã??为äº?è¾¾å?°è¿?个ç?®ç??ï¼?该页被 +ä»?é??æ??æ??è??ä»»å?¡ä¸è§£æ? å°?å?ºæ?¥ã??è¿?æ ·ä¸?æ?¥ï¼?å?¯ä¸?ç??å¼?ç?¨å°±æ?¯æ?¥è?ªæ?¥æ??è??ç??ä»»å?¡ã??æ¤å¤?ï¼?HPAGE_RESV_UNMAPPED +ä½?被设置å?¨é??æ?¥æ??ä»»å?¡ç??é¢?ç??æ? å°?æ??é??ä¸ã??å¦?æ??é??æ?¥æ??è??ä»»å?¡å??æ?¥å?¨ä¸?个ä¸?å?å?¨ç??页é?¢ä¸?å??ç??å¼?常ï¼?å®?å?¯è?½ +ä¼?æ?¶å?°ä¸?个SIGBUSã??ä½?æ?¯ï¼?æ? å°?/é¢?ç??ç??å??å§?æ?¥æ??è??ç??è¡?为å°?ä¸?é¢?æ??ä¸?è?´ã?? + +é¢?ç??æ? å°?ç??ä¿®æ?¹ +============== + +以ä¸?ä½?级å?½æ?°ç?¨äº?对é¢?ç??æ? å°?è¿?è¡?ä¿®æ?¹ã??é??常æ??å?µä¸?ï¼?è¿?äº?å?½æ?°ä¸?ä¼?被ç?´æ?¥è°?ç?¨ã??è??æ?¯è°?ç?¨ä¸?个é¢?ç??æ? å°?è¾? +å?©å?½æ?°ï¼?该å?½æ?°è°?ç?¨è¿?äº?ä½?级å?½æ?°ä¸ç??ä¸?个ã??è¿?äº?ä½?级å?½æ?°å?¨æº?代ç ?ï¼?mm/hugetlb.cï¼?ä¸å¾?å?°äº?ç?¸å½?好ç?? +è®°å½?ã??è¿?äº?å?½æ?°æ?¯:: + + long region_chg(struct resv_map *resv, long f, long t); + long region_add(struct resv_map *resv, long f, long t); + void region_abort(struct resv_map *resv, long f, long t); + long region_count(struct resv_map *resv, long f, long t); + +å?¨é¢?ç??æ? å°?ä¸?ç??æ??ä½?é??常æ¶?å??两个æ??ä½?: + +1) region_chg()被è°?ç?¨æ?¥æ£?æ?¥é¢?ç??æ? å°?ï¼?并确å®?å?¨æ??å®?ç??è??å?´[f, t]å??æ??å¤?å°?页ç?®å??没æ??被代表ã?? + + è°?ç?¨ä»£ç ?æ?§è¡?å?¨å±?æ£?æ?¥å??å??é??ï¼?以确å®?æ?¯å?¦æ??足å¤?ç??巨页使æ??ä½?æ??å??ã?? + +2) + a) å¦?æ??æ??ä½?è?½å¤?æ??å??ï¼?regi_add()å°?被è°?ç?¨ï¼?以å®?é??ä¿®æ?¹å??å??ä¼ é??ç»?regi_chg()ç??ç?¸å??è??å?´ + [f, t]ç??é¢?ç??æ? å°?ã?? + b) å¦?æ??æ??ä½?ä¸?è?½æ??å??ï¼?region_abort被è°?ç?¨ï¼?å?¨ç?¸å??ç??è??å?´[f, t]å??ä¸æ¢æ??ä½?ã?? + +注æ??ï¼?è¿?æ?¯ä¸?个两æ¥ç??è¿?ç¨?ï¼? region_add()å?? region_abort()å?¨äº?å??è°?ç?¨ region_chg()å??ä¿?è¯? +æ??å??ã?? region_chg()è´?è´£é¢?å??å??é??ä»»ä½?å¿?è¦?ç??æ?°æ?®ç»?æ??以确ä¿?å??ç»æ??ä½?ï¼?ç?¹å?«æ?¯ region_add()ï¼?ç?? +æ??å??ã?? + +å¦?ä¸?æ??è¿°ï¼?region_chg()ç¡®å®?该è??å?´å??å½?å??没æ??å?¨æ? å°?ä¸è¡¨ç¤ºç??页é?¢ç??æ?°é??ã??region_add()è¿?å??æ·»å? +å?°æ? å°?ä¸ç??è??å?´å??ç??页æ?°ã??å?¨å¤§å¤?æ?°æ??å?µä¸?ï¼? region_add() ç??è¿?å??å?¼ä¸? region_chg() ç??è¿?å??å?¼ç?¸ +å??ã??ç?¶è??ï¼?å?¨å?±äº«æ? å°?ç??æ??å?µä¸?ï¼?æ??å?¯è?½å?¨è°?ç?¨ region_chg() å?? region_add() ä¹?é?´å¯¹é¢?ç??æ? å°?è¿? +è¡?æ?´æ?¹ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?regi_add()ç??è¿?å??å?¼å°?ä¸?regi_chg()ç??è¿?å??å?¼ä¸?符ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?å?¨å±?计æ?° +å??å?æ± è®¡æ?°å¾?å?¯è?½æ?¯ä¸?æ£ç¡®ç??ï¼?é??è¦?è°?æ?´ã??æ£?æ?¥è¿?ç§?æ??å?µå¹¶è¿?è¡?é??å½?ç??è°?æ?´æ?¯è°?ç?¨è??ç??责任ã?? + +å?½æ?°region_del()被è°?ç?¨ä»¥ä»?é¢?ç??æ? å°?ä¸ç§»é?¤å?ºå??ã?? +å®?é??常å?¨ä»¥ä¸?æ??å?µä¸?被è°?ç?¨: + +- å½?hugetlbfsæ??件系ç»?ä¸ç??ä¸?个æ??件被å? é?¤æ?¶ï¼?该è??ç?¹å°?被é??æ?¾ï¼?é¢?ç??æ? å°?ä¹?被é??æ?¾ã??å?¨é??æ?¾é¢?ç??æ? å°? + ä¹?å??ï¼?æ??æ??å??ç?¬ç??file_regionç»?æ??ä½?å¿?须被é??æ?¾ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?region_delç??è??å?´æ?¯[0, LONG_MAX]ã?? +- å½?ä¸?个hugetlbfsæ??件æ£å?¨è¢«æ?ªæ?æ?¶ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?æ??æ??å?¨æ?°æ??件大å°?ä¹?å??å??é??ç??页é?¢å¿?须被é??æ?¾ã?? + æ¤å¤?ï¼?é¢?ç??æ? å°?ä¸ä»»ä½?è¶?è¿?æ?°æ??件大å°?ç??file_regionæ?¡ç?®å¿?须被å? é?¤ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?region_del + ç??è??å?´æ?¯[new_end_of_file, LONG_MAX]ã?? +- å½?å?¨ä¸?个hugetlbfsæ??件ä¸æ??æ´?æ?¶ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?巨页被ä¸?次次ä»?æ??件ç??ä¸é?´ç§»é?¤ã??å½?è¿?äº?页被移é?¤ + æ?¶ï¼?region_del()被è°?ç?¨ä»¥ä»?é¢?ç??æ? å°?ä¸ç§»é?¤ç?¸åº?ç??æ?¡ç?®ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?region_delè¢«ä¼ é??ç??è?? + å?´æ?¯[page_idx, page_idx + 1]ã?? + +å?¨ä»»ä½?æ??å?µä¸?ï¼?region_del()é?½ä¼?è¿?å??ä»?é¢?ç??æ? å°?ä¸å? é?¤ç??页é?¢æ?°é??ã??å?¨é??常ç½?è§?ç??æ??å?µä¸?ï¼?region_del() +ä¼?失败ã??è¿?å?ªè?½å??ç??å?¨æ??æ´?ç??æ??å?µä¸?ï¼?å?³å®?å¿?é¡»å??å?²ä¸?个ç?°æ??ç??file_regionæ?¡ç?®ï¼?è??ä¸?è?½å??é??ä¸?个æ?°ç?? +ç»?æ??ä½?ã??å?¨è¿?ç§?é??误æ??å?µä¸?ï¼?region_del()å°?è¿?å??-ENOMEMã??è¿?é??ç??é?®é¢?æ?¯ï¼?é¢?ç??æ? å°?å°?æ?¾ç¤ºå¯¹è¯¥é¡µæ?? +é¢?ç??ã??ç?¶è??ï¼?å?æ± å??å?¨å±?é¢?ç??计æ?°å°?ä¸?å??æ? 该é¢?ç??ã??为äº?å¤?ç??è¿?ç§?æ??å?µï¼?è°?ç?¨å?½æ?°hugetlb_fix_reserve_counts() +æ?¥è°?æ?´è®¡æ?°å?¨ï¼?使å?¶ä¸?ä¸?è?½è¢«å? é?¤ç??é¢?ç??æ? å°?æ?¡ç?®ç?¸å¯¹åº?ã?? + +region_count()å?¨è§£é?¤ç§?æ??巨页æ? å°?æ?¶è¢«è°?ç?¨ã??å?¨ç§?æ??æ? å°?ä¸ï¼?é¢?ç??æ? å°?ä¸æ²¡æ??æ?¡ç?®è¡¨æ??å?å?¨ä¸?个é¢?ç??ã?? +å? æ¤ï¼?é??è¿?计ç®?é¢?ç??æ? å°?ä¸ç??æ?¡ç?®æ?°ï¼?æ??们ç?¥é??æ??å¤?å°?é¢?ç??被æ¶?è??äº?ï¼?æ??å¤?å°?é¢?ç??æ?¯æ?ªå®?æ??ç?? +ï¼?Outstanding = (end - start) - region_countï¼?resv, start, endï¼?ï¼?ã??ç?±äº?æ? å°?æ£å?¨æ¶? +失ï¼?å?æ± å??å?¨å±?é¢?ç??计æ?°è¢«æ?ªå®?æ??ç??é¢?ç??æ?°é??æ??å??å?»ã?? + +é¢?ç??æ? å°?帮å?©å?½æ?° +================ + +æ??å? 个è¾?å?©å?½æ?°å?¯ä»¥æ?¥è¯¢å??ä¿®æ?¹é¢?ç??æ? å°?ã??è¿?äº?å?½æ?°å?ªå¯¹ç?¹å®?ç??巨页ç??é¢?ç??æ??å?´è¶£ï¼?æ??以å®?们å?ªæ?¯ä¼ å?¥ä¸?个 +å?°å??è??ä¸?æ?¯ä¸?个è??å?´ã??æ¤å¤?ï¼?å®?们è¿?ä¼ å?¥ç?¸å?³ç??VMAã??ä»?VMAä¸ï¼?å?¯ä»¥ç¡®å®?æ? å°?ç??ç±»å??ï¼?ç§?æ??æ??å?±äº«ï¼?å??é¢?ç?? +æ? å°?ç??ä½?ç½®ï¼?inodeæ??VMAï¼?ã??è¿?äº?å?½æ?°å?ªæ?¯è°?ç?¨ â??é¢?ç??æ? å°?ç??ä¿®æ?¹â?? ä¸?è??ä¸æ??è¿°ç??å?ºç¡?å?½æ?°ã??ç?¶è??ï¼? +å®?们确å®?è??è??å?°äº?ç§?æ??å??å?±äº«æ? å°?ç??é¢?ç??æ? å°?æ?¡ç?®ç?? â??ç?¸å??â?? å?«ä¹?ï¼?并å??è°?ç?¨è??é??è??äº?è¿?个ç»?è??:: + + long vma_needs_reservation(struct hstate *h, + struct vm_area_struct *vma, + unsigned long addr) + +该å?½æ?°ä¸ºæ??å®?ç??页é?¢è°?ç?¨ region_chg()ã??å¦?æ??ä¸?å?å?¨é¢?ç??ï¼?å??è¿?å??1ã??å¦?æ??å?å?¨é¢?ç??ï¼?å??è¿?å??0:: + + long vma_commit_reservation(struct hstate *h, + struct vm_area_struct *vma, + unsigned long addr) + +è¿?å°?è°?ç?¨ region_add()ï¼?ç?¨äº?æ??å®?ç??页é?¢ã??ä¸?region_chgå??region_addç??æ??å?µä¸?æ ·ï¼?该å?½æ?°åº?å?¨ +å??å??è°?ç?¨ç??vma_needs_reservationå??è°?ç?¨ã??å®?å°?为该页添å? ä¸?个é¢?ç??æ?¡ç?®ã??å¦?æ??é¢?ç??被添å? ï¼?å®?å°? +è¿?å??1ï¼?å¦?æ??没æ??å??è¿?å??0ã??è¿?å??å?¼åº?ä¸?ä¹?å??è°?ç?¨vma_needs_reservationç??è¿?å??å?¼è¿?è¡?æ¯?è¾?ã??å¦?æ??å?º +ç?°æ??å¤?ç??å·®å¼?ï¼?说æ??å?¨ä¸¤æ¬¡è°?ç?¨ä¹?é?´ä¿®æ?¹äº?é¢?ç??æ? å°?:: + + void vma_end_reservation(struct hstate *h, + struct vm_area_struct *vma, + unsigned long addr) + +è¿?å°?è°?ç?¨æ??å®?页é?¢ç?? region_abort()ã??ä¸?region_chgå??region_abortç??æ??å?µä¸?æ ·ï¼?该å?½æ?°åº?å?¨ +å??å??è°?ç?¨ç??vma_needs_reservationå??被è°?ç?¨ã??å®?å°?ä¸æ¢/ç»?æ??æ£å?¨è¿?è¡?ç??é¢?ç??æ·»å? æ??ä½?:: + + long vma_add_reservation(struct hstate *h, + struct vm_area_struct *vma, + unsigned long addr) + +è¿?æ?¯ä¸?个ç?¹æ®?ç??å??è£?å?½æ?°ï¼?æ??å?©äº?å?¨é??误路å¾?ä¸?æ¸?ç??é¢?ç??ã??å®?å?ªä»?repare_reserve_on_error()å?½æ?° +ä¸è°?ç?¨ã??该å?½æ?°ä¸?vma_needs_reservationä¸?起使ç?¨ï¼?è¯?å?¾å°?ä¸?个é¢?ç??æ·»å? å?°é¢?ç??æ? å°?ä¸ã??å®?è??è??å?° +äº?ç§?æ??å??å?±äº«æ? å°?ç??ä¸?å??é¢?ç??æ? å°?è¯ä¹?ã??å? æ¤ï¼?region_add被è°?ç?¨ç?¨äº?å?±äº«æ? å°?ï¼?å? 为æ? å°?ä¸ç??æ?¡ç?®è¡¨ +示é¢?ç??ï¼?ï¼?è??region_del被è°?ç?¨ç?¨äº?ç§?æ??æ? å°?ï¼?å? 为æ? å°?ä¸æ²¡æ??æ?¡ç?®è¡¨ç¤ºé¢?ç??ï¼?ã??å?³äº?å?¨é??误路å¾?ä¸?é?? +è¦?å??ä»?ä¹?ç??æ?´å¤?ä¿¡æ?¯ï¼?请å??è§? â??é??误路å¾?ä¸ç??é¢?ç??æ¸?ç??â?? ã?? + + +é??误路å¾?ä¸ç??é¢?ç??æ¸?ç?? +==================== + +æ£å¦?å?¨:ref:`é¢?ç??æ? å°?帮å?©å?½æ?°<resv_map_helpers>` ä¸?è??ä¸æ??å?°ç??ï¼?é¢?ç??ç??ä¿®æ?¹å??两æ¥è¿?è¡?ã??é¦? +å??ï¼?å?¨å??é??页é?¢ä¹?å??è°?ç?¨vma_needs_reservationã??å¦?æ??å??é??æ??å??ï¼?å??è°?ç?¨vma_commit_reservationã?? +å¦?æ??ä¸?æ?¯ï¼?å??è°?ç?¨vma_end_reservationã??å?¨å±?å??å?æ± ç??é¢?ç??计æ?°æ ¹æ?®æ??ä½?ç??æ??å??æ??失败è¿?è¡?è°?æ?´ï¼? +ä¸?å??é?½å¾?好ã?? + +æ¤å¤?ï¼?å?¨ä¸?个巨页被å®?ä¾?å??å??ï¼?PagePrivateæ ?å¿?被æ¸?空ï¼?è¿?æ ·ï¼?å½?页é?¢æ??ç»?被é??æ?¾æ?¶ï¼?计æ?°æ?¯ +æ£ç¡®ç??ã?? + +ç?¶è??ï¼?æ??å? ç§?æ??å?µæ?¯ï¼?å?¨ä¸?个巨页被å??é??å??ï¼?ä½?å?¨å®?被å®?ä¾?å??ä¹?å??ï¼?å°±é??å?°äº?é??误ã??å?¨è¿?ç§?æ??å?µä¸?ï¼? +页é?¢å??é??å·²ç»?æ¶?è??äº?é¢?ç??ï¼?并è¿?è¡?äº?é??å½?ç??å?æ± ã??é¢?ç??æ? å°?å??å?¨å±?计æ?°è°?æ?´ã??å¦?æ??页é?¢å?¨è¿?个æ?¶å??被é??æ?¾ +ï¼?å?¨å®?ä¾?å??å??æ¸?é?¤PagePrivateä¹?å??ï¼?ï¼?é?£ä¹?free_huge_pageå°?å¢?å? å?¨å±?é¢?ç??计æ?°ã??ç?¶è??ï¼?é¢?ç??æ? å°? +æ?¾ç¤ºæ?¥ç??被æ¶?è??äº?ã??è¿?ç§?ä¸?ä¸?è?´ç??ç?¶æ??å°?导è?´é¢?ç??ç??巨页ç?? â??æ³?æ¼?â?? ã??å?¨å±?é¢?ç??计æ?°å°?æ¯?å®?å??æ?¬ç??è¦?é«?ï¼? +并é?»æ¢å??é??ä¸?个é¢?å??å??é??ç??页é?¢ã?? + +å?½æ?° restore_reserve_on_error() è¯?å?¾å¤?ç??è¿?ç§?æ??å?µã??å®?æ??ç?¸å½?å®?å??ç??æ??æ¡£ã??è¿?个å?½æ?°ç??ç?®ç?? +æ?¯å°?é¢?ç??æ? å°?æ?¢å¤?å?°é¡µé?¢å??é??å??ç??ç?¶æ??ã??é??è¿?è¿?ç§?æ?¹å¼?ï¼?é¢?ç??æ? å°?ç??ç?¶æ??å°?ä¸?页é?¢é??æ?¾å??ç??å?¨å±?é¢?ç??计 +æ?°ç?¸å¯¹åº?ã?? + +å?½æ?°restore_reserve_on_erroræ?¬èº«å?¨è¯?å?¾æ?¢å¤?é¢?ç??æ? å°?æ?¡ç?®æ?¶å?¯è?½ä¼?é??å?°é??误ã??å?¨è¿?ç§?æ??å?µä¸?ï¼? +å®?å°?ç®?å??å?°æ¸?é?¤è¯¥é¡µç??PagePrivateæ ?å¿?ã??è¿?æ ·ä¸?æ?¥ï¼?å½?页é?¢è¢«é??æ?¾æ?¶ï¼?å?¨å±?é¢?ç??计æ?°å°?ä¸?ä¼?被é??å¢?ã?? +ç?¶è??ï¼?é¢?ç??æ? å°?å°?继ç»ç??èµ·æ?¥å??é¢?ç??被æ¶?è??äº?ä¸?æ ·ã??ä¸?个页é?¢ä»?ç?¶å?¯ä»¥è¢«å??é??å?°è¯¥å?°å??ï¼?ä½?å®?ä¸?ä¼?å??æ?? +å??设æ?³ç??é?£æ ·ä½¿ç?¨ä¸?个é¢?ç??页ã?? + +æ??ä¸?äº?代ç ?ï¼?æ??æ??æ?¾ç??æ?¯userfaultfdï¼?ä¸?è?½è°?ç?¨restore_reserve_on_errorã??å?¨è¿?ç§?æ??å?µä¸?ï¼? +å®?ç®?å??å?°ä¿®æ?¹äº?PagePrivateï¼?以便å?¨é??æ?¾å·¨é¡µæ?¶ä¸?ä¼?æ³?é?²é¢?ç??ã?? + + +é¢?ç??å??å??å?ç?ç?¥ +============== +å½?git第ä¸?次被ç?¨æ?¥ç®¡ç??Linux代ç ?æ?¶ï¼?æ¯?个è??ç?¹ç??巨页å??表就å?å?¨äº?hstateç»?æ??ä¸ã??é¢?ç??ç??æ¦?念æ?¯ +å?¨ä¸?段æ?¶é?´å??å? å?¥ç??ã??å½?é¢?ç??被添å? æ?¶ï¼?没æ??å°?è¯?å°?å??å?ç?ç?¥è??è??å?¨å??ã??è?½ç?¶cpusetsä¸?å??å?ç?ç?¥ä¸? +å®?å?¨ç?¸å??ï¼?ä½?hugetlb_acct_memoryä¸ç??è¿?个注é??æ?»ç»?äº?é¢?ç??å??cpusets/å??å?ç?ç?¥ä¹?é?´ç??ç?¸äº?ä½? +ç?¨:: + + + /* + * å½?cpuset被é??ç½®æ?¶ï¼?å®?æ??ç ´äº?ä¸¥æ ¼ç??hugetlb页é?¢é¢?ç??ï¼?å? 为计æ?°æ?¯å?¨ä¸?个å?¨å±?å??é??ä¸?å®? + * æ??ç??ã??å?¨æ??cpusetç??æ??å?µä¸?ï¼?è¿?æ ·ç??é¢?ç??å®?å?¨æ?¯å??å?¾ï¼?å? 为é¢?ç??没æ??æ ¹æ?®å½?å??cpusetç?? + * 页é?¢å?¯ç?¨æ?§æ?¥æ£?æ?¥ã??å?¨ä»»å?¡æ??å?¨ç??cpusetä¸ç¼ºä¹?空é?²ç??htlb页é?¢æ?¶ï¼?åº?ç?¨ç¨?åº?ä»?ç?¶æ??å?¯è?½ + * 被å??æ ¸OOM'edã??è¯?å?¾ç?¨cpusetæ?¥æ?§è¡?ä¸¥æ ¼ç??计æ?°å? ä¹?æ?¯ä¸?å?¯è?½ç??ï¼?æ??è??说太é?¾ç??äº?ï¼?ï¼?å? + * 为cpuset太ä¸?稳å®?äº?ï¼?ä»»å?¡æ??å??å?è??ç?¹å?¯ä»¥å?¨cpusetä¹?é?´å?¨æ??移å?¨ã??ä¸?cpusetå?±äº« + * hugetlbæ? å°?ç??è¯ä¹?å??å??æ?¯ä¸?å?¯å??ç??ã??ç?¶è??ï¼?为äº?é¢?ç??ä¸?äº?è¯ä¹?ï¼?æ??们é??å??å?°æ£?æ?¥å½?å??空é?² + * 页ç??å?¯ç?¨æ?§ï¼?ä½?为ä¸?ç§?æ??好ç??å°?è¯?ï¼?å¸?æ??è?½å°?cpusetæ?¹å??è¯ä¹?ç??å½±å??é??å?°æ??ä½?ã?? + */ + +æ·»å? 巨页é¢?ç??æ?¯ä¸ºäº?é?²æ¢å?¨ç¼ºé¡µå¼?常æ?¶å?ºç?°æ??å¤?ç??页é?¢å??é??失败ï¼?OOMï¼?ã??ç?¶è??ï¼?å¦?æ??ä¸?个åº?ç?¨ +ç¨?åº?使ç?¨cpusetsæ??å??å?ç?ç?¥ï¼?å°±ä¸?è?½ä¿?è¯?å?¨æ??é??ç??è??ç?¹ä¸?æ??巨页å?¯ç?¨ã??å?³ä½¿æ??足å¤?æ?°é??ç??å?¨å±? +é¢?ç??ï¼?ä¹?æ?¯å¦?æ¤ã?? + +Hugetlbfså??å½?æµ?è¯? +================= + +æ??å®?æ?´ç??hugetlbæµ?è¯?é??å?¨libhugetlbfsä»?åº?ã??å¦?æ??ä½ ä¿®æ?¹äº?ä»»ä½?hugetlbç?¸å?³ç??代ç ?ï¼?请使ç?¨ +libhugetlbfsæµ?è¯?å¥?件æ?¥æ£?æ?¥å??å½?æ??å?µã??æ¤å¤?ï¼?å¦?æ??ä½ æ·»å? äº?ä»»ä½?æ?°ç??hugetlbå??è?½ï¼?请å?¨ +libhugetlbfsä¸æ·»å? é??å½?ç??æµ?è¯?ã?? + +-- +Mike Kravetzï¼?2017å¹´4æ??7æ?¥ --- /dev/null +++ a/Documentation/translations/zh_CN/mm/hwpoison.rst @@ -0,0 +1,166 @@ + +:Original: Documentation/mm/hwpoison.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +======== +hwpoison +======== + +ä»?ä¹?æ?¯hwpoison? +=============== + + +å?³å°?æ?¨å?ºç??è?±ç?¹å°?CPUæ?¯æ??ä»?ä¸?äº?å??å?é??误ä¸æ?¢å¤?ï¼? ``MCAæ?¢å¤?`` ï¼?ã??è¿?é??è¦?æ??ä½?ç³»ç»?宣å¸? +ä¸?个页é?¢"poisoned"ï¼?æ??æ»ä¸?ä¹?ç?¸å?³ç??è¿?ç¨?ï¼?并é?¿å??å?¨æ?ªæ?¥ä½¿ç?¨å®?ã?? + +è¿?个补ä¸?å??å?¨è??æ??æ?ºä¸å®?ç?°äº?å¿?è¦?ç??(ç¼?ç¨?)æ¡?æ?¶ã?? + +å¼?ç?¨æ¦?è¿°ä¸ç??è¯?论:: + + é«?级æ?ºå?¨ç??æ£?æ?¥ä¸?å¤?ç??ã??å¤?ç??æ?¹æ³?æ?¯æ??å??ç??页é?¢è¢«ç¡¬ä»¶æ?¥å??ï¼?é??常æ?¯ç?±äº?2ä½?ECCå?? + å?æ??é«?é??ç¼?å?æ??é??ã?? + + è¿?主è¦?æ?¯é??对å?¨å??å?°æ£?æµ?å?°ç??æ??å??ç??页é?¢ã??å½?å½?å??ç??CPUè¯?å?¾è®¿é?®å®?æ?¶ï¼?å½?å??è¿?è¡?ç??è¿?ç¨? + å?¯ä»¥ç?´æ?¥è¢«æ??æ»ã??å? 为è¿?没æ??访é?®æ??å??ç??页é?¢, å¦?æ??é??误ç?±äº?æ??ç§?å??å? ä¸?è?½è¢«å¤?ç??ï¼?å°±å?¯ + 以å®?å?¨å?°å¿½ç?¥å®?. è??ä¸?æ?¯ç?¨å?¦å¤?ä¸?个æ?ºå?¨æ£?æ?¥å?»å¤?ç??å®?ã?? + + å¤?ç??ä¸?å??ç?¶æ??ç??页é?¢ç¼?å?页ã??è¿?é??æ£?æ??ç??é?¨å??æ?¯ï¼?ç?¸å¯¹äº?å?¶ä»?è??æ??å??å?ç?¨æ?·ï¼? æ??们å?¯ä»¥å¼? + æ¥è®¿é?®ä»»ä½?页é?¢ã??å? 为å??å?æ??é??å?¯è?½é??æ?¶é??å?°å??ç??ï¼?å?¯è?½è¿?å??äº?ä»?们ç??ä¸?äº?å??设ã??è¿?å°±æ?¯ + 为ä»?ä¹?è¿?段代ç ?å¿?é¡»é??常å°?å¿?ã??ä¸?è?¬æ?¥è¯´ï¼?å®?è¯?å?¾ä½¿ç?¨æ£å¸¸ç??é??è§?å??ï¼?å¦?è?·å¾?æ ?å??é??ï¼?å?³ä½¿ + è¿?æ??å?³ç??é??误å¤?ç??å?¯è?½é??è¦?å¾?é?¿ç??æ?¶é?´ã?? + + è¿?é??ç??ä¸?äº?æ??ä½?æ??ç?¹ä½?æ??ï¼?并ä¸?å?·æ??é??线æ?§ç??ç®?æ³?å¤?æ??æ?§ï¼?å? 为æ?°æ?®ç»?æ??没æ??é??对è¿?ç§?æ?? + å?µè¿?è¡?ä¼?å??ã??ç?¹å?«æ?¯ä»?vmaå?°è¿?ç¨?ç??æ? å°?å°±æ?¯è¿?ç§?æ??å?µã??ç?±äº?è¿?ç§?æ??å?µå¤§æ¦?ç??æ?¯ç½?è§?ç??ï¼?æ?? + 以æ??们å¸?æ??æ??们å?¯ä»¥æ??è?±è¿?ç§?æ??å?µã?? + +该代ç ?ç?±mm/memory-failure.cä¸ç??é«?级å¤?ç??ç¨?åº?ã??ä¸?个æ?°ç??页é?¢poisonä½?å??è??æ??æ?ºä¸ç?? +å??ç§?æ£?æ?¥ç»?æ??ï¼?ç?¨æ?¥å¤?ç??poisonç??页é?¢ã?? + +ç?°å?¨ä¸»è¦?ç?®æ ?æ?¯KVM客æ?·æ?ºï¼?ä½?å®?é??ç?¨äº?æ??æ??ç±»å??ç??åº?ç?¨ç¨?åº?ã??æ?¯æ??KVMé??è¦?æ??è¿?ç??qemu-kvm +ç??æ?¬ã?? + +对äº?KVMç??使ç?¨ï¼?é??è¦?ä¸?个æ?°ç??ä¿¡å?·ç±»å??ï¼?è¿?æ ·KVMå°±å?¯ä»¥ç?¨é??å½?ç??å?°å??å°?æ?ºå?¨æ£?æ?¥æ³¨å?¥å?°å®¢æ?· +æ?ºä¸ã??è¿?å?¨ç??论ä¸?ä¹?å??许å?¶ä»?åº?ç?¨ç¨?åº?å¤?ç??å??å?æ??é??ã??æ??们ç??æ??æ??æ?¯ï¼?æ??æ??ç??åº?ç?¨ç¨?åº?é?½ä¸?è¦?è¿? +æ ·å??ï¼?ä½?ä¸?äº?é??常ä¸?ä¸?ç??åº?ç?¨ç¨?åº?å?¯è?½ä¼?è¿?æ ·å??ã?? + +æ??é??æ?¢å¤?模å¼? +============ + +æ??两ç§?ï¼?å®?é??ä¸?æ?¯ä¸?ç§?ï¼?模å¼?ç??å??å?æ??é??æ?¢å¤?å?¯ä»¥å?¨ã?? + +vm.memory_failure_recovery sysctl ç½®é?¶: + æ??æ??ç??å??å?æ??é??é?½ä¼?导è?´panicã??请ä¸?è¦?å°?è¯?æ?¢å¤?ã?? + +æ?©æ??å¤?ç?? + (å?¯ä»¥å?¨å?¨å±?å??æ¯?个è¿?ç¨?ä¸æ?§å?¶) ä¸?æ?¦æ£?æµ?å?°é??误ï¼?ç«?å?³å??åº?ç?¨ç¨?åº?å??é??SIGBUSè¿?å??许 + åº?ç?¨ç¨?åº?以温å??ç??æ?¹å¼?å¤?ç??å??å?é??误ï¼?ä¾?å¦?ï¼?æ?¾å¼?å??å½±å??ç??对象ï¼? è¿?æ?¯KVM qemu使ç?¨ç?? + 模å¼?ã?? + +æ?¨è¿?å¤?ç?? + å½?åº?ç?¨ç¨?åº?è¿?è¡?å?°æ??å??ç??页é?¢æ?¶ï¼?å??é??SIGBUSã??è¿?对ä¸?ç?¥é??å??å?é??误ç??åº?ç?¨ç¨?åº?æ?¥è¯´æ?¯ + æ??好ç??ï¼?é»?认æ??å?µä¸?注æ??ä¸?äº?页é?¢æ?»æ?¯è¢«å½?ä½?late killå¤?ç??ã?? + +ç?¨æ?·æ?§å?¶ +======== + +vm.memory_failure_recovery + å??é?? sysctl.txt + +vm.memory_failure_early_kill + å?¨å±?å?¯ç?¨early kill + +PR_MCE_KILL + 设置early/late kill mode/revert å?°ç³»ç»?é»?认å?¼ã?? + + arg1: PR_MCE_KILL_CLEAR: + æ?¢å¤?å?°ç³»ç»?é»?认å?¼ + arg1: PR_MCE_KILL_SET: + arg2å®?ä¹?äº?线ç¨?ç?¹å®?模å¼? + + PR_MCE_KILL_EARLY: + Early kill + PR_MCE_KILL_LATE: + Late kill + PR_MCE_KILL_DEFAULT + 使ç?¨ç³»ç»?å?¨å±?é»?认å?¼ + + 注æ??ï¼?å¦?æ??ä½ æ?³æ??ä¸?个ä¸?é?¨ç??线ç¨?代表è¿?ç¨?å¤?ç??SIGBUS(BUS_MCEERR_AO)ï¼?ä½ åº?该å?¨ + æ??å®?线ç¨?ä¸?è°?ç?¨prctl(PR_MCE_KILL_EARLY)ã??å?¦å??ï¼?SIGBUSå°?被å??é??å?°ä¸»çº¿ç¨?ã?? + +PR_MCE_KILL_GET + è¿?å??å½?å??模å¼? + +æµ?è¯? +==== + +* madvise(MADV_HWPOISON, ....) (as root) - å?¨æµ?è¯?è¿?ç¨?ä¸Poisonä¸?个页é?¢ + +* é??è¿?debugfs ``/sys/kernel/debug/hwpoison/`` hwpoison-inject模å?? + + corrupt-pfn + å?¨PFNå¤?注å?¥hwpoisonæ??é??ï¼?并echoedå?°è¿?个æ??件ã??è¿?å??äº?ä¸?äº?æ?©æ??è¿?滤ï¼?以é?¿ + å??å?¨æµ?è¯?å¥?件ä¸æ??å??é??é¢?æ??页é?¢ã?? + unpoison-pfn + å?¨PFNç??Software-unpoison页é?¢å¯¹åº?å?°è¿?个æ??件ã??è¿?æ ·ï¼?ä¸?个页é?¢å?¯ä»¥å??次被 + å¤?ç?¨ã??è¿?å?ªå¯¹Linux注å?¥ç??æ??é??èµ·ä½?ç?¨ï¼?对ç??æ£ç??å??å?æ??é??ä¸?èµ·ä½?ç?¨ã?? + + 注æ??è¿?äº?注å?¥æ?¥å?£å¹¶ä¸?稳å®?ï¼?å?¯è?½ä¼?å?¨ä¸?å??ç??å??æ ¸ç??æ?¬ä¸å??ç??å??å?? + + corrupt-filter-dev-major, corrupt-filter-dev-minor + å?ªå¤?ç??ä¸?å??设å¤?major/minorå®?ä¹?ç??æ??件系ç»?ç?¸å?³ç??页é?¢ç??å??å?æ??é??ã??-1Uæ?¯é?? + é??符å?¼ã??è¿?åº?该å?ªç?¨äº?人工注å?¥ç??æµ?è¯?ã?? + + corrupt-filter-memcg + é??å?¶æ³¨å?¥å?°memgroupæ?¥æ??ç??页é?¢ã??ç?±memcgç??inodeå?·æ??å®?ã?? + + Example:: + + mkdir /sys/fs/cgroup/mem/hwpoison + + usemem -m 100 -s 1000 & + echo `jobs -p` > /sys/fs/cgroup/mem/hwpoison/tasks + + memcg_ino=$(ls -id /sys/fs/cgroup/mem/hwpoison | cut -f1 -d' ') + echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg + + page-types -p `pidof init` --hwpoison # shall do nothing + page-types -p `pidof usemem` --hwpoison # poison its pages + + corrupt-filter-flags-mask, corrupt-filter-flags-value + å½?æ??å®?æ?¶ï¼?å?ªæ??å?¨((page_flags & mask) == value)ç??æ??å?µä¸?æ??ä¼?poison页é?¢ã?? + è¿?å??许对许å¤?ç§?ç±»ç??页é?¢è¿?è¡?å??å??æµ?è¯?ã??page_flagsä¸?/proc/kpageflagsä¸ç??ç?¸ + å??ã??è¿?äº?æ ?å¿?ä½?å?¨include/linux/kernel-page-flags.hä¸å®?ä¹?ï¼?并å?¨ + Documentation/admin-guide/mm/pagemap.rstä¸è®°å½?ã?? + +* æ?¶æ??ç?¹å®?ç??MCE注å?¥å?¨ + + x86 æ?? mce-inject, mce-test + + å?¨mce-testä¸ç??ä¸?äº?便æ?ºå¼?hwpoisonæµ?è¯?ç¨?åº?ï¼?è§?ä¸?æ??ã?? + +å¼?ç?¨ +==== + +http://halobates.de/mce-lc09-2.pdf + 09å¹´LinuxConç??æ¦?è¿°æ¼?讲 + +git://git.kernel.org/pub/scm/utils/cpu/mce/mce-test.git + æµ?è¯?å¥?件ï¼?å?¨tsrcä¸ç??hwpoisonç?¹å®?å?¯ç§»æ¤?æµ?è¯?ï¼?ã?? + +git://git.kernel.org/pub/scm/utils/cpu/mce/mce-inject.git + x86ç?¹å®?ç??注å?¥å?¨ + + +é??å?¶ +==== +- ä¸?æ?¯æ??æ??ç??页é?¢ç±»å??é?½è¢«æ?¯æ??ï¼?è??ä¸?æ°¸è¿?ä¸?ä¼?ã??大å¤?æ?°å??æ ¸å??é?¨å¯¹è±¡ä¸?è?½è¢«æ?¢ + å¤?ï¼?ç?®å??å?ªæ??LRU页ã?? + +--- +Andi Kleen, 2009å¹´10æ?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/index.rst @@ -0,0 +1,54 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/index.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + +================= +Linuxå??å?管ç??æ??æ¡£ +================= + +è¿?æ?¯ä¸?个å?³äº?Linuxå??å?管ç??ï¼?mmï¼?å?ç³»ç»?å??é?¨ç??æ??æ¡£é??ï¼?å?¶ä¸æ??ä¸?å??å±?次ç??ç»?è??ï¼?å??æ?¬æ³¨é?? +å??é?®ä»¶å??表ç??å??å¤?ï¼?ç?¨äº?é??è¿°æ?°æ?®ç»?æ??å??ç®?æ³?ç??å?ºæ?¬æ??å?µã??å¦?æ??ä½ æ£å?¨å¯»æ?¾å?³äº?ç®?å??å??é??å??å?ç??建 +è®®ï¼?请å??é??(Documentation/translations/zh_CN/core-api/memory-allocation.rst)ã?? +对äº?æ?§å?¶å??è°?æ?´æ??å??ï¼?请å??é??(Documentation/admin-guide/mm/index)ã?? +TODO:å¾?å¼?ç?¨æ??æ¡£é??被翻è¯?å®?æ¯?å??请å??æ?¶ä¿®æ?¹æ¤å¤?ï¼? + +.. toctree:: + :maxdepth: 1 + + active_mm + balance + damon/index + free_page_reporting + highmem + ksm + frontswap + hmm + hwpoison + hugetlbfs_reserv + memory-model + mmu_notifier + numa + overcommit-accounting + page_frags + page_owner + page_table_check + remap_file_pages + split_page_table_lock + z3fold + zsmalloc + +TODOLIST: +* arch_pgtable_helpers +* free_page_reporting +* hugetlbfs_reserv +* page_migration +* slub +* transhuge +* unevictable-lru +* vmalloced-kernel-stacks --- /dev/null +++ a/Documentation/translations/zh_CN/mm/ksm.rst @@ -0,0 +1,70 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/mm/ksm.rst + +:ç¿»è¯?: + + å¾?é?« xu xin <xu.xin16@xxxxxxxxxx> + +============ +å??æ ¸å??页å??并 +============ + +KSM æ?¯ä¸?ç§?è??ç??å??å?ç??æ?°æ?®å?»é??å??è?½ï¼?ç?±CONFIG_KSM=yå?¯ç?¨ï¼?并å?¨2.6.32ç??æ?¬æ?¶è¢«æ·»å? +å?°Linuxå??æ ¸ã??详è§? ``mm/ksm.c`` ç??å®?ç?°ï¼?以å??http://lwn.net/Articles/306704å;?? +https://lwn.net/Articles/330589 + +KSMç??ç?¨æ?·ç©ºé?´ç??æ?¥å?£å?¨Documentation/translations/zh_CN/admin-guide/mm/ksm.rst +æ??æ¡£ä¸æ??æ??è¿°ã?? + +设计 +==== + +æ¦?è¿° +---- + +æ¦?è¿°å??容请è§?mm/ksm.cæ??æ¡£ä¸ç??â??DOC: Overviewâ?? + +é??æ? å°? +------ +KSMç»´æ?¤ç??稳å®?æ ?ä¸ç??KSM页ç??é??æ? å°?ä¿¡æ?¯ã?? + +å½?KSM页é?¢ç??å?±äº«æ?°å°?äº? ``max_page_sharing`` ç??è??æ??å??å?å?ºå??(VMAs)æ?¶ï¼?å??代表äº? +KSM页ç??稳å®?æ ?å?¶ä¸ç??è??ç?¹æ??å??äº?ä¸?个rmap_itemç»?æ??ä½?ç±»å??ç??å??表ã??å??æ?¶ï¼?è¿?个KSM页 +ç?? ``page->mapping`` æ??å??äº?该稳å®?æ ?è??ç?¹ã?? + +å¦?æ??å?±äº«æ?°è¶?è¿?äº?é??å?¼ï¼?KSMå°?ç»?稳å®?æ ?æ·»å? 第äº?个维度ã??稳å®?æ ?å°±å??æ??é?¾æ?¥ä¸?个æ??å¤? +个稳å®?æ ?"å?¯æ?¬"ç??"é?¾"ã??æ¯?个å?¯æ?¬é?½ä¿?ç??KSM页ç??é??æ? å°?ä¿¡æ?¯ï¼?å?¶ä¸ ``page->mapping`` +æ??å??该"å?¯æ?¬"ã?? + +æ¯?个é?¾ä»¥å??é?¾æ?¥å?°è¯¥é?¾ä¸ç??æ??æ??"å?¯æ?¬"强å?¶ä¸?å??ç??æ?¯ï¼?å®?们代表äº?ç?¸å??ç??å??ä¿?æ?¤å??å? +å??容ï¼?尽管任ä¸ä¸?个"å?¯æ?¬"æ?¯ç?±å??ä¸?ç??å??å?å?ºç??ä¸?å??ç??KSMå¤?å?¶é¡µæ??æ??å??ç??ã?? + +è¿?æ ·ä¸?æ?¥ï¼?ç?¸æ¯?ä¸?æ? é??ç??é??æ? å°?é?¾è¡¨ï¼?稳å®?æ ?ç??æ?¥æ?¾è®¡ç®?å¤?æ??æ?§ä¸?å??å½±å??ã??ä½?å?¨ç¨³å®?æ ? +æ?¬èº«ä¸ä¸?è?½æ??é??å¤?ç??KSM页é?¢å??容ä»?ç?¶æ?¯å¼ºå?¶è¦?æ±?ã?? + +ç?± ``max_page_sharing`` 强å?¶å?³å®?ç??æ?°æ?®å?»é??é??å?¶æ?¯å¿?è¦?ç??ï¼?以æ¤æ?¥é?¿å??è??æ??å??å? +rmapé?¾è¡¨å??å¾?è¿?大ã??rmapç??é??å??å?·æ??O(N)ç??å¤?æ??度ï¼?å?¶ä¸Næ?¯å?±äº«é¡µé?¢ç??rmap_项ï¼?å?³ +è??æ??æ? å°?ï¼?ç??æ?°é??ï¼?è??è¿?个å?±äº«é¡µé?¢ç??è??ç?¹æ?°é??å??被 ``max_page_sharing`` æ??é??å?¶ã?? +å? æ¤ï¼?è¿?æ??æ??å?°å°?线æ?§O(N)计ç®?å¤?æ??度ä»?rmapé??å??ä¸å??æ?£å?°ä¸?å??ç??KSM页é?¢ä¸?ã??ksmdè¿? +ç¨?å?¨ç¨³å®?è??ç?¹"é?¾"ä¸?ç??é??å??ä¹?æ?¯O(N)ï¼?ä½?è¿?个Næ?¯ç¨³å®?æ ?"å?¯æ?¬"ç??æ?°é??ï¼?è??ä¸?æ?¯rmap项 +ç??æ?°é??ï¼?å? æ¤å®?对ksmdæ?§è?½æ²¡æ??æ?¾è??å½±å??ã??å®?é??ä¸?ï¼?æ??佳稳å®?æ ?"å?¯æ?¬"ç??å??é??è??ç?¹å°? +ä¿?ç??å?¨"å?¯æ?¬"å??表ç??å¼?头ã?? + +``max_page_sharing`` ç??å?¼è®¾ç½®å¾?é«?äº?ä¼?ä¿?使æ?´å¿«ç??å??å?å??并ï¼?å? 为å°?æ??æ?´å°?ç??稳å®? +æ ?å?¯æ?¬æ??é??è¿?å?¥ç¨³å®?è??ç?¹chain->hlistï¼?å??æ?´é«?ç??æ?°æ?®å?»é??ç³»æ?°ï¼?ä½?代价æ?¯å?¨äº¤æ?¢ã??å?? +缩ã??NUMA平衡å??页é?¢è¿?移è¿?ç¨?ä¸å?¯è?½å¯¼è?´KSM页ç??æ??大rmapé??å??é??度è¾?æ?¢ã?? + +``stable_node_dups/stable_node_chains`` ç??æ¯?å?¼è¿?å?? ``max_page_sharing`` è°?æ?§ +ç??å½±å??ï¼?é«?æ¯?å?¼å?¯è?½æ??å?³ç??稳å®?è??ç?¹dupä¸å?å?¨ç¢?ç??ï¼?è¿?å?¯ä»¥é??è¿?å?¨ksmdä¸å¼?å?¥ç¢?ç??ç®? +æ³?æ?¥è§£å?³ï¼?该ç®?æ³?å°?rmap项ä»?ä¸?个稳å®?è??ç?¹dupé??å®?ä½?å?°å?¦ä¸?个稳å®?è??ç?¹dupï¼?以便é??æ?¾ +é?£äº?ä»?å??å?«æ??å°?rmap项ç??稳å®?è??ç?¹"dup"ï¼?ä½?è¿?å?¯è?½ä¼?å¢?å? ksmdè¿?ç¨?ç??CPU使ç?¨ç??ï¼?并å?¯ +è?½ä¼?å??æ?¢åº?ç?¨ç¨?åº?å?¨KSM页é?¢ä¸?ç??å?ªè¯»è®¡ç®?ã?? + +KSMä¼?å®?æ??æ?«æ??稳å®?è??ç?¹"é?¾"ä¸é?¾æ?¥ç??æ??æ??稳å®?æ ?"å?¯æ?¬"ï¼?以便å? å??è¿?æ?¶äº?ç??稳å®?è??ç?¹ã?? +è¿?ç§?æ?«æ??ç??é¢?ç??ç?± ``stable_node_chains_prune_millisecs`` è¿?个sysfs æ?¥å?£å®?ä¹?ã?? + +å??è?? +==== +å??æ ¸ä»£ç ?请è§?mm/ksm.cã?? +æ¶?å??ç??å?½æ?°(mm_slot ksm_scan stable_node rmap_item)ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/memory-model.rst @@ -0,0 +1,135 @@ +.. SPDX-License-Identifier: GPL-2.0 + +:Original: Documentation/mm/memory-model.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +============ +ç?©ç??å??å?模å?? +============ + +ç³»ç»?ä¸ç??ç?©ç??å??å?å?¯ä»¥ç?¨ä¸?å??ç??æ?¹å¼?è¿?è¡?寻å??ã??æ??ç®?å??ç??æ??å?µæ?¯ï¼?ç?©ç??å??å?ä»?å?°å??0å¼? +å§?ï¼?è·¨è¶?ä¸?个è¿?ç»ç??è??å?´ï¼?ç?´å?°æ??大ç??å?°å??ã??ç?¶è??ï¼?è¿?个è??å?´å?¯è?½å??å?«CPUæ? æ³?访é?®ç?? +å°?å?é??ã??é?£ä¹?ï¼?å?¨å®?å?¨ä¸?å??ç??å?°å??å?¯è?½æ??å? 个è¿?ç»ç??è??å?´ã??è??ä¸?ï¼?å?«å¿?äº?NUMAï¼?å?³ä¸? +å??ç??å??å?åº?è¿?æ?¥å?°ä¸?å??ç??CPUã?? + +Linux使ç?¨ä¸¤ç§?å??å?模å??ä¸ç??ä¸?ç§?对è¿?ç§?å¤?æ ·æ?§è¿?è¡?æ?½è±¡ã??FLATMEMå??SPARSEMã??æ¯? +个æ?¶æ??é?½å®?ä¹?äº?å®?æ??æ?¯æ??ç??å??å?模å??ï¼?é»?认ç??å??å?模å??æ?¯ä»?ä¹?ï¼?以å??æ?¯å?¦æ??å?¯è?½æ??å?¨ +è¦?ç??该é»?认å?¼ã?? + +æ??æ??ç??å??å?模å??é?½ä½¿ç?¨æ??å??å?¨ä¸?个æ??å¤?个æ?°ç»?ä¸ç?? `struct page` æ?¥è·?踪ç?©ç??页 +帧ç??ç?¶æ??ã?? + +æ? 论é??æ?©å?ªç§?å??å?模å??ï¼?ç?©ç??页æ¡?å?·ï¼?PFNï¼?å??ç?¸åº?ç?? `struct page` ä¹?é?´é?½å? +å?¨ä¸?对ä¸?ç??æ? å°?å?³ç³»ã?? + +æ¯?个å??å?模å??é?½å®?ä¹?äº? :c:func:`pfn_to_page` å?? :c:func:`page_to_pfn` +帮å?©å?½æ?°ï¼?å??许ä»?PFNå?° `struct page` ç??转æ?¢ï¼?å??ä¹?亦ç?¶ã?? + +FLATMEM +======= + +æ??ç®?å??ç??å??å?模å??æ?¯FLATMEMã??è¿?个模å??é??ç?¨äº?é??NUMAç³»ç»?ç??è¿?ç»æ??大é?¨å??è¿?ç»ç?? +ç?©ç??å??å?ã?? + +å?¨FLATMEMå??å?模å??ä¸ï¼?æ??ä¸?个å?¨å±?ç?? `mem_map` æ?°ç»?æ?¥æ? å°?æ?´ä¸ªç?©ç??å??å?ã??对 +äº?大å¤?æ?°æ?¶æ??ï¼?å?é??å?¨ `mem_map` æ?°ç»?ä¸é?½æ??æ?¡ç?®ã??ä¸?å?æ´?ç?¸å¯¹åº?ç?? `struct page` +对象ä»?æ?ªè¢«å®?å?¨å??å§?å??ã?? + +为äº?å??é?? `mem_map` æ?°ç»?ï¼?æ?¶æ??ç?¹å®?ç??设置代ç ?åº?该è°?ç?¨free_area_init()å?½æ?°ã?? +ç?¶è??ï¼?å?¨è°?ç?¨memblock_free_all()å?½æ?°ä¹?å??ï¼?æ? å°?æ?°ç»?æ?¯ä¸?è?½ä½¿ç?¨ç??ï¼?该å?½æ?° +å°?æ??æ??ç??å??å?交ç»?页å??é??å?¨ã?? + +ä¸?个æ?¶æ??å?¯è?½ä¼?é??æ?¾ `mem_map` æ?°ç»?ä¸ä¸?å??æ?¬å®?é??ç?©ç??页ç??é?¨å??ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?ç?¹ +å®?æ?¶æ??ç?? :c:func:`pfn_valid` å®?ç?°åº?该è??è??å?° `mem_map` ä¸ç??å?é??ã?? + +使ç?¨FLATMEMï¼?PFNå?? `struct page` ä¹?é?´ç??转æ?¢æ?¯ç?´æ?¥ç??ã?? `PFN - ARCH_PFN_OFFSET` +æ?¯ `mem_map` æ?°ç»?ç??ä¸?个索å¼?ã?? + +`ARCH_PFN_OFFSET` å®?ä¹?äº?ç?©ç??å??å?èµ·å§?å?°å??ä¸?å??äº?0ç??ç³»ç»?ç??第ä¸?个页æ¡?å?·ã?? + +SPARSEMEM +========= + +SPARSEMEMæ?¯Linuxä¸æ??é??ç?¨ç??å??å?模å??ï¼?å®?æ?¯å?¯ä¸?æ?¯æ??è?¥å¹²é«?级å??è?½ç??å??å?模å??ï¼? +å¦?ç?©ç??å??å?ç??ç?æ??æ??ã??é??æ??失æ?§å??å?设å¤?ç??æ?¿ä»£å??å?å?¾å??è¾?大系ç»?ç??å??å?å?¾ç??延è¿? +å??å§?å??ã?? + +SPARSEMEM模å??å°?ç?©ç??å??å?æ?¾ç¤ºä¸ºä¸?个é?¨å??ç??é??å??ã??ä¸?个å?ºæ®µç?¨mem_sectionç»?æ?? +ä½?表示ï¼?å®?å??å?« `section_mem_map` ï¼?ä»?é?»è¾?ä¸?讲ï¼?å®?æ?¯ä¸?个æ??å?? `struct page` +é?µå??ç??æ??é??ã??ç?¶è??ï¼?å®?被å?å?¨å?¨ä¸?äº?å?¶ä»?ç??magicä¸ï¼?以帮å?©å??å?ºç®¡ç??ã??å?ºæ®µç??大å°? +å??æ??大å?ºæ®µæ?°æ?¯ä½¿ç?¨ `SECTION_SIZE_BITS` å?? `MAX_PHYSMEM_BITS` 常é?? +æ?¥æ??å®?ç??ï¼?è¿?两个常é??æ?¯ç?±æ¯?个æ?¯æ??SPARSEMEMç??æ?¶æ??å®?ä¹?ç??ã?? `MAX_PHYSMEM_BITS` +æ?¯ä¸?个æ?¶æ??æ??æ?¯æ??ç??ç?©ç??å?°å??ç??å®?é??宽度ï¼?è?? `SECTION_SIZE_BITS` æ?¯ä¸?个任 +æ??ç??å?¼ã?? + +æ??大ç??段æ?°è¡¨ç¤ºä¸º `NR_MEM_SECTIONS` ï¼?å®?ä¹?为 + +.. math:: + + NR\_MEM\_SECTIONS = 2 ^ {(MAX\_PHYSMEM\_BITS - SECTION\_SIZE\_BITS)} + +`mem_section` 对象被å®?æ??å?¨ä¸?个å?«å?? `mem_sections` ç??äº?ç»´æ?°ç»?ä¸ã??è¿?个æ?°ç»?ç?? +大å°?å??ä½?ç½®å??å?³äº? `CONFIG_SPARSEM_EXTREME` å??å?¯è?½ç??æ??大段æ?°: + +* å½? `CONFIG_SPARSEMEM_EXTREME` 被ç¦?ç?¨æ?¶ï¼? `mem_sections` æ?°ç»?æ?¯é??æ??ç??ï¼?æ?? + `NR_MEM_SECTIONS` è¡?ã??æ¯?ä¸?è¡?æ??æ??ä¸?个 `mem_section` 对象ã?? +* å½? `CONFIG_SPARSEMEM_EXTREME` 被å?¯ç?¨æ?¶ï¼? `mem_sections` æ?°ç»?被å?¨æ??å??é??ã?? + æ¯?ä¸?è¡?å??å?«ä»·å?¼ `PAGE_SIZE` ç?? `mem_section` 对象ï¼?è¡?æ?°ç??计ç®?æ?¯ä¸ºäº?é??åº?æ??æ??ç?? + å??å?å?ºã?? + +æ?¶æ??设置代ç ?åº?该è°?ç?¨sparse_init()æ?¥å??å§?å??å??å?å?ºå??å??å?æ? å°?ã?? + +é??è¿?SPARSEMEMï¼?æ??两ç§?å?¯è?½ç??æ?¹å¼?å°?PFN转æ?¢ä¸ºç?¸åº?ç?? `struct page` --"classic sparse"å?? + "sparse vmemmap"ã??é??æ?©æ?¯å?¨æ??建æ?¶è¿?è¡?ç??ï¼?å®?ç?± `CONFIG_SPARSEMEM_VMEMMAP` ç?? + å?¼å?³å®?ã?? + +Classic sparseå?¨page->flagsä¸ç¼?ç ?äº?ä¸?个页é?¢ç??段å?·ï¼?并使ç?¨PFNç??é«?ä½?æ?¥è®¿é?®æ? å°?该页 +æ¡?ç??段ã??å?¨ä¸?个å?ºæ®µå??ï¼?PFNæ?¯æ??å??页æ?°ç»?ç??ç´¢å¼?ã?? + +Sparse vmemmapvmemmap使ç?¨è??æ??æ? å°?ç??å??å?æ? å°?æ?¥ä¼?å??pfn_to_pageå??page_to_pfnæ?? +ä½?ã??æ??ä¸?个å?¨å±?ç?? `struct page *vmemmap` æ??é??ï¼?æ??å??ä¸?个è??æ??è¿?ç»ç?? `struct page` +对象é?µå??ã??PFNæ?¯è¯¥æ?°ç»?ç??ä¸?个索å¼?ï¼?`struct page` ä»? `vmemmap` ç??å??移é??æ?¯è¯¥é¡µç??PFNã?? + +为äº?使ç?¨vmemmapï¼?ä¸?个æ?¶æ??å¿?é¡»ä¿?ç??ä¸?个è??æ??å?°å??ç??è??å?´ï¼?以æ? å°?å??å?«å??å?æ? å°?ç??ç?©ç??页ï¼?并 +ç¡®ä¿? `vmemmap`æ??å??该è??å?´ã??æ¤å¤?ï¼?æ?¶æ??åº?该å®?ç?° :c:func:`vmemmap_populate` æ?¹æ³?ï¼? +å®?å°?å??é??ç?©ç??å??å?并为è??æ??å??å?æ? å°?å??建页表ã??å¦?æ??ä¸?个æ?¶æ??对vmemmapæ? å°?没æ??ä»»ä½?ç?¹æ®?è¦?æ±?ï¼? +å®?å?¯ä»¥ä½¿ç?¨é??ç?¨å??å?管ç??æ??ä¾?ç??é»?认 :c:func:`vmemmap_populate_basepages`ã?? + +è??æ??æ? å°?ç??å??å?æ? å°?å??许å°?æ??ä¹?æ?§å??å?设å¤?ç?? `struct page` 对象å?å?¨å?¨è¿?äº?设å¤?ä¸?é¢?å??å?? +é??ç??å?å?¨ä¸ã??è¿?ç§?å?å?¨ç?¨vmem_altmapç»?æ??表示ï¼?æ??ç»?é??è¿?ä¸?é?¿ä¸²ç??å?½æ?°è°?ç?¨ä¼ é??ç»? +vmemmap_populate()ã??vmemmap_populate()å®?ç?°å?¯ä»¥ä½¿ç?¨ `vmem_altmap` å?? +:c:func:`vmemmap_alloc_block_buf` å?©æ??æ?¥å??é??æ??ä¹?æ?§å??å?设å¤?ä¸?ç??å??å?æ? å°?ã?? + +ZONE_DEVICE +=========== +`ZONE_DEVICE` 设æ?½å»ºç«?å?¨ `SPARSEM_VMEMMAP` ä¹?ä¸?ï¼?为设å¤?驱å?¨è¯?å?«ç??ç?©ç??å?°å??è?? +å?´æ??ä¾? `struct page` `mem_map` æ??å?¡ã?? `ZONE_DEVICE` ç?? "设å¤?" æ?¹é?¢ä¸?以ä¸? +äº?å®?æ??å?³ï¼?è¿?äº?å?°å??è??å?´ç??页é?¢å¯¹è±¡ä»?æ?ªè¢«å?¨çº¿æ ?è®°è¿?ï¼?è??ä¸?å¿?须对设å¤?è¿?è¡?å¼?ç?¨ï¼?è??ä¸?ä»?ä»? +æ?¯é¡µé?¢ï¼?以ä¿?æ??å??å?被â??é??å®?â??以便使ç?¨ã?? `ZONE_DEVICE` ï¼?é??è¿? :c:func:`devm_memremap_pages` ï¼? +为ç»?å®?ç??pfnsè??å?´æ?§è¡?足å¤?ç??å??å?ç?æ??æ??æ?¥å¼?å?¯ :c:func:`pfn_to_page`ï¼? +:c:func:`page_to_pfn`, ï¼?å?? :c:func:`get_user_pages` æ??å?¡ã??ç?±äº?页é?¢å¼? +ç?¨è®¡æ?°æ°¸è¿?ä¸?ä¼?ä½?äº?1ï¼?æ??以页é?¢æ°¸è¿?ä¸?ä¼?被追踪为空é?²å??å?ï¼?页é?¢ç?? `struct list_head lru` +空é?´è¢«é??æ?°å?©ç?¨ï¼?ç?¨äº?å??æ? å°?该å??å?ç??主æ?ºè®¾å¤?/驱å?¨ç¨?åº?è¿?è¡?å??å??å¼?ç?¨ã?? + +è?½ç?¶ `SPARSEMEM` å°?å??å?ä½?为ä¸?个å?ºæ®µç??é??å??ï¼?å?¯ä»¥é??æ?©æ?¶é??并å??æ??å??å?å??ï¼?ä½? +`ZONE_DEVICE` ç?¨æ?·é??è¦?æ?´å°?ç??é¢?ç²?度æ?¥å¡«å?? `mem_map` ã??é?´äº? `ZONE_DEVICE` +å??å?ä»?æ?ªè¢«å?¨çº¿æ ?è®°ï¼?å? æ¤å®?ç??å??å?è??å?´ä»?æ?ªé??è¿?sysfså??å?ç?æ??æ??apiæ?´é?²å?¨å??å?å??è¾¹ç?? +ä¸?ã??è¿?个å®?ç?°ä¾?èµ?äº?è¿?ç§?缺ä¹?ç?¨æ?·æ?¥å?£ç??约æ??ï¼?å??许å?段大å°?ç??å??å?è??å?´è¢«æ??å®?ç»? +:c:func:`arch_add_memory` ï¼?å?³å??å?ç?æ??æ??ç??ä¸?å??é?¨å??ã??å?段æ?¯æ??å??许2MBä½?为 +:c:func:`devm_memremap_pages` ç??è·¨æ?¶æ??é??ç?¨å¯¹é½?é¢?ç²?度ã?? + +`ZONE_DEVICE` ç??ç?¨æ?·æ?¯: + +* pmem: é??è¿?DAXæ? å°?å°?å¹³å?°æ??ä¹?æ?§å??å?ä½?为ç?´æ?¥I/Oç?®æ ?使ç?¨ã?? + +* hmm: ç?¨ `->page_fault()` å?? `->page_free()` äº?件å??è°?æ?©å±? `ZONE_DEVICE` ï¼? + 以å??许设å¤?驱å?¨ç¨?åº?å??è°?ä¸?设å¤?å??å?ç?¸å?³ç??å??å?管ç??äº?件ï¼?é??常æ?¯GPUå??å?ã??å??è§?Docmentation/mm/hmm.rstã?? + +* p2pdma: å??建 `struct page` 对象ï¼?å??许PCI/Eæ??æ??ç»?æ??ä¸ç??peer设å¤?å??è°?å®?们ä¹?é?´ç?? + ç?´æ?¥DMAæ??ä½?ï¼?å?³ç»?è¿?主æ?ºå??å?ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/mmu_notifier.rst @@ -0,0 +1,97 @@ +:Original: Documentation/mm/mmu_notifier.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + + +ä»?ä¹?æ?¶å??é??è¦?页表é??å??é??ç?¥ï¼? +========================== + +å½?æ¸?é?¤ä¸?个pte/pmdæ?¶ï¼?æ??们å?¯ä»¥é??æ?©é??è¿?å?¨é¡µè¡¨é??ä¸?ï¼?é??ç?¥ç??ç??\*_clear_flushè°?ç?¨ +mmu_notifier_invalidate_rangeï¼?é??ç?¥äº?件ã??ä½?è¿?ç§?é??ç?¥å¹¶ä¸?æ?¯å?¨æ??æ??æ??å?µä¸?é?½é??è¦?ç??ã?? + +对äº?äº?级TLBï¼?é??CPU TLBï¼?ï¼?å¦?IOMMU TLBæ??设å¤?TLBï¼?å½?设å¤?使ç?¨ç±»ä¼¼ATS/PASIDç??ä¸?西让 +IOMMUèµ°CPU页表æ?¥è®¿é?®è¿?ç¨?ç??è??æ??å?°å??空é?´ï¼?ã??å?ªæ??两ç§?æ??å?µé??è¦?å?¨æ¸?é?¤pte/pmdæ?¶å?¨æ??æ??页 +表é??ç??å??æ?¶é??ç?¥è¿?äº?äº?级TLBï¼? + + A) å?¨mmu_notifier_invalidate_range_end()ä¹?å??ï¼?æ?¯æ??页ç??å?°å??被é??æ?¾ã?? + B) ä¸?个页表项被æ?´æ?°ä»¥æ??å??ä¸?个æ?°ç??页é?¢ï¼?COWï¼?é?¶é¡µä¸?ç??å??å¼?常ï¼?__replace_page()ï¼?...ï¼?ã?? + +æ??å?µAå¾?æ??æ?¾ï¼?ä½ ä¸?æ?³å??é£?é?©è®©è®¾å¤?å??å?°ä¸?个ç?°å?¨å?¯è?½è¢«ä¸?äº?å®?å?¨ä¸?å??ç??ä»»å?¡ä½¿ç?¨ç??页é?¢ã?? + +æ??å?µBæ?´å? å¾®å¦?ã??为äº?æ£ç¡®èµ·è§?ï¼?å®?é??è¦?æ??ç?§ä»¥ä¸?åº?å??å??ç??: + + - ä¸?页表é?? + - æ¸?é?¤é¡µè¡¨é¡¹å¹¶é??ç?¥ ([pmd/pte]p_huge_clear_flush_notify()) + - 设置页表项以æ??å??æ?°é¡µ + +å¦?æ??å?¨è®¾ç½®æ?°ç??pte/pmdå?¼ä¹?å??ï¼?æ¸?é?¤é¡µè¡¨é¡¹ä¹?å??没æ??è¿?è¡?é??ç?¥ï¼?é?£ä¹?ä½ å°±ä¼?ç ´å??设å¤?ç??C11æ?? +C++11ç?å??å?模å??ã?? + +è??è??以ä¸?æ??å?µï¼?设å¤?使ç?¨ç±»ä¼¼äº?ATS/PASIDç??å??è?½ï¼?ã?? + +两个å?°å??addrAå??addrBï¼?è¿?æ ·|addrA - addrB| >= PAGE_SIZEï¼?æ??们å??设å®?们æ?¯COWç?? +å??ä¿?æ?¤ï¼?Bç??å?¶ä»?æ??å?µä¹?é??ç?¨ï¼?ã?? + +:: + + [Time N] -------------------------------------------------------------------- + CPU-thread-0 {å°?è¯?å??å?°addrA} + CPU-thread-1 {å°?è¯?å??å?°addrB} + CPU-thread-2 {} + CPU-thread-3 {} + DEV-thread-0 {读å??addrA并填å??设å¤?TLB} + DEV-thread-2 {读å??addrB并填å??设å¤?TLB} + [Time N+1] ------------------------------------------------------------------ + CPU-thread-0 {COW_step0: {mmu_notifier_invalidate_range_start(addrA)}} + CPU-thread-1 {COW_step0: {mmu_notifier_invalidate_range_start(addrB)}} + CPU-thread-2 {} + CPU-thread-3 {} + DEV-thread-0 {} + DEV-thread-2 {} + [Time N+2] ------------------------------------------------------------------ + CPU-thread-0 {COW_step1: {æ?´æ?°é¡µè¡¨ä»¥æ??å??addrAç??æ?°é¡µ}} + CPU-thread-1 {COW_step1: {æ?´æ?°é¡µè¡¨ä»¥æ??å??addrBç??æ?°é¡µ}} + CPU-thread-2 {} + CPU-thread-3 {} + DEV-thread-0 {} + DEV-thread-2 {} + [Time N+3] ------------------------------------------------------------------ + CPU-thread-0 {preempted} + CPU-thread-1 {preempted} + CPU-thread-2 {å??å?¥addrAï¼?è¿?æ?¯å¯¹æ?°é¡µé?¢ç??å??å?¥} + CPU-thread-3 {} + DEV-thread-0 {} + DEV-thread-2 {} + [Time N+3] ------------------------------------------------------------------ + CPU-thread-0 {preempted} + CPU-thread-1 {preempted} + CPU-thread-2 {} + CPU-thread-3 {å??å?¥addrBï¼?è¿?æ?¯ä¸?个å??å?¥æ?°é¡µç??è¿?ç¨?} + DEV-thread-0 {} + DEV-thread-2 {} + [Time N+4] ------------------------------------------------------------------ + CPU-thread-0 {preempted} + CPU-thread-1 {COW_step3: {mmu_notifier_invalidate_range_end(addrB)}} + CPU-thread-2 {} + CPU-thread-3 {} + DEV-thread-0 {} + DEV-thread-2 {} + [Time N+5] ------------------------------------------------------------------ + CPU-thread-0 {preempted} + CPU-thread-1 {} + CPU-thread-2 {} + CPU-thread-3 {} + DEV-thread-0 {ä»?æ?§é¡µä¸è¯»å??addrA} + DEV-thread-2 {ä»?æ?°é¡µé?¢è¯»å??addrB} + +æ??以å?¨è¿?é??ï¼?å? 为å?¨N+2ç??æ?¶å??ï¼?æ¸?空页表项没æ??å??é??ç?¥ä¸?èµ·ä½?åº?äº?级TLBï¼?设å¤?å?¨ç??å?°addrAç??æ?°å?¼ä¹?å?? +å°±ç??å?°äº?addrBç??æ?°å?¼ã??è¿?å°±ç ´å??äº?设å¤?ç??æ?»å??å?åº?ã?? + +å½?æ?¹å??ä¸?个pteç??å??ä¿?æ?¤æ??æ??å??ä¸?个æ?°ç??å?·æ??ç?¸å??å??容ç??å??ä¿?æ?¤é¡µï¼?KSMï¼?æ?¶ï¼?å°?mmu_notifier_invalidate_range +è°?ç?¨å»¶è¿?å?°é¡µè¡¨é??å¤?ç??mmu_notifier_invalidate_range_end()æ?¯å?¯ä»¥ç??ã??å?³ä½¿å??页表æ?´æ?°ç??线ç¨? +å?¨é??æ?¾é¡µè¡¨é??å??ä½?å?¨è°?ç?¨mmu_notifier_invalidate_range_end()å??被æ?¢å? ï¼?ä¹?æ?¯å¦?æ¤ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/numa.rst @@ -0,0 +1,101 @@ +:Original: Documentation/mm/numa.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +å§?äº?1999å¹´11æ??ï¼?ä½?è??ï¼? <kanoj@xxxxxxx> + +========================== +ä½?为é??ç»?ä¸?å??å?访é?®(NUMA)ï¼? +========================== + +è¿?个é?®é¢?å?¯ä»¥ä»?å? 个è§?è§?æ?¥å??ç?ï¼?硬件è§?ç?¹å??Linux软件è§?è§?ã?? + +ä»?硬件è§?度ç??ï¼?NUMAç³»ç»?æ?¯ä¸?个ç?±å¤?个ç»?件æ??è£?é??ç»?æ??ç??计ç®?æ?ºå¹³å?°ï¼?æ¯?个ç»?件å?¯è?½å??å?«0个æ??æ?´å¤?ç??CPUã?? +æ?¬å?°å??å?å??/æ??IOæ?»çº¿ã??为äº?ç®?æ´?èµ·è§?ï¼?并å°?è¿?äº?ç?©ç??ç»?件/è£?é??ç??硬件è§?è§?ä¸?软件æ?½è±¡å?ºå??å¼?æ?¥ï¼?æ??们å?¨ +æ?¬æ??ä¸ç§°è¿?äº?ç»?件/è£?é??为â??å??å??â??ã?? + +æ¯?个â??å??å??â??é?½å?¯ä»¥ç??ä½?æ?¯ç³»ç»?ç??ä¸?个SMP[对称å¤?å¤?ç??å?¨]å?é??â??â??尽管ç?¬ç«?ç??SMPç³»ç»?æ??é??ç??ä¸?äº?ç»?件å?¯è?½ +ä¸?ä¼?å?¨ä»»ä½?ç»?å®?ç??å??å??ä¸?å¡«å??ã??NUMAç³»ç»?ç??å??å??é??è¿?æ??ç§?ç³»ç»?äº?è¿?è¿?æ?¥å?¨ä¸?èµ·â??â??ä¾?å¦?ï¼?交å??å¼?å?³æ??ç?¹å¯¹ç?¹ +é?¾æ?¥æ?¯NUMAç³»ç»?äº?è¿?ç??常è§?ç±»å??ã??è¿?两ç§?ç±»å??ç??äº?è¿?é?½å?¯ä»¥è??å??èµ·æ?¥ï¼?以å??建NUMAå¹³å?°ï¼?å?¶ä¸ç??å??å??ä¸?å?¶ +ä»?å??å??æ??å¤?个è·?离ã?? + +对äº?Linuxï¼?æ??å?´è¶£ç??NUMAå¹³å?°ä¸»è¦?æ?¯æ??è°?ç??ç¼?å?ç?¸å¹²NUMA--ç®?称ccNUMAç³»ç»?ç³»ç»?ã??å?¨ccNUMAç³»ç»?ä¸ï¼? +æ??æ??ç??å??å?é?½æ?¯å?¯è§?ç??ï¼?并ä¸?å?¯ä»¥ä»?è¿?æ?¥å?°ä»»ä½?å??å??ç??ä»»ä½?CPUä¸è®¿é?®ï¼?ç¼?å?ä¸?è?´æ?§æ?¯ç?±å¤?ç??å?¨ç¼?å?å??/æ?? +ç³»ç»?äº?è¿?å?¨ç¡¬ä»¶ä¸å¤?ç??ã?? + +å??å?访é?®æ?¶é?´å??æ??æ??ç??å??å?带宽å??å?³äº?å??å?«CPUç??å??å??æ??è¿?è¡?å??å?访é?®ç??IOæ?»çº¿è·?离å??å?«ç?®æ ?å??å?ç??å??å?? +æ??å¤?è¿?ã??ä¾?å¦?ï¼?è¿?æ?¥å?°å??ä¸?å??å??ç??CPU对å??å?ç??访é?®å°?æ¯?访é?®å?¶ä»?è¿?ç¨?å??å??ç??å??å?ç»?å??æ?´å¿«ç??访é?®æ?¶é?´å?? +æ?´é«?ç??带宽ã?? NUMAå¹³å?°å?¯ä»¥å?¨ä»»ä½?ç»?å®?å??å??ä¸?访é?®å¤?ç§?è¿?ç¨?è·?离ç??ï¼?å?¶ä»?ï¼?å??å??ã?? + +å¹³å?°ä¾?åº?å??建ç«?NUMAç³»ç»?并ä¸?å?ªæ?¯ä¸ºäº?让软件å¼?å??人å??ç??ç??æ´»å??å¾?æ??趣ã??ç?¸å??ï¼?è¿?ç§?æ?¶æ??æ?¯æ??ä¾?å?¯æ?©å±? +å??å?带宽ç??ä¸?ç§?æ??段ã??ç?¶è??ï¼?为äº?å®?ç?°å?¯æ?©å±?ç??å??å?带宽ï¼?ç³»ç»?å??åº?ç?¨è½¯ä»¶å¿?é¡»å®?æ??大é?¨å??ç??å??å?å¼?ç?¨ +[cache misses]å?°â??æ?¬å?°â??å??å?â??â??å??ä¸?å??å??ç??å??å?ï¼?å¦?æ??æ??ç??è¯?â??â??æ??è??å?°æ??è¿?ç??æ??å??å?ç??å??å??ã?? + +è¿?å°±è?ªç?¶è??ç?¶æ??äº?Linux软件对NUMAç³»ç»?ç??è§?è§?: + +Linuxå°?ç³»ç»?ç??硬件èµ?æº?å??å??为å¤?个软件æ?½è±¡ï¼?称为â??è??ç?¹â??ã??Linuxå°?è??ç?¹æ? å°?å?°ç¡¬ä»¶å¹³å?°ç??ç?©ç??å??å?? +ä¸?ï¼?对ä¸?äº?æ?¶æ??ç??ç»?è??è¿?è¡?äº?æ?½è±¡ã??ä¸?ç?©ç??å??å??ä¸?æ ·ï¼?软件è??ç?¹å?¯è?½å??å?«0æ??æ?´å¤?ç??CPUã??å??å?å??/æ??IO +æ?»çº¿ã??å??æ ·ï¼?对â??è¾?è¿?â??è??ç?¹ç??å??å?访é?®â??â??æ? å°?å?°è¾?è¿?å??å??ç??è??ç?¹â??â??é??常ä¼?æ¯?对è¾?è¿?å??å??ç??访é?®ç»?å??æ?´å¿« +ç??访é?®æ?¶é?´å??æ?´é«?ç??æ??æ??带宽ã?? + +对äº?ä¸?äº?æ?¶æ??ï¼?å¦?x86ï¼?Linuxå°?â??é??è??â??ä»»ä½?代表没æ??å??å?è¿?æ?¥ç??ç?©ç??å??å??ç??è??ç?¹ï¼?并å°?è¿?æ?¥å?°è¯¥å??å?? +ç??ä»»ä½?CPUé??æ?°å??é??å?°ä»£è¡¨æ??å??å?ç??å??å??ç??è??ç?¹ä¸?ã??å? æ¤ï¼?å?¨è¿?äº?æ?¶æ??ä¸?ï¼?æ??们ä¸?è?½å??设Linuxå°?æ??æ?? +ç??CPUä¸?ä¸?个ç»?å®?ç??è??ç?¹ç?¸å?³è??ï¼?ä¼?ç??å?°ç?¸å??ç??æ?¬å?°å??å?访é?®æ?¶é?´å??带宽ã?? + +æ¤å¤?ï¼?对äº?æ??äº?æ?¶æ??ï¼?å??æ ·ä»¥x86为ä¾?ï¼?Linuxæ?¯æ??对é¢?å¤?è??ç?¹ç??仿ç??ã??对äº?NUMA仿ç??ï¼?Linuxä¼?å°?ç?° +æ??ç??è??ç?¹æ??è??é??NUMAå¹³å?°ç??ç³»ç»?å??å?å??å?²æ??å¤?个è??ç?¹ã??æ¯?个模æ??ç??è??ç?¹å°?管ç??åº?å±?å??å??ç?©ç??å??å?ç??ä¸?é?¨ +å??ã??NUMA仿ç??对äº?å?¨é??NUMAå¹³å?°ä¸?æµ?è¯?NUMAå??æ ¸å??åº?ç?¨å??è?½æ?¯é??常æ??ç?¨ç??ï¼?å½?ä¸?cpusetsä¸?起使ç?¨æ?¶ï¼? +å?¯ä»¥ä½?为ä¸?ç§?å??å?èµ?æº?管ç??æ?ºå?¶ã??[è§? Documentation/admin-guide/cgroup-v1/cpusets.rst] + +对äº?æ¯?个æ??å??å?ç??è??ç?¹ï¼?Linuxæ??建äº?ä¸?个ç?¬ç«?ç??å??å?管ç??å?ç³»ç»?ï¼?æ??è?ªå·±ç??空é?²é¡µå??表ã??使ç?¨ä¸é¡µå??表ã?? +使ç?¨ç»?计å??é??æ?¥è°?解访é?®ã??æ¤å¤?ï¼?Linux为æ¯?个å??å?å?º[DMAã??DMA32ã??NORMALã??HIGH_MEMORYã??MOVABLE +ä¸ç??ä¸?个æ??å¤?个]æ??建äº?ä¸?个æ??åº?ç??â??å?ºå??表â??ã??zonelistæ??å®?äº?å½?ä¸?个é??å®?ç??å?º/è??ç?¹ä¸?è?½æ»¡è¶³å??é??请æ±? +æ?¶è¦?访é?®ç??å?º/è??ç?¹ã??å½?ä¸?个å?ºæ²¡æ??å?¯ç?¨ç??å??å?æ?¥æ»¡è¶³è¯·æ±?æ?¶ï¼?è¿?ç§?æ??å?µè¢«ç§°ä¸ºâ??overflow 溢å?ºâ??æ?? +â??fallback å??é??â??ã?? + +ç?±äº?ä¸?äº?è??ç?¹å??å?«å¤?个å??å?«ä¸?å??ç±»å??å??å?ç??å?ºï¼?Linuxå¿?é¡»å?³å®?æ?¯å?¦å¯¹å?ºå??表è¿?è¡?æ??åº?ï¼?使å??é??å??é??å?°ä¸?å?? +è??ç?¹ä¸?ç??ç?¸å??å?ºç±»å??ï¼?æ??å??ä¸?è??ç?¹ä¸?ç??ä¸?å??å?ºç±»å??ã??è¿?æ?¯ä¸?个é??è¦?ç??è??è??å? ç´ ï¼?å? 为æ??äº?å?ºï¼?å¦?DMAæ??DMA32ï¼? +代表äº?ç?¸å¯¹ç¨?缺ç??èµ?æº?ã??Linuxé??æ?©äº?ä¸?个é»?认ç??Node ordered zonelistã??è¿?æ??å?³ç??å?¨ä½¿ç?¨æ??NUMAè·? +离æ??åº?ç??è¿?ç¨?è??ç?¹ä¹?å??ï¼?å®?ä¼?å°?è¯?å??é??å?°å??ä¸?è??ç?¹ç??å?¶ä»?å??å?ºã?? + +é»?认æ??å?µä¸?ï¼?Linuxä¼?å°?è¯?ä»?æ?§è¡?请æ±?ç??CPU被å??é??å?°ç??è??ç?¹ä¸æ»¡è¶³å??å?å??é??请æ±?ã??å?·ä½?æ?¥è¯´ï¼?Linuxå°?è¯? +å?¾ä»?请æ±?æ?¥æº?ç??è??ç?¹ç??é??å½?å??å?ºå??表ä¸ç??第ä¸?个è??ç?¹è¿?è¡?å??é??ã??è¿?被称为â??æ?¬å?°å??é??â??ã??å¦?æ??â??æ?¬å?°â??è??ç?¹ä¸?è?½ +满足请æ±?ï¼?å??æ ¸å°?æ£?æ?¥æ??é??å??å?ºå??表ä¸å?¶ä»?è??ç?¹ç??å?ºå??ï¼?寻æ?¾å??表ä¸ç¬¬ä¸?个è?½æ»¡è¶³è¯·æ±?ç??å?ºå??ã?? + +æ?¬å?°å??é??å°?å?¾å??äº?ä¿?æ??对å??é??ç??å??å?ç??å??ç»è®¿é?® â??æ?¬å?°â??ç??åº?å±?ç?©ç??èµ?æº?å??ç³»ç»?äº?è¿?â??â??å?ªè¦?å??æ ¸ä»£è¡¨å?¶å??é?? +ä¸?äº?å??å?ç??ä»»å?¡å??æ?¥ä¸?ä»?该å??å?è¿?移ã??Linuxè°?度å?¨ç?¥é??å¹³å?°ç??NUMAæ??æ??ç»?æ??â??â??ä½?ç?°å?¨â??è°?度å??â??æ?°æ?®ç»?æ?? +ä¸[è§? Documentation/scheduler/sched-domains.rst]â??â??并ä¸?è°?度å?¨è¯?å?¾å°½é??å??å°?ä»»å?¡è¿?移å?°é?¥ +è¿?ç??è°?度å??ä¸ã??ç?¶è??ï¼?è°?度å?¨å¹¶æ²¡æ??ç?´æ?¥è??è??å?°ä»»å?¡ç??NUMA足迹ã??å? æ¤ï¼?å?¨å??å??ä¸?平衡ç??æ??å?µä¸?ï¼?ä»»å?¡å?¯ +以å?¨è??ç?¹ä¹?é?´è¿?移ï¼?è¿?离å?¶å??å§?è??ç?¹å??å??æ ¸æ?°æ?®ç»?æ??ã?? + +ç³»ç»?管ç??å??å??åº?ç?¨ç¨?åº?设计è??å?¯ä»¥ä½¿ç?¨å??ç§?CPU亲å??å?½ä»¤è¡?æ?¥å?£ï¼?å¦?taskset(1)å??numactl(1)ï¼?以å??ç¨? +åº?æ?¥å?£ï¼?å¦?sched_setaffinity(2)ï¼?æ?¥é??å?¶ä»»å?¡ç??è¿?移ï¼?以æ?¹å??NUMAå®?ä½?ã??æ¤å¤?ï¼?人们å?¯ä»¥ä½¿ç?¨ +Linux NUMAå??å?ç?ç?¥ä¿®æ?¹å??æ ¸ç??é»?认æ?¬å?°å??é??è¡?为ã?? [è§? +:ref:`Documentation/admin-guide/mm/numa_memory_policy.rst <numa_memory_policy>`]. + +ç³»ç»?管ç??å??å?¯ä»¥ä½¿ç?¨æ?§å?¶ç»?å??CPUsetsé??å?¶é??ç?¹æ??ç?¨æ?·å?¨è°?度æ??NUMAå?½ä»¤å??å??è?½ä¸å?¯ä»¥æ??å®?ç??CPUå??è??ç?¹ +ç??å??å?ã?? [è§? Documentation/admin-guide/cgroup-v1/cpusets.rst] + +å?¨ä¸?é??è??æ? å??å?è??ç?¹ç??æ?¶æ??ä¸?ï¼?Linuxä¼?å?¨å??å?ºå??表ä¸å?ªå??æ?¬æ??å??å?ç??å?ºå??[è??ç?¹]ã??è¿?æ??å?³ç??对äº?ä¸?个æ? +å??å?ç??è??ç?¹ï¼?â??æ?¬å?°å??å?è??ç?¹â??â??â??CPUè??ç?¹ç??å??å?ºå??表ä¸ç??第ä¸?个å?ºå??ç??è??ç?¹â??â??å°?ä¸?æ?¯è??ç?¹æ?¬èº«ã??ç?¸å??ï¼?å®? +å°?æ?¯å??æ ¸å?¨å»ºç«?å??å?ºå??表æ?¶é??æ?©ç??离å®?æ??è¿?ç??æ??å??å?ç??è??ç?¹ã??æ??以ï¼?é»?认æ??å?µä¸?ï¼?æ?¬å?°å??é??å°?ç?±å??æ ¸æ??ä¾? +æ??è¿?ç??å?¯ç?¨å??å?æ?¥å®?æ??ã??è¿?æ?¯å??ä¸?æ?ºå?¶ç??ç»?æ??ï¼?该æ?ºå?¶å??许è¿?ç§?å??é??å?¨ä¸?个å??å?«å??å?ç??è??ç?¹æº¢å?ºæ?¶å??é??å?° +å?¶ä»?é??è¿?ç??è??ç?¹ã?? + +ä¸?äº?å??æ ¸å??é??ä¸?å¸?æ??æ??ä¸?è?½å®¹å¿?è¿?ç§?å??é??å??é??è¡?为ã??ç?¸å??ï¼?ä»?们æ?³ç¡®ä¿?ä»?们ä»?æ??å®?ç??è??ç?¹è?·å¾?å??å?ï¼?æ??è?? +å¾?å?°é??ç?¥è¯´è¯¥è??ç?¹æ²¡æ??空é?²å??å?ã??ä¾?å¦?ï¼?å½?ä¸?个å?ç³»ç»?å??é??æ¯?个CPUç??å??å?èµ?æº?æ?¶ï¼?é??常æ?¯è¿?ç§?æ??å?µã?? + +ä¸?个å?¸å??ç??å??é??模å¼?æ?¯ä½¿ç?¨å??æ ¸ç??numa_node_id()æ??CPU_to_node()å?½æ?°è?·å¾?â??å½?å??CPUâ??æ??å?¨è??ç?¹ç?? +è??ç?¹IDï¼?ç?¶å??å?ªä»?è¿?å??ç??è??ç?¹ID请æ±?å??å?ã??å½?è¿?æ ·ç??å??é??失败æ?¶ï¼?请æ±?ç??å?ç³»ç»?å?¯ä»¥æ?¢å¤?å?°å®?è?ªå·±ç??å??é?? +è·¯å¾?ã??æ?¿å??å??æ ¸å??å?å??é??å?¨å°±æ?¯è¿?æ ·ç??ä¸?个ä¾?å?ã??æ??è??ï¼?å?ç³»ç»?å?¯ä»¥é??æ?©å?¨å??é??失败æ?¶ç¦?ç?¨æ??ä¸?å?¯ç?¨è?ªå·±ã?? +å??æ ¸å??æ??å?ç³»ç»?å°±æ?¯è¿?æ ·ç??ä¸?个ä¾?å?ã?? + +å¦?æ??æ?¶æ??æ?¯æ??â??â??ä¸?é??è??æ? å??å?è??ç?¹ï¼?é?£ä¹?è¿?æ?¥å?°æ? å??å?è??ç?¹ç??CPUå°?æ?»æ?¯äº§ç??å??é??è·¯å¾?ç??å¼?é??ï¼?æ??è??ä¸?äº? +å?ç³»ç»?å¦?æ??è¯?å?¾å®?å?¨ä»?æ? å??å?ç??è??ç?¹å??é??å??å?ï¼?å°?æ? æ³?å??å§?å??ã??为äº?é??æ??å?°æ?¯æ??è¿?ç§?æ?¶æ??ï¼?å??æ ¸å?ç³»ç»?å?¯ +以使ç?¨numa_mem_id()æ??cpu_to_mem()å?½æ?°æ?¥å®?ä½?è°?ç?¨æ??æ??å®?CPUç??â??æ?¬å?°å??å?è??ç?¹â??ã??å??æ ·ï¼?è¿?æ?¯å?? +ä¸?个è??ç?¹ï¼?é»?认ç??æ?¬å?°é¡µå??é??å°?ä»?è¿?个è??ç?¹å¼?å§?å°?è¯?ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/overcommit-accounting.rst @@ -0,0 +1,86 @@ +:Original: Documentation/mm/overcommit-accounting.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + + +============== +è¶?é??使ç?¨å®¡è®¡ +============== + +Linuxå??æ ¸æ?¯æ??ä¸?å??è¶?é??使ç?¨å¤?ç??模å¼? + +0 + å?¯å??å¼?è¶?é??使ç?¨å¤?ç??ã??æ??ç»?æ??æ?¾ç??å?°å??空é?´è¶?é??使ç?¨ã??ç?¨äº?ä¸?个å?¸å??ç??ç³»ç»?ã?? + å®?ç¡®ä¿?严é??ç??ç?¯ç??å??é??失败ï¼?å??æ?¶å??许è¶?é??使ç?¨ä»¥å??å°?swapç??使ç?¨ã??å?¨è¿?ç§?模å¼?ä¸?ï¼? + å??许rootå??é??ç¨?å¤?ç??å??å?ã??è¿?æ?¯é»?认ç??ã?? +1 + æ?»æ?¯è¶?é??使ç?¨ã??é??ç?¨äº?ä¸?äº?ç§?å¦åº?ç?¨ã??ç»?å?¸ç??ä¾?å?æ?¯ä½¿ç?¨ç¨?ç??æ?°ç»?ç??代ç ?ï¼?å?ªæ?¯ä¾?èµ? + å? ä¹?å®?å?¨ç?±é?¶é¡µç»?æ??ç??è??æ??å??å? + +2 + ä¸?è¶?é??使ç?¨ã??ç³»ç»?æ??交ç??æ?»å?°å??空é?´ä¸?å??许è¶?è¿?swap+ä¸?个å?¯é??ç½®ç??ç?©ç??RAMç??æ?°é?? + ï¼?é»?认为50%ï¼?ã??æ ¹æ?®ä½ 使ç?¨ç??æ?°é??ï¼?å?¨å¤§å¤?æ?°æ??å?µä¸?ï¼?è¿?æ??å?³ç??ä¸?个è¿?ç¨?å?¨è®¿é?®é¡µé?¢æ?¶ + ä¸?ä¼?被æ??æ»ï¼?ä½?ä¼?å?¨å??å?å??é??ä¸?æ?¶å?°ç?¸åº?ç??é??误ã?? + + 对äº?é?£äº?æ?³ä¿?è¯?ä»?们ç??å??å?å??é??å?¨æ?ªæ?¥å?¯ç?¨è??å??ä¸?é??è¦?å??å§?å??æ¯?ä¸?个页é?¢ç??åº?ç?¨ç¨?åº?æ?¥è¯´ + æ?¯å¾?æ??ç?¨ç??ã?? + +è¶?é??使ç?¨ç?ç?¥æ?¯é??è¿?sysctl `vm.overcommit_memory` 设置ç??ã?? + +å?¯ä»¥é??è¿? `vm.overcommit_ratio` ï¼?ç?¾å??æ¯?ï¼?æ?? `vm.overcommit_kbytes` ï¼?ç»?对å?¼ï¼? +æ?¥è®¾ç½®è¶?é??æ?°é??ã??è¿?äº?å?ªæ??å?¨ `vm.overcommit_memory` 被设置为2æ?¶æ??æ??æ??æ??ã?? + +å?¨ ``/proc/meminfo`` ä¸å?¯ä»¥å??å?«ä»¥CommitLimitå??Committed_ASç??å½¢å¼?æ?¥ç??å½?å?? +ç??è¶?é??使ç?¨å??æ??交é??ã?? + +é?·é?± +==== + +Cè¯è¨?ç??å ?æ ?å¢?é?¿æ?¯ä¸?个é??å?«ç??mremapã??å¦?æ??ä½ æ?³å¾?å?°ç»?对ç??ä¿?è¯?ï¼?并å?¨æ?¥è¿?è¾¹ç¼?ç??å?°æ?¹è¿?è¡?ï¼? +ä½ **å¿?é¡»** ä¸ºä½ è®¤ä¸ºä½ é??è¦?ç??æ??大尺寸ç??å ?æ ?è¿?è¡?mmapã??对äº?å?¸å??ç??å ?æ ?使ç?¨æ?¥è¯´ï¼?è¿?并 +ä¸?é??è¦?ï¼?ä½?å¦?æ??ä½ ç??ç??é??常å?³å¿?ç??è¯?ï¼?è¿?å°±æ?¯ä¸?个å?¼å¾?å?³æ³¨ç??æ¡?ä¾?ã?? + + +å?¨æ¨¡å¼?2ä¸ï¼?MAP_NORESERVEæ ?å¿?被忽ç?¥ã?? + + +å®?æ?¯å¦?ä½?å·¥ä½?ç?? +============== + +è¶?é??使ç?¨æ?¯å?ºäº?以ä¸?è§?å?? + +对äº?æ??件æ? å°? + | SHARED or READ-only - 0 cost (该æ??件æ?¯æ? å°?è??ä¸?æ?¯äº¤æ?¢) + | PRIVATE WRITABLE - æ¯?个å®?ä¾?ç??æ? å°?大å°? + +对äº?å?¿å??æ??è?? ``/dev/zero`` æ? å°? + | SHARED - æ? å°?ç??大å°? + | PRIVATE READ-only - 0 cost (ä½?ä½?ç?¨ä¸?大) + | PRIVATE WRITABLE - æ¯?个å®?ä¾?ç??æ? å°?大å°? + +é¢?å¤?ç??计æ?° + | é??è¿?mmapå?¶ä½?å?¯å??å?¯æ?¬ç??页é?¢ + | ä»?å??ä¸?æ± ä¸æ??å??ç??shmfså??å? + +ç?¶æ?? +==== + +* æ??ä»¬æ ¸ç®?mmapå??å?æ? å°? +* æ??ä»¬æ ¸ç®?mprotectå?¨æ??交ä¸ç??å??å?? +* æ??ä»¬æ ¸ç®?mremapç??大å°?å??å?? +* æ??们ç??审计 brk +* 审计munmap +* æ??们å?¨/procä¸æ?¥å??commit ç?¶æ?? +* æ ¸å¯¹å¹¶æ£?æ?¥å??å??ç??æ??å?µ +* 审æ?¥å ?æ ?å¤?ç??/æ?§è¡?ä¸ç??æ??建 +* å??è¿°SHMfsç??æ??å?µ +* å®?ç?°å®?é??é??å?¶ç??æ?§è¡? + +å¾?ç» +==== +* ptrace 页计æ?°ï¼?è¿?å¾?é?¾ï¼?ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/page_frags.rst @@ -0,0 +1,38 @@ +:Original: Documentation/mm/page_frag.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +======== +页é?¢ç??段 +======== + +ä¸?个页é?¢ç??段æ?¯ä¸?个任æ??é?¿åº¦ç??ä»»æ??å??移ç??å??å?å?ºå??ï¼?å®?ä½?äº?ä¸?个0æ??æ?´é«?é?¶ç??å¤?å??页é?¢ä¸ã?? +该页ä¸ç??å¤?个ç¢?ç??å?¨è¯¥é¡µç??å¼?ç?¨è®¡æ?°å?¨ä¸è¢«å??ç?¬è®¡ç®?ã?? + +page_fragå?½æ?°ï¼?page_frag_allocå??page_frag_freeï¼?为页é?¢ç??段æ??ä¾?äº?ä¸?个ç®?å?? +ç??å??é??æ¡?æ?¶ã??è¿?被ç½?ç»?å ?æ ?å??ç½?ç»?设å¤?驱å?¨ä½¿ç?¨ï¼?以æ??ä¾?ä¸?个å??å?ç??æ?¯æ??å?ºå??ï¼?ä½?为 +sk_buff->head使ç?¨ï¼?æ??è??ç?¨äº?skb_shared_infoç?? â??fragsâ?? é?¨å??ã?? + +为äº?使ç?¨é¡µé?¢ç??段APIï¼?é??è¦?ä¸?个æ?¯æ??页é?¢ç??段ç??ç¼?å?²å?ºã??è¿?为ç¢?ç??å??é??æ??ä¾?äº?ä¸?个ä¸å¿?ç?¹ï¼? +并å??许å¤?个è°?ç?¨ä½¿ç?¨ä¸?个ç¼?å?ç??页é?¢ã??è¿?æ ·å??ç??好å¤?æ?¯å?¯ä»¥é?¿å??对get_pageç??å¤?次è°?ç?¨ï¼? +è¿?å?¨å??é??æ?¶å¼?é??å?¯è?½ä¼?å¾?大ã??ç?¶è??ï¼?ç?±äº?è¿?ç§?ç¼?å?ç??æ?§è´¨ï¼?è¦?æ±?ä»»ä½?对ç¼?å?ç??è°?ç?¨é?½è¦?å??å?°æ¯? +个CPUç??é??å?¶ï¼?æ??è??æ¯?个CPUç??é??å?¶ï¼?并å?¨æ?§è¡?ç¢?ç??å??é??æ?¶å¼ºå?¶ç¦?æ¢ä¸æ?ã?? + +ç½?ç»?å ?æ ?å?¨æ¯?个CPU使ç?¨ä¸¤ä¸ªç?¬ç«?ç??ç¼?å?æ?¥å¤?ç??ç¢?ç??å??é??ã??netdev_alloc_cache被使ç?¨ +netdev_alloc_fragå??__netdev_alloc_skbè°?ç?¨ç??è°?ç?¨è??使ç?¨ã??napi_alloc_cache +被è°?ç?¨__napi_alloc_fragå??__napi_alloc_skbç??è°?ç?¨è??使ç?¨ã??è¿?两个è°?ç?¨ç??主è¦?å?ºå?«æ?¯ +å®?们å?¯è?½è¢«è°?ç?¨ç??ç?¯å¢?ã??â??netdevâ?? å??ç¼?ç??å?½æ?°å?¯ä»¥å?¨ä»»ä½?ä¸?ä¸?æ??ä¸ä½¿ç?¨ï¼?å? 为è¿?äº?å?½æ?° +å°?ç¦?ç?¨ä¸æ?ï¼?è?? â??napiâ?? å??ç¼?ç??å?½æ?°å?ªå?¯ä»¥å?¨softirqä¸?ä¸?æ??ä¸ä½¿ç?¨ã?? + +许å¤?ç½?ç»?设å¤?驱å?¨ç¨?åº?使ç?¨ç±»ä¼¼ç??æ?¹æ³?æ?¥å??é??页é?¢ç??段ï¼?ä½?页é?¢ç??段æ?¯å?¨ç?¯æ??æ??述符级å?«ä¸? +ç¼?å?ç??ã??为äº?å®?ç?°è¿?äº?æ??å?µï¼?æ??å¿?è¦?æ??ä¾?ä¸?ç§?æ??解页é?¢ç¼?å?ç??é??ç?¨æ?¹æ³?ã??å?ºäº?è¿?个å??å? ï¼? +__page_frag_cache_drain被å®?ç?°äº?ã??å®?å??许é??è¿?ä¸?次è°?ç?¨ä»?ä¸?个页é?¢é??æ?¾å¤?个å¼?ç?¨ã?? +è¿?æ ·å??ç??好å¤?æ?¯ï¼?å®?å??许æ¸?ç??被添å? å?°ä¸?个页é?¢ç??å¤?个å¼?ç?¨ï¼?以é?¿å??æ¯?次å??é??é?½è°?ç?¨ +get_pageã?? + +Alexander Duyckï¼?2016å¹´11æ??29æ?¥ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/page_owner.rst @@ -0,0 +1,116 @@ +:Original: Documentation/mm/page_owner.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +================================ +page owner: è·?踪è°?å??é??ç??æ¯?个页é?¢ +================================ + +æ¦?è¿° +==== + +page owneræ?¯ç?¨æ?¥è¿½è¸ªè°?å??é??ç??æ¯?ä¸?个页é?¢ã??å®?å?¯ä»¥ç?¨æ?¥è°?è¯?å??å?æ³?æ¼?æ??æ?¾å?°å??å?å? ç?¨è??ã?? +å½?å??é??å??ç??æ?¶ï¼?æ??å?³å??é??ç??ä¿¡æ?¯ï¼?å¦?è°?ç?¨å ?æ ?å??页é?¢ç??顺åº?被å?å?¨å?°æ¯?个页é?¢ç??ç?¹å®?å?å?¨ä¸ã?? +å½?æ??们é??è¦?äº?解æ??æ??页é?¢ç??ç?¶æ??æ?¶ï¼?æ??们å?¯ä»¥è?·å¾?并å??æ??è¿?äº?ä¿¡æ?¯ã?? + +尽管æ??们已ç»?æ??äº?追踪页é?¢å??é??/é??æ?¾ç??tracepointï¼?ä½?ç?¨å®?æ?¥å??æ??è°?å??é??ç??æ¯?个页é?¢æ?¯ +ç?¸å½?å¤?æ??ç??ã??æ??们é??è¦?æ?©å¤§è·?踪ç¼?å?²å?ºï¼?以é?²æ¢å?¨ç?¨æ?·ç©ºé?´ç¨?åº?å?¯å?¨å??å?ºç?°é??å? ã??è??ä¸?ï¼?å?¯ +å?¨ç??ç¨?åº?ä¼?ä¸?æ?å?°å°?è·?踪ç¼?å?²å?ºè½¬å?ºï¼?ä¾?以å??å??æ??ï¼?è¿?å°?ä¼?æ?¹å??ç³»ç»?ç??è¡?为ï¼?ä¼?产ç??æ?´å¤?ç?? +å?¯è?½æ?§ï¼?è??ä¸?æ?¯ä»?ä»?ä¿?ç??å?¨å??å?ä¸ï¼?æ??以ä¸?å?©äº?è°?è¯?ã?? + +页é?¢æ??æ??è??ä¹?å?¯ä»¥ç?¨äº?å??ç§?ç?®ç??ã??ä¾?å¦?ï¼?å?¯ä»¥é??è¿?æ¯?个页é?¢ç??gfpæ ?å¿?ä¿¡æ?¯è?·å¾?精确ç??ç¢?ç?? +ç»?计ã??å¦?æ??å?¯ç?¨äº?page ownerï¼?å®?就已ç»?å®?ç?°å¹¶æ¿?æ´»äº?ã??æ??们é??常欢è¿?å?¶ä»?ç?¨é??ã?? + +page ownerå?¨é»?认æ??å?µä¸?æ?¯ç¦?ç?¨ç??ã??æ??以ï¼?å¦?æ??ä½ æ?³ä½¿ç?¨å®?ï¼?ä½ é??è¦?å?¨ä½ ç??å?¯å?¨cmdline +ä¸å? å?¥"page_owner=on"ã??å¦?æ??å??æ ¸æ?¯ç?¨page owneræ??建ç??ï¼?并ä¸?ç?±äº?没æ??å?¯ç?¨å?¯å?¨ +é??项è??å?¨è¿?è¡?æ?¶ç¦?ç?¨page ownerï¼?é?£ä¹?è¿?è¡?æ?¶ç??å¼?é??æ?¯å¾?å°?ç??ã??å¦?æ??å?¨è¿?è¡?æ?¶ç¦?ç?¨ï¼?å®?ä¸? +é??è¦?å??å?æ?¥å?å?¨æ??æ??è??ä¿¡æ?¯ï¼?æ??以没æ??è¿?è¡?æ?¶å??å?å¼?é??ã??è??ä¸?ï¼?页é?¢æ??æ??è??å?¨é¡µé?¢å??é??å?¨ç?? +ç?è·¯å¾?ä¸å?ªæ??å?¥äº?两个ä¸?å?¯è?½ç??å??æ?¯ï¼?å¦?æ??ä¸?å?¯ç?¨ï¼?é?£ä¹?å??é??å°±ä¼?å??没æ??页é?¢æ??æ??è??ç??å??æ ¸ +ä¸?æ ·è¿?è¡?ã??è¿?两个ä¸?å?¯è?½ç??å??æ?¯åº?该ä¸?ä¼?å½±å??å?°å??é??ç??æ?§è?½ï¼?ç?¹å?«æ?¯å?¨é??æ??é?®è·³è½¬æ ?ç¾ä¿®è¡¥ +å??è?½å?¯ç?¨ç??æ??å?µä¸?ã??以ä¸?æ?¯ç?±äº?è¿?个å??è?½è??导è?´ç??å??æ ¸ä»£ç ?大å°?ç??å??å??ã?? + +- 没æ??page owner:: + + text data bss dec hex filename + 48392 2333 644 51369 c8a9 mm/page_alloc.o + +- æ??page owner:: + + text data bss dec hex filename + 48800 2445 644 51889 cab1 mm/page_alloc.o + 6662 108 29 6799 1a8f mm/page_owner.o + 1025 8 8 1041 411 mm/page_ext.o + +è?½ç?¶æ?»å?±å¢?å? äº?8KBç??代ç ?ï¼?ä½?page_alloc.oå¢?å? äº?520å?è??ï¼?å?¶ä¸ä¸?å?°ä¸?å??æ?¯å?¨hotpath +ä¸ã??æ??建带æ??page ownerç??å??æ ¸ï¼?并å?¨é??è¦?æ?¶æ??å¼?å®?ï¼?å°?æ?¯è°?è¯?å??æ ¸å??å?é?®é¢?ç??æ??ä½³é??æ?©ã?? + +æ??ä¸?个é?®é¢?æ?¯ç?±å®?ç?°ç»?è??å¼?èµ·ç??ã??页æ??æ??è??å°?ä¿¡æ?¯å?å?¨å?°struct pageæ?©å±?ç??å??å?ä¸ã??è¿? +个å??å?ç??å??å§?å??æ?¶é?´æ¯?ç¨?ç??å??å?ç³»ç»?ä¸ç??页é?¢å??é??å?¨å?¯å?¨ç??æ?¶é?´è¦?æ??ä¸?äº?ï¼?æ??以ï¼?å?¨å??å§?å?? +ä¹?å??ï¼?许å¤?页é?¢å?¯ä»¥è¢«å??é??ï¼?ä½?å®?们没æ??æ??æ??è??ä¿¡æ?¯ã??为äº?解å?³è¿?个é?®é¢?ï¼?è¿?äº?æ?©æ??å??é??ç?? +页é?¢å?¨å??å§?å??é?¶æ®µè¢«è°?æ?¥å¹¶æ ?记为å??é??ã??è?½ç?¶è¿?并ä¸?æ??å?³ç??å®?们æ??æ£ç¡®ç??æ??æ??è??ä¿¡æ?¯ï¼?ä½?è?³ +å°?ï¼?æ??们å?¯ä»¥æ?´å??ç¡®å?°å?¤æ?该页æ?¯å?¦è¢«å??é??ã??å?¨2GBå??å?ç??x86-64è??æ??æ?ºä¸?ï¼?æ??13343 +个æ?©æ??å??é??ç??页é?¢è¢«æ??æ??å??æ ?è®°ï¼?尽管å®?们大é?¨å??æ?¯ç?±ç»?æ??页æ?©å±?å??è?½å??é??ç??ã??æ?»ä¹?ï¼?å?¨è¿? +ä¹?å??ï¼?没æ??ä»»ä½?页é?¢å¤?äº?æ?ªè¿½è¸ªç?¶æ??ã?? + +使ç?¨æ?¹æ³? +======== + +1) æ??建ç?¨æ?·ç©ºé?´ç??帮å?©:: + + cd tools/vm + make page_owner_sort + +2) å?¯ç?¨page owner: æ·»å? "page_owner=on" å?° boot cmdline. + +3) å??ä½ æ?³è°?è¯?ç??å·¥ä½?ã?? + +4) å??æ??æ?¥è?ªé¡µé?¢æ??æ??è??ç??ä¿¡æ?¯:: + + cat /sys/kernel/debug/page_owner > page_owner_full.txt + ./page_owner_sort page_owner_full.txt sorted_page_owner.txt + + ``page_owner_full.txt`` ç??ä¸?è?¬è¾?å?ºæ??å?µå¦?ä¸?(è¾?å?ºä¿¡æ?¯æ? ç¿»è¯?ä»·å?¼):: + + Page allocated via order XXX, ... + PFN XXX ... + // Detailed stack + + Page allocated via order XXX, ... + PFN XXX ... + // Detailed stack + + ``page_owner_sort`` å·¥å?·å¿½ç?¥äº? ``PFN`` è¡?ï¼?å°?å?©ä½?ç??è¡?æ?¾å?¨bufä¸ï¼?使ç?¨regexpæ?? + å??页åº?å?¼ï¼?计ç®?bufç??次æ?°å??页æ?°ï¼?æ??å??æ ¹æ?®å??æ?°è¿?è¡?æ??åº?ã?? + + å?¨ ``sorted_page_owner.txt`` ä¸å?¯ä»¥ç??å?°å?³äº?è°?å??é??äº?æ¯?个页é?¢ç??ç»?æ??ã??ä¸?è?¬è¾?å?º:: + + XXX times, XXX pages: + Page allocated via order XXX, ... + // Detailed stack + + é»?认æ??å?µä¸?ï¼? ``page_owner_sort`` æ?¯æ ¹æ?®bufç??æ?¶é?´æ?¥æ??åº?ç??ã??å¦?æ??ä½ æ?³ + æ??bufç??页æ?°æ??åº?ï¼?请使ç?¨-må??æ?°ã??详ç»?ç??å??æ?°æ?¯: + + å?ºæ?¬å?½æ?°: + + Sort: + -a æ??å??å?å??é??æ?¶é?´æ??åº? + -m æ??æ?»å??å?æ??åº? + -p æ??pidæ??åº?ã?? + -P æ??tgidæ??åº?ã?? + -r æ??å??å?é??æ?¾æ?¶é?´æ??åº?ã?? + -s æ??å ?æ ?è·?踪æ??åº?ã?? + -t æ??æ?¶é?´æ??åº?ï¼?é»?认ï¼?ã?? + + å?¶å®?å?½æ?°: + + Cull: + -c é??è¿?æ¯?è¾?å ?æ ?è·?踪è??ä¸?æ?¯æ?»å??æ?¥è¿?è¡?å??é?¤ã?? + + Filter: + -f è¿?滤æ??å??å?已被é??æ?¾ç??å??ç??ä¿¡æ?¯ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/page_table_check.rst @@ -0,0 +1,56 @@ +.. SPDX-License-Identifier: GPL-2.0 + +:Original: Documentation/mm/page_table_check.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +======== +页表æ£?æ?¥ +======== + +æ¦?è¿° +==== + +页表æ£?æ?¥å??许é??è¿?ç¡®ä¿?é?²æ¢æ??äº?ç±»å??ç??å??å?æ??å??æ?¥å¼ºå??å??æ ¸ã?? + +å½?æ?°ç??页é?¢å?¯ä»¥ä»?ç?¨æ?·ç©ºé?´è®¿é?®æ?¶ï¼?页表æ£?æ?¥é??è¿?å°?å®?们ç??页表项ï¼?PTEs PMDç?ï¼?æ·»å? å?°é¡µè¡¨ä¸æ?¥æ?§è¡?é¢?å¤? +ç??éª?è¯?ã?? + +å?¨æ£?æµ?å?°æ??å??ç??æ??å?µä¸?ï¼?å??æ ¸ä¼?被崩æº?ã??页表æ£?æ?¥æ??ä¸?个å°?ç??æ?§è?½å??å??å?å¼?é??ã??å? æ¤ï¼?å®?å?¨é»?认æ??å?µä¸?æ?¯ç¦?ç?¨ +ç??ï¼?ä½?æ?¯å?¨é¢?å¤?ç??å? å?ºè¶?è¿?æ?§è?½æ??æ?¬ç??ç³»ç»?ä¸?ï¼?å?¯ä»¥é??æ?©å?¯ç?¨ã??å?¦å¤?ï¼?ç?±äº?页表æ£?æ?¥æ?¯å??æ¥ç??ï¼?å®?å?¯ä»¥å¸®å?©è°? +è¯?å??æ? å°?å??å?æ??å??é?®é¢?ï¼?å?¨é??误ç??æ? å°?å??ç??æ?¶å´©æº?å??æ ¸ï¼?è??ä¸?æ?¯å?¨å??å?æ??å??é??误å??ç??å??å??æ ¸å´©æº?ã?? + +å??é??æ? å°?æ£?æµ?é?»è¾? +================ + ++-------------------+-------------------+-------------------+------------------+ +| Current Mapping | New mapping | Permissions | Rule | ++===================+===================+===================+==================+ +| Anonymous | Anonymous | Read | Allow | ++-------------------+-------------------+-------------------+------------------+ +| Anonymous | Anonymous | Read / Write | Prohibit | ++-------------------+-------------------+-------------------+------------------+ +| Anonymous | Named | Any | Prohibit | ++-------------------+-------------------+-------------------+------------------+ +| Named | Anonymous | Any | Prohibit | ++-------------------+-------------------+-------------------+------------------+ +| Named | Named | Any | Allow | ++-------------------+-------------------+-------------------+------------------+ + +å?¯ç?¨é¡µè¡¨æ£?æ?¥ +============ + +ç?¨ä»¥ä¸?æ?¹æ³?æ??建å??æ ¸: + +- PAGE_TABLE_CHECK=y + 注æ??ï¼?å®?å?ªè?½å?¨ARCH_SUPPORTS_PAGE_TABLE_CHECKå?¯ç?¨ç??å¹³å?°ä¸?å?¯ç?¨ã?? + +- 使ç?¨ "page_table_check=on" å??æ ¸å??æ?°å?¯å?¨ã?? + +å?¯ä»¥é??æ?©ç?¨PAGE_TABLE_CHECK_ENFORCEDæ?¥æ??建å??æ ¸ï¼?以便å?¨æ²¡æ??é¢?å¤?ç??å??æ ¸å??æ?°ç??æ??å?µä¸?è?·å¾?页表 +æ?¯æ??ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/remap_file_pages.rst @@ -0,0 +1,32 @@ +:Original: Documentation/mm/remap_file_pages.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +============================== +remap_file_pages()ç³»ç»?è°?ç?¨ +============================== + +remap_file_pages()ç³»ç»?è°?ç?¨è¢«ç?¨æ?¥å??建ä¸?个é??线æ?§æ? å°?ï¼?ä¹?å°±æ?¯è¯´ï¼?å?¨è¿?个æ? å°?ä¸ï¼? +æ??件ç??页é?¢è¢«æ? åº?æ? å°?å?°å??å?ä¸ã??使ç?¨remap_file_pages()æ¯?é??å¤?è°?ç?¨mmap(2)ç??好 +å¤?æ?¯ï¼?å??è??ä¸?é??è¦?å??æ ¸å??建é¢?å¤?ç??VMAï¼?è??æ??å??å?å?ºï¼?æ?°æ?®ç»?æ??ã?? + +æ?¯æ??é??线æ?§æ? å°?é??è¦?å?¨å??æ ¸è??æ??å??å?å?ç³»ç»?ä¸ç¼?å??大é??ç??non-trivialç??代ç ?ï¼?å??æ?¬ç? +è·¯å¾?ã??å?¦å¤?ï¼?为äº?使é??线æ?§æ? å°?å·¥ä½?ï¼?å??æ ¸é??è¦?ä¸?ç§?æ?¹æ³?æ?¥å?ºå??æ£å¸¸ç??页表项å??带æ??æ??件 +å??移ç??项ï¼?pte_fileï¼?ã??å??æ ¸ä¸ºè¾¾å?°è¿?个ç?®ç??å?¨PTEä¸ä¿?ç??äº?æ ?å¿?ã??PTEæ ?å¿?æ?¯ç¨?缺èµ? +æº?ï¼?ç?¹å?«æ?¯å?¨æ??äº?CPUæ?¶æ??ä¸?ã??å¦?æ??è?½è?¾å?ºè¿?个æ ?å¿?ç?¨äº?å?¶ä»?ç?¨é??å°±æ?´å¥½äº?ã?? + +幸è¿?ç??æ?¯ï¼?å?¨ç??æ´»ä¸å¹¶æ²¡æ??å¾?å¤?remap_file_pages()ç??ç?¨æ?·ã??å?ªç?¥é??æ??ä¸?个ä¼?ä¸?ç??RDBMS +å®?ç?°å?¨32ä½?ç³»ç»?ä¸?使ç?¨è¿?个系ç»?è°?ç?¨æ?¥æ? å°?æ¯?32ä½?è??æ??å?°å??空é?´çº¿æ?§å°ºå¯¸æ?´å¤§ç??æ??件ã?? +ç?±äº?64ä½?ç³»ç»?ç??广æ³?使ç?¨ï¼?è¿?ç§?使ç?¨æ??å?µå·²ç»?ä¸?é??è¦?äº?ã?? + +syscall被åº?å¼?äº?ï¼?ç?°å?¨ç?¨ä¸?个模æ??æ?¥ä»£æ?¿å®?ã??仿ç??ä¼?å??建æ?°ç??VMAï¼?è??ä¸?æ?¯é??线æ?§æ? å°?ã?? +对äº?remap_file_pages()ç??å°?æ?°ç?¨æ?·æ?¥è¯´ï¼?å®?ç??å·¥ä½?é??度ä¼?å??æ?¢ï¼?ä½?ABI被ä¿?ç??äº?ã?? + +仿ç??ç??ä¸?个å?¯ä½?ç?¨ï¼?é?¤äº?æ?§è?½ä¹?å¤?ï¼?æ?¯ï¼?ç?±äº?é¢?å¤?ç??VMAï¼?ç?¨æ?·å?¯ä»¥æ?´å®¹æ??è¾¾å?° +vm.max_map_countç??é??å?¶ã??å?³äº?é??å?¶ç??æ?´å¤?ç»?è??ï¼?请å??è§?DEFAULT_MAX_MAP_COUNT +ç??注é??ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/split_page_table_lock.rst @@ -0,0 +1,96 @@ +:Original: Documentation/mm/split_page_table_lock.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +================================= +å??页表é??ï¼?split page table lockï¼? +================================= + +æ??å??ï¼?mm->page_table_lock spinlockä¿?æ?¤äº?mm_structç??æ??æ??页表ã??ä½?æ?¯è¿?ç§?æ?¹ +æ³?导è?´äº?å¤?线ç¨?åº?ç?¨ç¨?åº?ç??缺页å¼?常å?¯æ?©å±?æ?§å·®ï¼?å? 为对é??ç??äº?夺å¾?æ¿?ç??ã??为äº?æ??é«?å?¯æ?© +å±?æ?§ï¼?æ??们å¼?å?¥äº?å??页表é??ã?? + +æ??äº?å??页表é??ï¼?æ??们就æ??äº?å??ç?¬ç??æ¯?å¼ è¡¨é??æ?¥é¡ºåº?å??对表ç??访é?®ã??ç?®å??ï¼?æ??们对PTEå?? +PMD表使ç?¨å??页é??ã??对é«?å±?表ç??访é?®ç?±mm->page_table_lockä¿?æ?¤ã?? + +æ??ä¸?äº?è¾?å?©å·¥å?·æ?¥é??å®?/解é??ä¸?个表å??å?¶ä»?访é?®å?¨å?½æ?°: + + - pte_offset_map_lock() + æ? å°?pte并è?·å??PTE表é??ï¼?è¿?å??æ??å??é??ç??æ??é??ï¼? + - pte_unmap_unlock() + 解é??å??解æ? å°?PTE表ï¼? + - pte_alloc_map_lock() + å¦?æ??é??è¦?ç??è¯?ï¼?å??é??PTE表并è?·å??é??ï¼?å¦?æ??å??é??失败ï¼?è¿?å??å·²è?·å??ç??é??ç??æ??é?? + æ??NULLï¼? + - pte_lockptr() + è¿?å??æ??å??PTE表é??ç??æ??é??ï¼? + - pmd_lock() + å??å¾?PMD表é??ï¼?è¿?å??æ??å??é??ç??æ??é??ã?? + - pmd_lockptr() + è¿?å??æ??å??PMD表é??ç??æ??é??ï¼? + +å¦?æ??CONFIG_SPLIT_PTLOCK_CPUSï¼?é??常为4ï¼?å°?äº?æ??ç?äº?NR_CPUSï¼?å??å?¨ç¼?è¯? +æ?¶å?¯ç?¨PTE表ç??å??页表é??ã??å¦?æ??å??页é??被ç¦?ç?¨ï¼?æ??æ??ç??表é?½ç?±mm->page_table_lock +æ?¥ä¿?æ?¤ã?? + +å¦?æ??PMD表å?¯ç?¨äº?å??页é??ï¼?并ä¸?æ?¶æ??æ?¯æ??å®?ï¼?é?£ä¹?PMD表ç??å??页é??å°±ä¼?被å?¯ç?¨ï¼?è§? +ä¸?æ??ï¼?ã?? + +Hugetlb å??å??页表é?? +================== + +Hugetlbå?¯ä»¥æ?¯æ??å¤?ç§?页é?¢å¤§å°?ã??æ??们å?ªå¯¹PMD级å?«ä½¿ç?¨å??页é??ï¼?ä½?ä¸?对PUD使ç?¨ã?? + +Hugetlbç?¹å®?ç??è¾?å?©å?½æ?°: + + - huge_pte_lock() + 对PMD_SIZE页é?¢é??å??pmdå??å?²é??ï¼?å?¦å??mm->page_table_lockï¼? + - huge_pte_lockptr() + è¿?å??æ??å??表é??ç??æ??é??ã?? + +æ?¶æ??对å??页表é??ç??æ?¯æ?? +==================== + +没æ??å¿?è¦?ç?¹å?«å?¯ç?¨PTEå??页表é??ï¼?æ??æ??é??è¦?ç??ä¸?西é?½ç?±pgtable_pte_page_ctor() +å??pgtable_pte_page_dtor()å®?æ??ï¼?å®?们å¿?é¡»å?¨PTE表å??é??/é??æ?¾æ?¶è¢«è°?ç?¨ã?? + +ç¡®ä¿?æ?¶æ??ä¸?使ç?¨slabå??é??å?¨æ?¥å??é??页表ï¼?slab使ç?¨page->slab_cacheæ?¥å??é??å?¶é¡µ +é?¢ã??è¿?个å?ºå??ä¸?page->ptlå?±äº«å?å?¨ã?? + +PMDå??页é??å?ªæ??å?¨ä½ æ??两个以ä¸?ç??页表级å?«æ?¶æ??æ??æ??ä¹?ã?? + +å?¯ç?¨PMDå??页é??é??è¦?å?¨PMD表å??é??æ?¶è°?ç?¨pgtable_pmd_page_ctor()ï¼?å?¨é??æ?¾æ?¶è°? +ç?¨pgtable_pmd_page_dtor()ã?? + +å??é??é??常å??ç??å?¨pmd_alloc_one()ä¸ï¼?é??æ?¾å??ç??å?¨pmd_free()å??pmd_free_tlb() +ä¸ï¼?ä½?è¦?ç¡®ä¿?è¦?ç??æ??æ??ç??PMD表å??é??/é??æ?¾è·¯å¾?ï¼?å?³X86_PAEå?¨pgd_alloc()ä¸é¢?å?? +å??é??ä¸?äº?PMDã?? + +ä¸?å??就绪å??ï¼?ä½ å?¯ä»¥è®¾ç½®CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCKã?? + +注æ??ï¼?pgtable_pte_page_ctor()å??pgtable_pmd_page_ctor()å?¯è?½å¤±è´¥--å¿? +é¡»æ£ç¡®å¤?ç??ã?? + +page->ptl +========= + +page->ptlç?¨äº?访é?®å??å?²é¡µè¡¨é??ï¼?å?¶ä¸'page'æ?¯å??å?«è¯¥è¡¨ç??页é?¢struct pageã??å®? +ä¸?page->privateï¼?以å??unionä¸ç??å?¶ä»?å? 个å?段ï¼?å?±äº«å?å?¨ã?? + +为äº?é?¿å??å¢?å? struct pageç??大å°?并è?·å¾?æ??ä½³æ?§è?½ï¼?æ??们使ç?¨äº?ä¸?个æ??å·§: + + - å¦?æ??spinlock_té??å??äº?longï¼?æ??们使ç?¨page->pträ½?为spinlockï¼?è¿?æ ·æ??们 + å°±å?¯ä»¥é?¿å??é?´æ?¥è®¿é?®å¹¶è??ç??ä¸?个ç¼?å?è¡?ã?? + - å¦?æ??spinlock_tç??大å°?大äº?longç??大å°?ï¼?æ??们使ç?¨page->ptlä½?为spinlock_t + ç??æ??é??并å?¨æ??å??é??å®?ã??è¿?å??许å?¨å?¯ç?¨DEBUG_SPINLOCKæ??DEBUG_LOCK_ALLOCç?? + æ??å?µä¸?使ç?¨å??页é??ï¼?ä½?ç?±äº?é?´æ?¥è®¿é?®è??å¤?è?±äº?ä¸?个ç¼?å?è¡?ã?? + +PTE表ç??spinlock_tå??é??å?¨pgtable_pte_page_ctor()ä¸ï¼?PMD表ç??spinlock_t +å??é??å?¨pgtable_pmd_page_ctor()ä¸ã?? + +请ä¸?è¦?ç?´æ?¥è®¿é?®page->ptl - -使ç?¨é??å½?ç??è¾?å?©å?½æ?°ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/z3fold.rst @@ -0,0 +1,31 @@ +:Original: Documentation/mm/z3fold.rst + +:ç¿»è¯?: + + å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> + +:æ ¡è¯?: + + +====== +z3fold +====== + +z3foldæ?¯ä¸?个ä¸?é?¨ç?¨äº?å?å?¨å??缩页ç??å??é??å?¨ã??å®?被设计为æ¯?个ç?©ç??页æ??å¤?å?¯ä»¥å?å?¨ä¸?个å??缩页ã?? +å®?æ?¯zbudç??è¡?ç??ç?©ï¼?å??许æ?´é«?ç??å??缩ç??ï¼?ä¿?æ??å?¶å??è¾?ç??ç®?å??æ?§å??ç¡®å®?æ?§ã?? + +z3foldå??zbudç??主è¦?å?ºå?«æ?¯: + +* ä¸?zbudä¸?å??ç??æ?¯ï¼?z3foldå??许æ??大ç??PAGE_SIZEå??é??ã?? +* z3foldå?¨å?¶é¡µé?¢ä¸æ??å¤?å?¯ä»¥å®¹çº³3个å??缩页é?¢ +* z3foldæ?¬èº«æ²¡æ??è¾?å?ºä»»ä½?APIï¼?å? æ¤æ??ç®?é??è¿?zpoolç??APIæ?¥ä½¿ç?¨ + +为äº?ä¿?æ??ç¡®å®?æ?§å??ç®?å??æ?§ï¼?z3foldï¼?å°±å??zbudä¸?æ ·ï¼?æ?»æ?¯å?¨æ¯?页å?å?¨ä¸?个æ?´æ?°ç??å??缩页ï¼?ä½?æ?¯ +å®?æ??å¤?å?¯ä»¥å?å?¨3页ï¼?ä¸?å??zbudæ??å¤?å?¯ä»¥å?å?¨2页ã??å? æ¤å??缩ç??è¾¾å?°2.7å??å·¦å?³ï¼?è??zbudç??å??缩 +ç??æ?¯1.7å??å·¦å?³ã?? + +ä¸?å??zbudï¼?ä½?ä¹?å??zsmallocï¼?ï¼?z3fold_alloc()é?£æ ·ä¸?è¿?å??ä¸?个å?¯é??å¤?å¼?ç?¨ç??æ??é??ã??ç?¸å??ï¼?å®? +è¿?å??ä¸?个æ? 符å?·é?¿å?¥æ??ï¼?å®?ç¼?ç ?äº?被å??é??对象ç??å®?é??ä½?ç½®ã?? + +ä¿?æ??æ??æ??ç??å??缩ç??æ?¥è¿?äº?zsmallocï¼?z3foldä¸?ä¾?èµ?äº?MMUç??å?¯ç?¨ï¼?并æ??ä¾?æ?´å?¯é¢?æµ?ç??å??æ?¶è¡? +为ï¼?è¿?使å¾?å®?æ?´é??å??äº?å°?å??å??å??åº?è¿?é??ç??ç³»ç»?ã?? --- /dev/null +++ a/Documentation/translations/zh_CN/mm/zsmalloc.rst @@ -0,0 +1,78 @@ +:Original: Documentation/mm/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 --- a/Documentation/translations/zh_CN/vm/active_mm.rst +++ /dev/null @@ -1,85 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/active_mm.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -========= -Active MM -========= - -è¿?æ?¯ä¸?å°?linuxä¹?ç?¶å??å¤?å¼?å??è??ç??ä¸?å°?é?®ä»¶ï¼?æ??以翻è¯?æ?¶æ??å°½é??ä¿?æ??é?®ä»¶æ ¼å¼?ç??å®?æ?´ã?? - -:: - - List: linux-kernel - Subject: Re: active_mm - From: Linus Torvalds <torvalds () transmeta ! com> - Date: 1999-07-30 21:36:24 - - å? 为æ??并ä¸?ç»?常å??解é??ï¼?æ??以已ç»?æ??é??å?°linux-kernelé?®ä»¶å??表ï¼?è??å½?æ??å??è¿?äº?ï¼? - ä¸?æ?´å¤?ç??人å?¨é??读å®?们æ?¶ï¼?æ??è§?å¾?æ£?æ??äº?ã?? - - 1999å¹´7æ??30æ?¥ æ??æ??äº?ï¼? David Mosberger å??é??ï¼? - > - > æ?¯å?¦æ??ä¸?个ç®?ç?ç??æ??è¿°ï¼?说æ??task_structä¸ç?? - > "mm" å?? "active_mm"åº?该å¦?ä½?使ç?¨ï¼? (å¦?æ?? - > è¿?个é?®é¢?å?¨é?®ä»¶å??表ä¸è®¨è®ºè¿?ï¼?æ??表示æ?æ??--æ??å?? - > å??度å??å??æ?¥ï¼?æ??ä¸?段æ?¶é?´æ²¡è?½å?³æ³¨linux-kerneläº?ï¼?ã?? - - å?ºæ?¬ä¸?ï¼?æ?°ç??设å®?æ?¯ï¼? - - - æ??们æ??â??ç??å®?å?°å??空é?´â??å??â??å?¿å??å?°å??空é?´â??ã??å?ºå?«å?¨äº?ï¼?å?¿å??å?°å??空é?´æ ¹æ?¬ä¸?å?³å¿?ç?¨ - æ?·çº§é¡µè¡¨ï¼?æ??以å½?æ??们å??ä¸?ä¸?æ??å??æ?¢å?°å?¿å??å?°å??空é?´æ?¶ï¼?æ??们å?ªæ?¯è®©ä»¥å??ç??å?°å??空é?´ - å¤?äº?æ´»å?¨ç?¶æ??ã?? - - ä¸?个â??å?¿å??å?°å??空é?´â??ç??æ??æ?¾ç?¨é??æ?¯ä»»ä½?ä¸?é??è¦?ä»»ä½?ç?¨æ?·æ? å°?ç??线ç¨?--æ??æ??ç??å??æ ¸çº¿ - ç¨?å?ºæ?¬ä¸?é?½å±?äº?è¿?ä¸?ç±»ï¼?ä½?å?³ä½¿æ?¯â??ç??æ£ç??â??线ç¨?ä¹?å?¯ä»¥æ??æ?¶è¯´å?¨ä¸?å®?æ?¶é?´å??å®?们ä¸? - ä¼?对ç?¨æ?·ç©ºé?´æ??å?´è¶£ï¼?è°?度å?¨ä¸?妨è¯?ç??é?¿å??å?¨å??æ?¢VMç?¶æ??ä¸?浪费æ?¶é?´ã??ç?®å??å?ªæ??è?? - å¼?ç??bdflush syncè?½å??å?°è¿?ä¸?ç?¹ã?? - - - â??tsk->mmâ?? æ??å?? â??ç??å®?å?°å??空é?´â??ã??对äº?ä¸?个å?¿å??è¿?ç¨?æ?¥è¯´ï¼?tsk->mmå°?æ?¯NULLï¼? - å?¶é?»è¾?å??å? æ?¯å?¿å??è¿?ç¨?å®?é??ä¸?æ ¹æ?¬å°± â??没æ??â?? ç??æ£ç??å?°å??空é?´ã?? - - - ç?¶è??ï¼?æ??们æ?¾ç?¶é??è¦?è·?踪æ??们为è¿?æ ·ç??å?¿å??ç?¨æ?·â??å?·ç?¨â??äº?å?ªä¸ªå?°å??空é?´ã??为æ¤ï¼?æ??们 - æ?? â??tsk->active_mmâ??ï¼?å®?æ?¾ç¤ºäº?å½?å??æ´»å?¨ç??å?°å??空é?´æ?¯ä»?ä¹?ã?? - - è§?å??æ?¯ï¼?对äº?ä¸?个æ??ç??å®?å?°å??空é?´ç??è¿?ç¨?ï¼?å?³tsk->mmæ?¯ non-NULLï¼?ï¼?active_mm - æ?¾ç?¶å¿?é¡»ä¸?ç??å®?ç??mmç?¸å??ã?? - - 对äº?ä¸?个å?¿å??è¿?ç¨?ï¼?tsk->mm == NULLï¼?è??tsk->active_mmæ?¯å?¿å??è¿?ç¨?è¿?è¡?æ?¶ - â??å??ç?¨â??ç??mmã??å½?å?¿å??è¿?ç¨?被è°?度走æ?¶ï¼?å??ç?¨ç??å?°å??空é?´è¢«è¿?å??并æ¸?é?¤ã?? - - 为äº?æ?¯æ??æ??æ??è¿?äº?ï¼?â??struct mm_structâ??ç?°å?¨æ??两个计æ?°å?¨ï¼?ä¸?个æ?¯ â??mm_usersâ?? - 计æ?°å?¨ï¼?å?³æ??å¤?å°? â??ç??æ£ç??å?°å??空é?´ç?¨æ?·â??ï¼?å?¦ä¸?个æ?¯ â??mm_countâ??计æ?°å?¨ï¼?å?³ â??lazyâ?? - ç?¨æ?·ï¼?å?³å?¿å??ç?¨æ?·ï¼?ç??æ?°é??ï¼?å¦?æ??æ??ä»»ä½?ç??æ£ç??ç?¨æ?·ï¼?å??å? 1ã?? - - é??常æ??å?µä¸?ï¼?è?³å°?æ??ä¸?个ç??æ£ç??ç?¨æ?·ï¼?ä½?ä¹?å?¯è?½æ?¯ç??æ£ç??ç?¨æ?·å?¨å?¦ä¸?个CPUä¸?é??å?ºï¼?è?? - ä¸?个lazyç??ç?¨æ?·ä»?å?¨æ´»å?¨ï¼?æ??ä»¥ä½ å®?é??ä¸?å¾?å?°ç??æ??å?µæ?¯ï¼?ä½ æ??ä¸?个å?°å??空é?´ **å?ª** - 被lazyç??ç?¨æ?·ä½¿ç?¨ã??è¿?é??常æ?¯ä¸?个ç?æ??ç??ç??å?½å?¨æ??ç?¶æ??ï¼?å? 为ä¸?æ?¦è¿?个线ç¨?被å®?æ??ç»?ä¸? - 个ç??æ£ç??线ç¨?ï¼?è¿?个 â??å?µå°¸â?? mmå°±ä¼?被é??æ?¾ï¼?å? 为 â??mm_countâ??å??æ??äº?é?¶ã?? - - å?¦å¤?ï¼?ä¸?个æ?°ç??è§?å??æ?¯ï¼?**没æ??人** å??æ?? â??init_mmâ?? ä½?为ä¸?个ç??æ£ç??MMäº?ã?? - â??init_mmâ??åº?该被认为å?ªæ?¯ä¸?个 â??没æ??å?¶ä»?ä¸?ä¸?æ??æ?¶ç??lazyä¸?ä¸?æ??â??ï¼?äº?å®?ä¸?ï¼?å®?主 - è¦?æ?¯å?¨å?¯å?¨æ?¶ä½¿ç?¨ï¼?å½?æ?¶è¿?没æ??ç??æ£ç??VM被å??建ã??å? æ¤ï¼?ç?¨æ?¥æ£?æ?¥ç??代ç ? - - if (current->mm == &init_mm) - - ä¸?è?¬æ?¥è¯´ï¼?åº?该ç?¨ - - if (!current->mm) - - å??代ä¸?é?¢ç??å??æ³?ï¼?è¿?æ?´æ??æ??ä¹?--æµ?è¯?å?ºæ?¬ä¸?æ?¯ â??æ??们æ?¯å?¦æ??ä¸?个ç?¨æ?·ç?¯å¢?â??ï¼?并ä¸?é??常 - ç?±ç¼ºé¡µå¼?常å¤?ç??ç¨?åº?å??类似ç??ä¸?西æ?¥å®?æ??ï¼?ã?? - - æ?»ä¹?ï¼?æ??å??æ??å?¨ftp.kernel.orgä¸?æ?¾äº?ä¸?个pre-patch-2.3.13-1ï¼?å? 为å®?ç¨?å¾®æ?¹ - å??äº?æ?¥å?£ä»¥é??é??alphaï¼?è°?ä¼?æ?³å?°å?¢ï¼?ä½?alphaä½?ç³»ç»?æ??ä¸?ä¸?æ??å??æ?¢ä»£ç ?å®?é??ä¸?æ??ç»?æ?¯ - æ??ä¸?é??ç??ä¹?ä¸?--ä¸?å??å?¶ä»?æ?¶æ??ç??MMå??å¯?å?å?¨ç?¶æ??æ?¯å??å¼?ç??ï¼?alphaç??PALcodeå°?两è?? - è¿?æ?¥èµ·æ?¥ï¼?ä½ é??è¦?å??æ?¶å??æ?¢ä¸¤è??ï¼?ã?? - - (æ??æ¡£æ?¥æº? http://marc.info/?l=linux-kernel&m=93337278602211&w=2) --- a/Documentation/translations/zh_CN/vm/balance.rst +++ /dev/null @@ -1,81 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/balance.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -======== -å??å?平衡 -======== - -2000å¹´1æ??å¼?å§?ï¼?ä½?è??ï¼?Kanoj Sarcar <kanoj@xxxxxxx> - -对äº? !__GFP_HIGH å?? !__GFP_KSWAPD_RECLAIM 以å??é?? __GFP_IO ç??å??é??ï¼?é??è¦?è¿?è¡? -å??å?平衡ã?? - -è°?ç?¨è??é?¿å??å??æ?¶ç??第ä¸?个å??å? æ?¯è°?ç?¨è??ç?±äº?æ??æ??è?ªæ??é??æ??å¤?äº?ä¸æ?ç?¯å¢?ä¸è??æ? æ³?ç?¡ç? ã??第äº?个 -å??å? å?¯è?½æ?¯ï¼?è°?ç?¨è??æ?¿æ??å?¨ä¸?产ç??页é?¢å??æ?¶å¼?é??ç??æ??å?µä¸?å??é??失败ã??è¿?å?¯è?½å??ç??å?¨æ??0é?¶å??é?? -é??项ç??æ?ºä¼?主ä¹?é«?é?¶å??é??请æ±?ä¸ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?è°?ç?¨è??å?¯è?½ä¹?å¸?æ??é?¿å??å?¤é??kswapdã?? - -__GFP_IOå??é??请æ±?æ?¯ä¸ºäº?é?²æ¢æ??件系ç»?æ»é??ã?? - -å?¨æ²¡æ??é??ç?¡ç? å??é??请æ±?ç??æ??å?µä¸?ï¼?å??平衡似ä¹?æ?¯æ??害ç??ã??页é?¢å??æ?¶å?¯ä»¥è¢«æ??æ?£å?°å?¯å?¨ï¼?ä¹?å°±æ?¯ -说ï¼?å?ªæ??å?¨é??è¦?ç??æ?¶å??ï¼?ä¹?å°±æ?¯å?ºå??ç??空é?²å??å?为0ï¼?ï¼?è??ä¸?æ?¯è®©å®?æ??为ä¸?个主å?¨ç??è¿?ç¨?ã?? - -ä¹?å°±æ?¯è¯´ï¼?å??æ ¸åº?该å°?è¯?ä»?ç?´æ?¥æ? å°?æ± ä¸æ»¡è¶³å¯¹ç?´æ?¥æ? å°?页ç??请æ±?ï¼?è??ä¸?æ?¯å??é??å?°dmaæ± ä¸ï¼? -è¿?æ ·å°±å?¯ä»¥ä¿?æ??dmaæ± ä¸ºdma请æ±?ï¼?ä¸?管æ?¯ä¸?æ?¯å??å?ç??ï¼?æ??å¡«å??ã??类似ç??äº?论ä¹?é??ç?¨äº?é«?å??å? -å??ç?´æ?¥æ? å°?ç??页é?¢ã??ç?¸å??ï¼?å¦?æ??æ??å¾?å¤?空é?²ç??dma页ï¼?æ??好æ?¯é??è¿?ä»?dmaæ± ä¸å??é??ä¸?个æ?¥æ»¡è¶³ -常è§?ç??å??å?请æ±?ï¼?è??ä¸?æ?¯äº§ç??常è§?å?ºå??平衡ç??å¼?é??ã?? - -å?¨2.2ä¸ï¼?å?ªæ??å½?空é?²é¡µæ?»æ?°ä½?äº?æ?»å??å?ç??1/64æ?¶ï¼?æ??ä¼?å?¯å?¨å??å?平衡/页é?¢å??æ?¶ã??å¦?æ??dma -å??常è§?å??å?ç??æ¯?ä¾?å??é??ï¼?å?³ä½¿dmaå?ºå®?å?¨ç©ºäº?ï¼?ä¹?å¾?å?¯è?½ä¸?ä¼?è¿?è¡?平衡ã??2.2å·²ç»?å?¨ä¸?å??å??å? -大å°?ç??ç??产æ?ºå?¨ä¸?è¿?è¡?ï¼?å?³ä½¿æ??è¿?个é?®é¢?å?å?¨ï¼?ä¼¼ä¹?ä¹?å??å¾?ä¸?é??ã??å?¨2.3ä¸ï¼?ç?±äº?HIGHMEMç?? -å?å?¨ï¼?è¿?个é?®é¢?å??å¾?æ?´å? 严é??ã?? - -å?¨2.3ä¸ï¼?å?ºå??平衡å?¯ä»¥ç?¨ä¸¤ç§?æ?¹å¼?ä¹?ä¸?æ?¥å®?æ??ï¼?æ ¹æ?®å?ºå??ç??大å°?ï¼?å?¯è?½æ?¯ä½?级å?ºå??ç??大å°?ï¼?ï¼? -æ??们å?¯ä»¥å?¨å??å§?å??é?¶æ®µå?³å®?å?¨å¹³è¡¡ä»»ä½?å?ºå??æ?¶åº?该äº?å??å¤?å°?空é?²é¡µã??好ç??æ?¹é?¢æ?¯ï¼?å?¨å¹³è¡¡ç??æ?¶ -å??ï¼?æ??们ä¸?é??è¦?ç??ä½?级å?ºç??大å°?ï¼?å??ç??æ?¹é?¢æ?¯ï¼?æ??们å?¯è?½ä¼?å? 为忽ç?¥ä½?级å?ºå?¯è?½è¾?ä½?ç??使ç?¨ç?? -è??å??è¿?äº?é¢?ç¹?ç??平衡ã??å?¦å¤?ï¼?å?ªè¦?对å??é??ç¨?åº?ç¨?ä½?ä¿®æ?¹ï¼?å°±æ??å?¯è?½å°?memclass()å®?ç®?å??为ä¸? -个ç®?å??ç??ç?å¼?ã?? - -å?¦ä¸?个å?¯è?½ç??解å?³æ?¹æ¡?æ?¯ï¼?æ??们å?ªå?¨ä¸?个å?º **å??** å?¶æ??æ??ä½?级å?ºç??空é?²å??å?ä½?äº?该å?ºå??å?¶ -ä½?级å?ºæ?»å??å?ç??1/64æ?¶è¿?è¡?平衡ã??è¿?就解å?³äº?2.2ç??平衡é?®é¢?ï¼?并尽å?¯è?½å?°ä¿?æ??äº?ä¸?2.2è¡?为 -ç??æ?¥è¿?ã??å?¦å¤?ï¼?平衡ç®?æ³?å?¨å??ç§?æ?¶æ??ä¸?ç??å·¥ä½?æ?¹å¼?ä¹?æ?¯ä¸?æ ·ç??ï¼?è¿?äº?æ?¶æ??æ??ä¸?å??æ?°é??å??ç±»å??ç?? -å??å?å?ºã??å¦?æ??æ??们æ?³å??å¾?æ?´è?±å?¨ä¸?ç?¹ï¼?æ??们å?¯ä»¥å?¨æ?ªæ?¥ä¸ºä¸?å??å?ºå??ç??è?ªç?±é¡µé?¢å??é??ä¸?å??ç??æ??é??ã?? - -请注æ??ï¼?å¦?æ??æ?®é??å?ºç??大å°?ä¸?dmaå?ºç?¸æ¯?æ?¯å·¨å¤§ç??ï¼?é?£ä¹?å?¨å?³å®?æ?¯å?¦å¹³è¡¡æ?®é??å?ºç??æ?¶å??ï¼?è??è?? -空é?²ç??dma页就å??å¾?ä¸?é?£ä¹?é??è¦?äº?ã??é?£ä¹?第ä¸?个解å?³æ?¹æ¡?å°±å??å¾?æ?´æ??å?¸å¼?å??ã?? - -æ??é??ç??è¡¥ä¸?å®?ç?°äº?第äº?个解å?³æ?¹æ¡?ã??å®?è¿? â??ä¿®å¤?â??äº?两个é?®é¢?ï¼?é¦?å??ï¼?å?¨ä½?å??å?æ?¡ä»¶ä¸?ï¼?kswapd -被å?¤é??ï¼?å°±å??2.2ä¸ç??é??ç?¡ç? å??é??ã??第äº?ï¼?HIGHMEMå?ºä¹?被平衡äº?ï¼?以便ç»?replace_with_highmem() -ä¸?个äº?å??è?·å¾?HIGHMEM页ç??æ?ºä¼?ï¼?å??æ?¶ç¡®ä¿?HIGHMEMå??é??ä¸?ä¼?è?½å??æ?®é??å?ºã??è¿?ä¹?ç¡®ä¿?äº?HIGHMEM -页ä¸?ä¼?被æ³?é?²ï¼?ä¾?å¦?ï¼?å?¨ä¸?个HIGHMEM页å?¨äº¤æ?¢ç¼?å?ä¸ä½?没æ??被任ä½?人使ç?¨ç??æ??å?µä¸?ï¼?ã?? - -kswapdè¿?é??è¦?ç?¥é??å®?åº?该平衡å?ªäº?å?ºã??kswapd主è¦?æ?¯å?¨æ? æ³?è¿?è¡?平衡ç??æ??å?µä¸?é??è¦?ç??ï¼?å?¯è?½ -æ?¯å? 为æ??æ??ç??å??é??请æ±?é?½æ?¥è?ªä¸æ?ä¸?ä¸?æ??ï¼?è??æ??æ??ç??è¿?ç¨?ä¸?ä¸?æ??é?½å?¨ç?¡ç? ã??对äº?2.3ï¼? -kswapd并ä¸?ç??æ£é??è¦?平衡é«?å??å?å?ºï¼?å? 为ä¸æ?ä¸?ä¸?æ??并ä¸?请æ±?é«?å??å?页ã??kswapdç??zone -ç»?æ??ä½?ä¸ç??zone_wake_kswapdå?段æ?¥å?³å®?ä¸?个å?ºæ?¯å?¦é??è¦?平衡ã?? - -å¦?æ??ä»?è¿?ç¨?å??å?å??shmä¸å?·å??页é?¢å?¯ä»¥å??轻该页é?¢è??ç?¹ä¸ä»»ä½?å?ºç??å??å?å??å??ï¼?è??该å?ºç??å??å?å??å?? -å·²ç»?ä½?äº?å?¶æ°´ä½?ï¼?å??ä¼?è¿?è¡?å?·å??ã?? - -watemark[WMARK_MIN/WMARK_LOW/WMARK_HIGH]/low_on_memory/zone_wake_kswapdï¼? -è¿?äº?æ?¯æ¯?个å?ºç??å?段ï¼?ç?¨äº?ç¡®å®?ä¸?个å?ºä½?æ?¶é??è¦?平衡ã??å½?页é?¢æ?°ä½?äº?æ°´ä½?[WMARK_MIN]æ?¶ï¼? -hysteric ç??å?段low_on_memory被设置ã??è¿?个å?段ä¼?ä¸?ç?´è¢«è®¾ç½®ï¼?ç?´å?°ç©ºé?²é¡µæ?°å??æ??æ°´ä½? -[WMARK_HIGH]ã??å½?low_on_memory被设置æ?¶ï¼?页é?¢å??é??请æ±?å°?å°?è¯?é??æ?¾è¯¥å?ºå??ç??ä¸?äº?页é?¢ï¼?å¦?æ?? -请æ±?ä¸è®¾ç½®äº?GFP_WAITï¼?ã??ä¸?æ¤ç?¸å??ç??æ?¯ï¼?å?³å®?å?¤é??kswapd以é??æ?¾ä¸?äº?å?ºç??页ã??è¿?个å?³å®?ä¸?æ?¯å?ºäº? -hysteresis ç??ï¼?è??æ?¯å½?空é?²é¡µç??æ?°é??ä½?äº?watermark[WMARK_LOW]æ?¶å°±ä¼?è¿?è¡?ï¼?å?¨è¿?ç§?æ??å?µä¸?ï¼? -zone_wake_kswapdä¹?被设置ã?? - - -æ??æ??å?¬å?°ç??ï¼?è¶?æ£?ç??ï¼?æ?³æ³?ï¼? - -1. å?¨æ??ç»?å??åº?该影å??平衡ï¼?å?¯ä»¥è·?踪ä¸?个å?ºç??失败请æ±?ç??æ?°é??ï¼?并å??é¦?å?°å¹³è¡¡æ?¹æ¡?ä¸ï¼?jalvo@xxxxxxxxï¼?ã?? - -2. å®?ç?°ä¸?个类似äº?replace_with_highmem()ç??replace_with_regular()ï¼?以ä¿?ç??dma页é?¢ã?? - (lkd@xxxxxxxxxxxxxxxxxxxxxxxx) --- a/Documentation/translations/zh_CN/vm/damon/api.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -:Original: Documentation/vm/damon/api.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -======= -APIå??è?? -======= - -å??æ ¸ç©ºé?´ç??ç¨?åº?å?¯ä»¥ä½¿ç?¨ä¸?é?¢ç??APIæ?¥ä½¿ç?¨DAMONç??æ¯?个å??è?½ã??ä½ æ??é??è¦?å??ç??å°±æ?¯å¼?ç?¨ ``damon.h`` ï¼? -å®?ä½?äº?æº?代ç ?æ ?ç??include/linux/ã?? - -ç»?æ??ä½? -====== - -该APIå?¨ä»¥ä¸?å??æ ¸ä»£ç ?ä¸: - -include/linux/damon.h - - -å?½æ?° -==== - -该APIå?¨ä»¥ä¸?å??æ ¸ä»£ç ?ä¸: - -mm/damon/core.c --- a/Documentation/translations/zh_CN/vm/damon/design.rst +++ /dev/null @@ -1,140 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -:Original: Documentation/vm/damon/design.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -==== -设计 -==== - -å?¯é??ç½®ç??å±? -========== - -DAMONæ??ä¾?äº?æ?°æ?®è®¿é?®ç??æ?§å??è?½ï¼?å??æ?¶ä½¿å?¶å??ç¡®æ?§å??å¼?é??å?¯æ?§ã??å?ºæ?¬ç??访é?®ç??æ?§é??è¦?ä¾?èµ?äº?ç?®æ ?å?°å??空é?´ -并为ä¹?ä¼?å??ç??å?ºå??ã??å?¦ä¸?æ?¹é?¢ï¼?ä½?为DAMONç??æ ¸å¿?ï¼?å??ç¡®æ?§å??å¼?é??ç??æ??è¡¡æ?ºå?¶æ?¯å?¨çº¯é?»è¾?空é?´ä¸ã??DAMON -å°?è¿?两é?¨å??å??离å?¨ä¸?å??ç??å±?ä¸ï¼?并å®?ä¹?äº?å®?ç??æ?¥å?£ï¼?以å??许å??ç§?ä½?å±?次ç??å?ºå??å®?ç?°ä¸?æ ¸å¿?é?»è¾?ç??é??ç½®ã?? - -ç?±äº?è¿?ç§?å??离ç??设计å??å?¯é??ç½®ç??æ?¥å?£ï¼?ç?¨æ?·å?¯ä»¥é??è¿?é??ç½®æ ¸å¿?é?»è¾?å??é??å½?ç??ä½?级å?ºå??å®?ç?°æ?¥æ?©å±?DAMONç?? -ä»»ä½?å?°å??空é?´ã??å¦?æ??没æ??æ??ä¾?å??é??ç??ï¼?ç?¨æ?·å?¯ä»¥è?ªå·±å®?ç?°å?ºå??ã?? - -ä¾?å¦?ï¼?ç?©ç??å??å?ã??è??æ??å??å?ã??交æ?¢ç©ºé?´ã??é?£äº?ç?¹å®?ç??è¿?ç¨?ã??NUMAè??ç?¹ã??æ??件å??æ?¯æ??ç??å??å?设å¤?å°?被æ?¯æ??ã?? -å?¦å¤?ï¼?å¦?æ??æ??äº?æ?¶æ??æ??设å¤?æ?¯æ??ç?¹æ®?ç??ä¼?å??访é?®æ£?æ?¥å?ºå??ï¼?è¿?äº?å?ºå??å°?å¾?容æ??被é??ç½®ã?? - - -ç?¹å®?å?°å??空é?´å?ºå??ç??å??è??å®?ç?° -========================== - -å?ºæ?¬è®¿é?®ç??æµ?ç??ä½?级å?ºå??被å®?ä¹?为两é?¨å??ã??: - -1. ç¡®å®?å?°å??空é?´ç??ç??æµ?ç?®æ ?å?°å??è??å?´ -2. ç?®æ ?空é?´ä¸ç?¹å®?å?°å??è??å?´ç??访é?®æ£?æ?¥ã?? - -DAMONç?®å??为ç?©ç??å??è??æ??å?°å??空é?´æ??ä¾?äº?å?ºå??ç??å®?ç?°ã??ä¸?é?¢ä¸¤ä¸ªå°?è??æ??è¿°äº?è¿?äº?å·¥ä½?ç??æ?¹å¼?ã?? - - -å?ºäº?VMAç??ç?®æ ?å?°å??è??å?´æ??é? -------------------------- - -è¿?ä»?ä»?æ?¯é??对è??æ??å?°å??空é?´å?ºå??ç??å®?ç?°ã??对äº?ç?©ç??å?°å??空é?´ï¼?å?ªæ?¯è¦?æ±?ç?¨æ?·æ??å?¨è®¾ç½®ç??æ?§ç?®æ ?å?°å??è??å?´ã?? - -å?¨è¿?ç¨?ç??è¶?级巨大ç??è??æ??å?°å??空é?´ä¸ï¼?å?ªæ??å°?é?¨å??被æ? å°?å?°ç?©ç??å??å?并被访é?®ã??å? æ¤ï¼?è·?踪æ?ªæ? å°?ç??å?° -å??å?ºå??å?ªæ?¯ä¸?ç§?浪费ã??ç?¶è??ï¼?ç?±äº?DAMONå?¯ä»¥ä½¿ç?¨è?ªé??åº?å?ºå??è°?æ?´æ?ºå?¶æ?¥å¤?ç??ä¸?å®?ç¨?度ç??å?ªå£°ï¼?æ??以严 -æ ¼æ?¥è¯´ï¼?è·?踪æ¯?ä¸?个æ? å°?并ä¸?æ?¯å¿?é¡»ç??ï¼?ä½?å?¨æ??äº?æ??å?µä¸?ç??è?³ä¼?产ç??å¾?é«?ç??å¼?é??ã??ä¹?å°±æ?¯è¯´ï¼?ç??æµ?ç?®æ ? -å??é?¨è¿?äº?巨大ç??æ?ªæ? å°?å?ºå??åº?该被移é?¤ï¼?以ä¸?å? ç?¨è?ªé??åº?æ?ºå?¶ç??æ?¶é?´ã?? - -å?ºäº?è¿?个å??å? ï¼?è¿?个å®?ç?°å°?å¤?æ??ç??æ? å°?转æ?¢ä¸ºä¸?个ä¸?å??ç??å?ºå??ï¼?è¦?ç??å?°å??空é?´ç??æ¯?个æ? å°?å?ºå??ã??è¿?ä¸?个 -å?ºå??ä¹?é?´ç??两个空é??æ?¯ç»?å®?å?°å??空é?´ä¸ä¸¤ä¸ªæ??大ç??æ?ªæ? å°?å?ºå??ã??è¿?两个æ??大ç??æ?ªæ? å°?å?ºå??æ?¯å ?å??æ??ä¸?é?¢ -ç??mmap()å?ºå??ä¹?é?´ç??é?´é??ï¼?以å??å?¨å¤§å¤?æ?°æ??å?µä¸?æ??ä¸?é?¢ç??mmap()å?ºå??å??å ?ä¹?é?´ç??é?´é??ã??å? 为è¿?äº?é?´é?? -å?¨é??常ç??å?°å??空é?´ä¸æ?¯å¼?常巨大ç??ï¼?æ??é?¤è¿?äº?é?´é??就足以å??å?ºå??ç??ç??æ??è¡¡ã??ä¸?é?¢è¯¦ç»?说æ??äº?è¿?ä¸?ç?¹:: - - <heap> - <BIG UNMAPPED REGION 1> - <uppermost mmap()-ed region> - (small mmap()-ed regions and munmap()-ed regions) - <lowermost mmap()-ed region> - <BIG UNMAPPED REGION 2> - <stack> - - -å?ºäº?PTE访é?®ä½?ç??访é?®æ£?æ?¥ ------------------------ - -ç?©ç??å??è??æ??å?°å??空é?´ç??å®?ç?°é?½ä½¿ç?¨PTE Accessed-bitè¿?è¡?å?ºæ?¬è®¿é?®æ£?æ?¥ã??å?¯ä¸?ç??å?ºå?«å?¨äº?ä»?å?°å??ä¸ -æ?¾å?°ç?¸å?³ç??PTE访é?®ä½?ç??æ?¹å¼?ã??è??æ??å?°å??ç??å®?ç?°æ?¯ä¸ºè¯¥å?°å??ç??ç?®æ ?ä»»å?¡æ?¥æ?¾é¡µè¡¨ï¼?è??ç?©ç??å?°å??ç??å®?ç?°å?? -æ?¯æ?¥æ?¾ä¸?该å?°å??æ??æ? å°?å?³ç³»ç??æ¯?ä¸?个页表ã??é??è¿?è¿?ç§?æ?¹å¼?ï¼?å®?ç?°è??æ?¾å?°å¹¶æ¸?é?¤ä¸?ä¸?个é??æ ·ç?®æ ?å?°å??ç??ä½?ï¼? -并æ£?æ?¥è¯¥ä½?æ?¯å?¦å?¨ä¸?个é??æ ·å?¨æ??å??å??次设置ã??è¿?å?¯è?½ä¼?å¹²æ?°å?¶ä»?使ç?¨è®¿é?®ä½?ç??å??æ ¸å?ç³»ç»?ï¼?å?³ç©ºé?²é¡µè·? -踪å??å??æ?¶é?»è¾?ã??为äº?é?¿å??è¿?ç§?å¹²æ?°ï¼?DAMON使å?¶ä¸?空é?²é¡µé?¢è·?踪ç?¸äº?æ??æ?¥ï¼?并使ç?¨ ``PG_idle`` å?? -``PG_young`` 页é?¢æ ?å¿?æ?¥è§£å?³ä¸?å??æ?¶é?»è¾?ç??å?²çª?ï¼?å°±å??空é?²é¡µé?¢è·?踪é?£æ ·ã?? - - -ç?¬ç«?äº?å?°å??空é?´ç??æ ¸å¿?æ?ºå?¶ -======================== - -ä¸?é?¢å??个é?¨å??å??å?«æ??è¿°äº?DAMONç??æ ¸å¿?æ?ºå?¶å??äº?个ç??æµ?å±?æ?§ï¼?å?³ ``é??æ ·é?´é??`` ã?? ``è??é??é?´é??`` ã?? -``æ?´æ?°é?´é??`` ã?? ``æ??å°?å?ºå??æ?°`` å?? ``æ??大å?ºå??æ?°`` ã?? - - -访é?®é¢?ç??ç??æµ? ------------- - -DAMONç??è¾?å?ºæ?¾ç¤ºäº?å?¨ç»?å®?ç??æ?¶é?´å??å?ªäº?页é?¢ç??访é?®é¢?ç??æ?¯å¤?å°?ã??访é?®é¢?ç??ç??å??辨ç??æ?¯é??è¿?设置 -``é??æ ·é?´é??`` å?? ``è??é??é?´é??`` æ?¥æ?§å?¶ç??ã??详ç»?å?°è¯´ï¼?DAMONæ£?æ?¥æ¯?个 ``é??æ ·é?´é??`` 对æ¯? -个页é?¢ç??访é?®ï¼?并å°?ç»?æ??æ±?æ?»ã??æ?¢å?¥è¯?说ï¼?计ç®?æ¯?个页é?¢ç??访é?®æ¬¡æ?°ã??å?¨æ¯?个 ``è??å??é?´é??`` è¿? -å?»å??ï¼?DAMONè°?ç?¨å??å??ç?±ç?¨æ?·æ³¨å??ç??å??è°?å?½æ?°ï¼?以便ç?¨æ?·å?¯ä»¥é??读è??å??ç??ç»?æ??ï¼?ç?¶å??å??æ¸?é?¤è¿?äº?ç»? -æ??ã??è¿?å?¯ä»¥ç?¨ä»¥ä¸?ç®?å??ç??伪代ç ?æ?¥æ??è¿°:: - - while monitoring_on: - for page in monitoring_target: - if accessed(page): - nr_accesses[page] += 1 - if time() % aggregation_interval == 0: - for callback in user_registered_callbacks: - callback(monitoring_target, nr_accesses) - for page in monitoring_target: - nr_accesses[page] = 0 - sleep(sampling interval) - -è¿?ç§?æ?ºå?¶ç??ç??æµ?å¼?é??å°?é??ç??ç?®æ ?å·¥ä½?è´?è½½è§?模ç??å¢?é?¿è??ä»»æ??å¢?å? ã?? - - -å?ºäº?å?ºå??ç??æ?½æ ·è°?æ?¥ ------------------- - -为äº?é?¿å??å¼?é??ç??æ? é??å?¶å¢?å? ï¼?DAMONå°?å??å®?å?·æ??ç?¸å??访é?®é¢?ç??ç??ç?¸é?»é¡µé?¢å½?å?¥ä¸?个å?ºå??ã??å?ªè¦?ä¿?æ?? -è¿?个å??设ï¼?ä¸?个å?ºå??å??ç??页é?¢å?·æ??ç?¸å??ç??访é?®é¢?ç??ï¼?ï¼?该å?ºå??å??å°±å?ªé??è¦?æ£?æ?¥ä¸?个页é?¢ã??å? æ¤ï¼?对 -äº?æ¯?个 ``é??æ ·é?´é??`` ï¼?DAMONå?¨æ¯?个å?ºå??ä¸é??æ?ºæ??é??ä¸?个页é?¢ï¼?ç?å¾?ä¸?个 ``é??æ ·é?´é??`` ï¼?æ£? -æ?¥è¯¥é¡µé?¢æ?¯å?¦å??æ?¶è¢«è®¿é?®ï¼?å¦?æ??被访é?®å??å¢?å? 该å?ºå??ç??访é?®é¢?ç??ã??å? æ¤ï¼?ç??æµ?å¼?é??æ?¯å?¯ä»¥é??è¿?设置 -å?ºå??ç??æ?°é??æ?¥æ?§å?¶ç??ã??DAMONå??许ç?¨æ?·è®¾ç½®æ??å°?å??æ??大ç??å?ºå??æ?°é??æ?¥è¿?è¡?æ??è¡¡ã?? - -ç?¶è??ï¼?å¦?æ??å??设没æ??å¾?å?°ä¿?è¯?ï¼?è¿?个æ?¹æ¡?å°±ä¸?è?½ä¿?æ??è¾?å?ºç??è´¨é??ã?? - - -é??åº?æ?§å?ºå??è°?æ?´ --------------- - -å?³ä½¿æ??å??ç??ç??æµ?ç?®æ ?å?ºå??被å¾?好å?°æ??建以满足å??设ï¼?å??ä¸?å?ºå??å??ç??页é?¢å?·æ??ç?¸ä¼¼ç??访é?®é¢?ç??ï¼?ï¼?æ?° -æ?®è®¿é?®æ¨¡å¼?ä¹?ä¼?被å?¨æ??å?°æ?¹å??ã??è¿?å°?导è?´ç??æµ?è´¨é??ä¸?é??ã??为äº?å°½å?¯è?½å?°ä¿?æ??å??设ï¼?DAMONæ ¹æ?®æ¯?个 -å?ºå??ç??访é?®é¢?ç??è?ªé??åº?å?°è¿?è¡?å??并å??æ??å??ã?? - -对äº?æ¯?个 ``è??é??å?ºé?´`` ï¼?å®?æ¯?è¾?ç?¸é?»å?ºå??ç??访é?®é¢?ç??ï¼?å¦?æ??é¢?ç??å·®å¼?è¾?å°?ï¼?å°±å??并è¿?äº?å?ºå??ã?? -ç?¶å??ï¼?å?¨å®?æ?¥å??并æ¸?é?¤æ¯?个å?ºå??ç??è??å??æ?¥å?¥é¢?ç??å??ï¼?å¦?æ??å?ºå??æ?»æ?°ä¸?è¶?è¿?ç?¨æ?·æ??å®?ç??æ??大å?ºå??æ?°ï¼? -å®?å°?æ¯?个å?ºå??æ??å??为两个æ??ä¸?个å?ºå??ã?? - -é??è¿?è¿?ç§?æ?¹å¼?ï¼?DAMONæ??ä¾?äº?å?¶æ??ä½³ç??è´¨é??å??æ??å°?ç??å¼?é??ï¼?å??æ?¶ä¿?æ??äº?ç?¨æ?·ä¸ºå?¶æ??衡设å®?ç??ç??é??ã?? - - -å?¨æ??ç?®æ ?空é?´æ?´æ?°å¤?ç?? --------------------- - -ç??æµ?ç?®æ ?å?°å??è??å?´å?¯ä»¥å?¨æ??æ?¹å??ã??ä¾?å¦?ï¼?è??æ??å??å?å?¯ä»¥å?¨æ??å?°è¢«æ? å°?å??解æ? å°?ã??ç?©ç??å??å?å?¯ä»¥è¢« -ç?æ??æ??ã?? - -ç?±äº?å?¨æ??äº?æ??å?µä¸?å??å??å?¯è?½ç?¸å½?é¢?ç¹?ï¼?DAMONå??许ç??æ?§æ??ä½?æ£?æ?¥å?¨æ??å??å??ï¼?å??æ?¬å??å?æ? å°?å??å??ï¼? -并ä»?å?¨ç?¨æ?·æ??å®?ç??æ?¶é?´é?´é??ï¼? ``æ?´æ?°é?´é??`` ï¼?ä¸ç??æ¯?个æ?¶é?´æ®µï¼?å°?å?¶åº?ç?¨äº?ç??æ?§æ??ä½?ç?¸å?³ç?? -æ?°æ?®ç»?æ??ï¼?å¦?æ?½è±¡ç??ç??æ?§ç?®æ ?å??å?å?ºã?? \ No newline at end of file --- a/Documentation/translations/zh_CN/vm/damon/faq.rst +++ /dev/null @@ -1,48 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -:Original: Documentation/vm/damon/faq.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -======== -常è§?é?®é¢? -======== - -为ä»?ä¹?æ?¯ä¸?个æ?°ç??å?ç³»ç»?ï¼?è??ä¸?æ?¯æ?©å±?perfæ??å?¶ä»?ç?¨æ?·ç©ºé?´å·¥å?·ï¼? -========================================================== - -é¦?å??ï¼?å? 为å®?é??è¦?å°½å?¯è?½ç??è½»é??级ï¼?以便å?¯ä»¥å?¨çº¿ä½¿ç?¨ï¼?æ??以åº?该é?¿å??ä»»ä½?ä¸?å¿?è¦?ç??å¼?é??ï¼?å¦?å??æ ¸-ç?¨æ?· -空é?´ç??ä¸?ä¸?æ??å??æ?¢æ??æ?¬ã??第äº?ï¼?DAMONç??ç?®æ ?æ?¯è¢«å??æ?¬å??æ ¸å?¨å??ç??å?¶ä»?ç¨?åº?æ??使ç?¨ã??å? æ¤ï¼?对ç?¹å®?å·¥å?· -ï¼?å¦?perfï¼?ç??ä¾?èµ?æ?§æ?¯ä¸?å?¯å??ç??ã??è¿?å°±æ?¯DAMONå?¨å??æ ¸ç©ºé?´å®?ç?°ç??两个æ??大ç??å??å? ã?? - - -â??é?²ç½®é¡µé?¢è·?踪â?? æ?? â??perf memâ?? å?¯ä»¥æ?¿ä»£DAMONå??ï¼? -============================================== - -é?²ç½®é¡µè·?踪æ?¯ç?©ç??å?°å??空é?´è®¿é?®æ£?æ?¥ç??ä¸?个ä½?å±?次ç??å??å§?æ?¹æ³?ã??â??perf memâ??ä¹?æ?¯ç±»ä¼¼ç??ï¼?尽管å®?å?¯ä»¥ -使ç?¨é??æ ·æ?¥å??å°?å¼?é??ã??å?¦ä¸?æ?¹é?¢ï¼?DAMONæ?¯ä¸?个æ?´é«?å±?次ç??æ¡?æ?¶ï¼?ç?¨äº?ç??æ?§å??ç§?å?°å??空é?´ã??å®?ä¸?注äº?å?? -å?管ç??ä¼?å??ï¼?并æ??ä¾?å¤?æ??ç??精度/å¼?é??å¤?ç??æ?ºå?¶ã??å? æ¤ï¼?â??空é?²é¡µé?¢è·?踪â?? å?? â??perf memâ?? å?¯ä»¥æ??ä¾? -DAMONè¾?å?ºç??ä¸?个å?é??ï¼?ä½?ä¸?è?½æ?¿ä»£DAMONã?? - - -DAMONæ?¯å?¦å?ªæ?¯æ??è??æ??å??å?ï¼? -========================= - -ä¸?ï¼?DAMONç??æ ¸å¿?æ?¯ç?¬ç«?äº?å?°å??空é?´ç??ã??ç?¨æ?·å?¯ä»¥å?¨DAMONæ ¸å¿?ä¸?å®?ç?°å??é??ç½®ç?¹å®?å?°å??空é?´ç??ä½?级å??å§? -é?¨å??ï¼?å??æ?¬ç??æµ?ç?®æ ?å?ºå??ç??æ??é? å??å®?é??ç??访é?®æ£?æ?¥ã??é??è¿?è¿?ç§?æ?¹å¼?ï¼?DAMONç?¨æ?·å?¯ä»¥ç?¨ä»»ä½?访é?®æ£?æ?¥æ?? -æ?¯æ?¥ç??æµ?ä»»ä½?å?°å??空é?´ã?? - -尽管å¦?æ¤ï¼?DAMONé»?认为è??æ??å??å?å??ç?©ç??å??å?æ??ä¾?äº?å?ºäº?vma/rmapè·?踪å??PTE访é?®ä½?æ£?æ?¥ç??å?°å??空é?´ -ç?¸å?³å??è?½ç??å®?ç?°ï¼?以ä¾?å??è??å??æ?¹ä¾¿ä½¿ç?¨ã?? - - -æ??å?¯ä»¥ç®?å??å?°ç??æµ?页é?¢ç??ç²?度å??ï¼? -============================== - -æ?¯ç??ï¼?ä½ å?¯ä»¥é??è¿?设置 ``min_nr_regions`` å±?æ?§é«?äº?å·¥ä½?é??大å°?é?¤ä»¥é¡µé?¢å¤§å°?ç??å?¼æ?¥å®?ç?°ã?? -å? 为ç??è§?ç?®æ ?å?ºå??ç??大å°?被强å?¶ä¸º ``>=page size`` ï¼?æ??以å?ºå??å??å?²ä¸?ä¼?产ç??ä»»ä½?å½±å??ã?? --- a/Documentation/translations/zh_CN/vm/damon/index.rst +++ /dev/null @@ -1,33 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -:Original: Documentation/vm/damon/index.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -========================== -DAMON:æ?°æ?®è®¿é?®ç??è§?å?¨ -========================== - -DAMONæ?¯Linuxå??æ ¸ç??ä¸?个æ?°æ?®è®¿é?®ç??æ?§æ¡?æ?¶å?ç³»ç»?ã??DAMONç??æ ¸å¿?æ?ºå?¶ä½¿å?¶æ??为 -ï¼?è¯¥æ ¸å¿?æ?ºå?¶è¯¦è§?(Documentation/translations/zh_CN/vm/damon/design.rst)ï¼? - - - *å??确度* ï¼?ç??æµ?è¾?å?ºå¯¹DRAM级å?«ç??å??å?管ç??足å¤?æ??ç?¨ï¼?ä½?å?¯è?½ä¸?é??å??CPU Cache级å?«ï¼?ï¼? - - *è½»é??级* ï¼?ç??æ?§å¼?é??ä½?å?°å?¯ä»¥å?¨çº¿åº?ç?¨ï¼?ï¼?以å?? - - *å?¯æ?©å±?* ï¼?æ? 论ç?®æ ?å·¥ä½?è´?è½½ç??大å°?ï¼?å¼?é??ç??ä¸?é??å?¼é?½å?¨æ??å®?è??å?´å??ï¼?ã?? - -å? æ¤ï¼?å?©ç?¨è¿?个æ¡?æ?¶ï¼?å??æ ¸ç??å??å?管ç??æ?ºå?¶å?¯ä»¥å??å?ºé«?级å?³ç?ã??ä¼?导è?´é«?æ?°æ?®è®¿é?®ç??æ?§å¼?é??ç??å®? -éª?æ?§å??å?管ç??ä¼?å??å·¥ä½?å?¯ä»¥å??次è¿?è¡?ã??å??æ?¶ï¼?å?¨ç?¨æ?·ç©ºé?´ï¼?æ??ä¸?äº?ç?¹æ®?å·¥ä½?è´?è½½ç??ç?¨æ?·å?¯ä»¥ç¼?å?? -个æ?§å??ç??åº?ç?¨ç¨?åº?ï¼?以便æ?´å¥½å?°äº?解å??ä¼?å??ä»?们ç??å·¥ä½?è´?è½½å??ç³»ç»?ã?? - -.. toctree:: - :maxdepth: 2 - - faq - design - api - --- a/Documentation/translations/zh_CN/vm/free_page_reporting.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/_free_page_reporting.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - -========== -空é?²é¡µæ?¥å?? -========== - -空é?²é¡µæ?¥å??æ?¯ä¸?个APIï¼?设å¤?å?¯ä»¥é??è¿?å®?æ?¥æ³¨å??æ?¥æ?¶ç³»ç»?å½?å??æ?ªä½¿ç?¨ç??页é?¢å??表ã??è¿?å?¨è??æ?? -å??ç??æ??å?µä¸?æ?¯å¾?æ??ç?¨ç??ï¼?客æ?·æ?ºè?½å¤?使ç?¨è¿?äº?æ?°æ?®æ?¥é??ç?¥ç®¡ç??å?¨å®?ä¸?å??使ç?¨å??å?ä¸ç??æ??äº?页 -é?¢ã?? - -对äº?驱å?¨ï¼?é??常æ?¯æ°?ç??驱å?¨è¦?使ç?¨è¿?个å??è?½ï¼?å®?å°?å??é??å??å??å§?å??ä¸?个page_reporting_dev_info -ç»?æ??ä½?ã??å®?è¦?å¡«å??ç??ç»?æ??ä½?ä¸ç??å?段æ?¯ç?¨äº?å¤?ç??æ?£ç?¹å??表ç?? "report" å?½æ?°æ??é??ã??å®?è¿?å¿? -é¡»ä¿?è¯?æ¯?次è°?ç?¨è¯¥å?½æ?°æ?¶è?½å¤?ç??è?³å°?ç?¸å½?äº?PAGE_REPORTING_CAPACITYç??æ?£ç?¹å??表æ?¡ç?®ã?? -å??设没æ??å?¶ä»?页é?¢æ?¥å??设å¤?å·²ç»?注å??ï¼? 对page_reporting_registerç??è°?ç?¨å°?å??æ?¥å??æ¡? -æ?¶æ³¨å??页é?¢æ?¥å??æ?¥å?£ã?? - -ä¸?æ?¦æ³¨å??ï¼?页é?¢æ?¥å??APIå°?å¼?å§?å??驱å?¨æ?¥å??æ??æ?¹ç??页é?¢ã??APIå°?å?¨æ?¥å?£è¢«æ³¨å??å??2ç§?å¼?å§?æ?¥å?? -页é?¢ï¼?并å?¨ä»»ä½?足å¤?é«?ç??页é?¢è¢«é??æ?¾ä¹?å??2ç§?继ç»æ?¥å??ã?? - -æ?¥å??ç??页é?¢å°?被å?å?¨å?¨ä¼ é??ç»?æ?¥å??å?½æ?°ç??æ?£å??表ä¸ï¼?æ??å??ä¸?个æ?¡ç?®ç??ç»?æ??ä½?被设置å?¨æ?¡ç?® -nent-1ä¸ã?? å½?页é?¢è¢«æ?¥å??å?½æ?°å¤?ç??æ?¶ï¼?å??é??å?¨å°?æ? æ³?访é?®å®?们ã??ä¸?æ?¦æ?¥å??å?½æ?°å®?æ??ï¼?è¿?äº? -页å°?被è¿?å??å?°å®?们æ??è?·å¾?ç??è?ªç?±å?ºå??ã?? - -å?¨ç§»é?¤ä½¿ç?¨ç©ºé?²é¡µæ?¥å??ç??驱å?¨ä¹?å??ï¼?æ??å¿?è¦?è°?ç?¨page_reporting_unregisterï¼?以移é?¤ -ç?®å??被空é?²é¡µæ?¥å??使ç?¨ç??page_reporting_dev_infoç»?æ??ä½?ã??è¿?æ ·å??å°?é?»æ¢è¿?ä¸?æ¥ç??æ?¥ -å??é??è¿?该æ?¥å?£å??å?ºã??å¦?æ??å?¦ä¸?个驱å?¨æ??å??ä¸?驱å?¨è¢«æ³¨å??ï¼?å®?å°±æ??å?¯è?½æ?¢å¤?å??ä¸?个驱å?¨å?¨æ?¥å?? -空é?²é¡µæ?¹é?¢ç??å·¥ä½?ã?? - - -Alexander Duyck, 2019å¹´12æ??04æ?¥ --- a/Documentation/translations/zh_CN/vm/frontswap.rst +++ /dev/null @@ -1,196 +0,0 @@ -:Original: Documentation/vm/_free_page_reporting.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - -========= -Frontswap -========= - -Frontswap为交æ?¢é¡µæ??ä¾?äº?ä¸?个 â??transcendent memoryâ?? ç??æ?¥å?£ã??å?¨ä¸?äº?ç?¯å¢?ä¸ï¼?ç?± -äº?交æ?¢é¡µè¢«ä¿?å?å?¨RAMï¼?æ??类似RAMç??设å¤?ï¼?ä¸ï¼?è??ä¸?æ?¯äº¤æ?¢ç£?ç??ï¼?å? æ¤å?¯ä»¥è?·å¾?巨大ç??æ?§è?½ -è??ç??ï¼?æ??é«?ï¼?ã?? - -.. _Transcendent memory in a nutshell: https://lwn.net/Articles/454795/ - -Frontswapä¹?æ??以è¿?ä¹?å?½å??ï¼?æ?¯å? 为å®?å?¯ä»¥è¢«è®¤ä¸ºæ?¯ä¸?swap设å¤?ç??â??backâ??å?å?¨ç?¸å??ã??å? -å?¨å?¨è¢«è®¤ä¸ºæ?¯ä¸?个å??æ¥å¹¶å??å®?å?¨ç??é?¢å??页é?¢ç??â??伪RAM设å¤?â??ï¼?符å??transcendent memory -ï¼?å¦?Xenç??â??tmemâ??ï¼?æ??å??æ ¸å??å??缩å??å?ï¼?å??称â??zcacheâ??ï¼?æ??æ?ªæ?¥ç??类似RAMç??设å¤?ï¼?ç??è¦? -æ±?ï¼?è¿?个伪RAM设å¤?ä¸?è?½è¢«å??æ ¸ç?´æ?¥è®¿é?®æ??寻å??ï¼?å?¶å¤§å°?æ?ªç?¥ä¸?å?¯è?½é??æ?¶é?´å??å??ã??驱å?¨ç¨?åº?é??è¿? -è°?ç?¨frontswap_register_opså°?è?ªå·±ä¸?frontswapé?¾æ?¥èµ·æ?¥ï¼?以é??å½?å?°è®¾ç½®frontswap_ops -ç??å??è?½ï¼?å®?æ??ä¾?ç??å??è?½å¿?须符å??æ??äº?ç?ç?¥ï¼?å¦?ä¸?æ??示: - -ä¸?个 â??initâ?? å°?设å¤?å??å¤?好æ?¥æ?¶ä¸?æ??å®?ç??交æ?¢è®¾å¤?ç¼?å?·ï¼?å??称â??ç±»å??â??ï¼?ç?¸å?³ç??frontswap -交æ?¢é¡µã??ä¸?个 â??storeâ?? å°?æ??该页å¤?å?¶å?°transcendent memoryï¼?并ä¸?该页ç??ç±»å??å??å??移 -é??ç?¸å?³è??ã??ä¸?个 â??loadâ?? å°?æ??该页ï¼?å¦?æ??æ?¾å?°ç??è¯?ï¼?ä»?transcendent memoryå¤?å?¶å?°å??æ ¸ -å??å?ï¼?ä½?ä¸?ä¼?ä»?transcendent memoryä¸å? é?¤è¯¥é¡µã??ä¸?个 â??invalidate_pageâ?? å°?ä»? -transcendent memoryä¸å? é?¤è¯¥é¡µï¼?ä¸?个 â??invalidate_areaâ?? å°?å? é?¤æ??æ??ä¸?交æ?¢ç±»å?? -ç?¸å?³ç??页ï¼?ä¾?å¦?ï¼?å??swapoffï¼?并é??ç?¥ â??deviceâ?? æ??ç»?è¿?ä¸?æ¥å?å?¨è¯¥äº¤æ?¢ç±»å??ã?? - -ä¸?æ?¦ä¸?个页é?¢è¢«æ??å??å?å?¨ï¼?å?¨è¯¥é¡µé?¢ä¸?ç??å?¹é??å? è½½é??常ä¼?æ??å??ã??å? æ¤ï¼?å½?å??æ ¸å??ç?°è?ªå·±å¤?äº?é?? -è¦?交æ?¢é¡µé?¢ç??æ??å?µæ?¶ï¼?å®?é¦?å??å°?è¯?使ç?¨frontswapã??å¦?æ??å?å?¨ç??ç»?æ??æ?¯æ??å??ç??ï¼?é?£ä¹?æ?°æ?®å°±å·² -ç»?æ??å??ç??ä¿?å?å?°äº?transcendent memoryä¸ï¼?并ä¸?é?¿å??äº?ç£?ç??å??å?¥ï¼?å¦?æ??å??æ?¥å??读å??æ?°æ?®ï¼? -ä¹?é?¿å??äº?ç£?ç??读å??ã??å¦?æ??å?å?¨è¿?å??失败ï¼?transcendent memoryå·²ç»?æ??ç»?äº?该æ?°æ?®ï¼?ä¸?该页 -å?¯ä»¥å??å¾?常ä¸?æ ·è¢«å??å?¥äº¤æ?¢ç©ºé?´ã?? - -请注æ??ï¼?å¦?æ??ä¸?个页é?¢è¢«å?å?¨ï¼?è??该页é?¢å·²ç»?å?å?¨äº?transcendent memoryä¸ï¼?ä¸?个 â??é??å¤?â?? -ç??å?å?¨ï¼?ï¼?è¦?ä¹?å?å?¨æ??å??ï¼?æ?°æ?®è¢«è¦?ç??ï¼?è¦?ä¹?å?å?¨å¤±è´¥ï¼?该页é?¢è¢«åº?æ¢ã??è¿?ç¡®ä¿?äº?æ?§ç??æ?°æ?®æ°¸è¿? -ä¸?ä¼?ä»?frontswapä¸è?·å¾?ã?? - -å¦?æ??é??ç½®æ£ç¡®ï¼?对frontswapç??ç??æ?§æ?¯é??è¿? `/sys/kernel/debug/frontswap` ç?®å½?ä¸?ç?? -debugfså®?æ??ç??ã??frontswapç??æ??æ??æ?§å?¯ä»¥é??è¿?以ä¸?æ?¹å¼?æµ?é??ï¼?å?¨æ??æ??交æ?¢è®¾å¤?ä¸ï¼?: - -``failed_stores`` - æ??å¤?å°?次å?å?¨ç??å°?è¯?æ?¯å¤±è´¥ç?? - -``loads`` - å°?è¯?äº?å¤?å°?次å? è½½ï¼?åº?该å?¨é?¨æ??å??ï¼? - -``succ_stores`` - æ??å¤?å°?次å?å?¨ç??å°?è¯?æ?¯æ??å??ç?? - -``invalidates`` - å°?è¯?äº?å¤?å°?次ä½?åº? - -å??å?°å®?ç?°å?¯ä»¥æ??ä¾?é¢?å¤?ç??æ??æ ?ã?? - -ç»?常é?®å?°ç??é?®é¢? -============== - -* ä»·å?¼å?¨å?ªé??? - -å½?ä¸?个工ä½?è´?è½½å¼?å§?交æ?¢æ?¶ï¼?æ?§è?½å°±ä¼?ä¸?é??ã??Frontswapé??è¿?æ??ä¾?ä¸?个干å??ç??ã??å?¨æ??ç??æ?¥å?£æ?¥ -读å??å??å??å?¥äº¤æ?¢é¡µå?° â??transcendent memoryâ??ï¼?ä»?è??大大å¢?å? äº?许å¤?è¿?æ ·ç??å·¥ä½?è´?è½½ç??æ?§ -è?½ï¼?å?¦å??å??æ ¸æ?¯æ? æ³?ç?´æ?¥å¯»å??ç??ã??å½?æ?°æ?®è¢«è½¬æ?¢ä¸ºä¸?å??ç??å½¢å¼?å??大å°?ï¼?æ¯?å¦?å??缩ï¼?æ??è??被ç§?å¯? -移å?¨ï¼?对äº?ä¸?äº?类似RAMç??设å¤?æ?¥è¯´ï¼?è¿?å?¯è?½å¯¹å??平衡å¾?æ??ç?¨ï¼?æ?¶ï¼?è¿?个æ?¥å?£æ?¯ç??æ?³ç??ã??交æ?¢ -页ï¼?å??被驱é??ç??页é?¢ç¼?å?页ï¼?æ?¯è¿?ç§?æ¯?RAMæ?¢ä½?æ¯?ç£?ç??å¿«å¾?å¤?ç??â??伪RAM设å¤?â??ç??ä¸?大ç?¨é??ã?? - -Frontswap对å??æ ¸ç??å½±å??ç?¸å½?å°?ï¼?为å??ç§?ç³»ç»?é??ç½®ä¸æ?´å?¨æ??ã??æ?´ç?µæ´»ç??RAMå?©ç?¨æ??ä¾?äº?巨大ç?? -ç?µæ´»æ?§ï¼? - -å?¨å??ä¸?å??æ ¸ç??æ??å?µä¸?ï¼?å??称â??zcacheâ??ï¼?页é?¢è¢«å??缩并å?å?¨å?¨æ?¬å?°å??å?ä¸ï¼?ä»?è??å¢?å? äº?å?¯ä»¥å®? -å?¨ä¿?å?å?¨RAMä¸ç??å?¿å??页é?¢æ?»æ?°ã??Zcacheæ?¬è´¨ä¸?æ?¯ç?¨å??缩/解å??缩ç??CPUå?¨æ??æ?¢å??æ?´å¥½ç??å??å?å?© -ç?¨ç??ã??Benchmarksæµ?è¯?æ?¾ç¤ºï¼?å½?å??å?å??å??è¾?ä½?æ?¶ï¼?å? ä¹?没æ??å½±å??ï¼?è??å?¨é«?å??å?å??å??ä¸?ç??ä¸?äº? -å·¥ä½?è´?è½½ä¸?ï¼?å??æ??æ??æ?¾ç??æ?§è?½æ?¹å??ï¼?25%以ä¸?ï¼?ã?? - -â??RAMsterâ?? å?¨zcacheç??å?ºç¡?ä¸?å¢?å? äº?对é??群系ç»?ç?? â??peer-to-peerâ?? transcendent memory -ç??æ?¯æ??ã??Frontswap页é?¢å??zcacheä¸?æ ·è¢«æ?¬å?°å??缩ï¼?ä½?é??å??被â??remotifiedâ?? å?°å?¦ä¸?个系 -ç»?ç??RAMã??è¿?使å¾?RAMå?¯ä»¥æ ¹æ?®é??è¦?å?¨æ??å?°æ?¥å??è´?载平衡ï¼?ä¹?å°±æ?¯è¯´ï¼?å½?ç³»ç»?Aè¶?è½½æ?¶ï¼?å®?å?¯ä»¥ -交æ?¢å?°ç³»ç»?Bï¼?å??ä¹?亦ç?¶ã??RAMsterä¹?å?¯ä»¥è¢«é??ç½®æ??ä¸?个å??å?æ??å?¡å?¨ï¼?å? æ¤é??群ä¸ç??许å¤?æ??å?¡å?¨ -å?¯ä»¥æ ¹æ?®é??è¦?å?¨æ??å?°äº¤æ?¢å?°é??ç½®æ??大é??å??å?ç??å??ä¸?æ??å?¡å?¨ä¸?......è??ä¸?é??è¦?é¢?å??é??ç½®æ¯?个客æ?· -æ??å¤?å°?å??å?å?¯ç?¨ - -å?¨è??æ??æ??å?µä¸?ï¼?è??æ??å??ç??å?¨é?¨æ??ä¹?å?¨äº?ç»?计å?°å°?ç?©ç??èµ?æº?å?¨å¤?个è??æ??æ?ºç??ä¸?å??é??æ±?ä¹?é?´è¿?è¡?å¤? -ç?¨ã??对äº?RAMæ?¥è¯´ï¼?è¿?ç??ç??å¾?é?¾å??å?°ï¼?è??ä¸?å?¨ä¸?æ?¹å??å??æ ¸ç??æ??å?µä¸?ï¼?è¦?å??好è¿?ä¸?ç?¹ç??å?ªå??å?ºæ?¬ä¸? -æ?¯å¤±è´¥ç??ï¼?é?¤äº?ä¸?äº?广为人ç?¥ç??ç?¹æ®?æ??å?µä¸?ç??å·¥ä½?è´?è½½ï¼?ã??å?·ä½?æ?¥è¯´ï¼?Xen Transcendent Memory -å??端å??许管ç??å?¨æ?¥æ??ç??RAM â??fallowâ??ï¼?ä¸?ä»?å?¯ä»¥å?¨å¤?个è??æ??æ?ºä¹?é?´è¿?è¡?â??time-sharedâ??ï¼? -è??ä¸?页é?¢å?¯ä»¥è¢«å??缩å??é??å¤?å?©ç?¨ï¼?以ä¼?å??RAMç??å?©ç?¨ç??ã??å½?客æ?·æ??ä½?ç³»ç»?被诱导交å?ºæ?ªå??å??å?©ç?¨ -ç??RAMæ?¶ï¼?å¦? â??selfballooningâ??ï¼?ï¼?çª?ç?¶å?ºç?°ç??æ??å¤?å??å?å??å??å?¯è?½ä¼?导è?´äº¤æ?¢ï¼?frontswap -å??许è¿?äº?页é?¢è¢«äº¤æ?¢å?°ç®¡ç??å?¨RAMä¸æ??ä»?管ç??å?¨RAMä¸äº¤æ?¢ï¼?å¦?æ??æ?´ä½?主æ?ºç³»ç»?å??å?æ?¡ä»¶å??许ï¼?ï¼? -ä»?è??å??轻计å??å¤?交æ?¢å?¯è?½å¸¦æ?¥ç??å?¯æ??ç??æ?§è?½å½±å??ã?? - -ä¸?个KVMç??å®?ç?°æ£å?¨è¿?è¡?ä¸ï¼?并ä¸?å·²ç»?被RFC'edå?°lkmlã??è??ä¸?ï¼?å?©ç?¨frontswapï¼?对NVMä½?为 -å??å?æ?©å±?æ??æ?¯ç??è°?æ?¥ä¹?å?¨è¿?è¡?ä¸ã?? - -* å½?ç?¶ï¼?å?¨æ??äº?æ??å?µä¸?å?¯è?½æ??æ?§è?½ä¸?ç??ä¼?å?¿ï¼?ä½?frontswapç??空é?´/æ?¶é?´å¼?é??æ?¯å¤?å°?ï¼? - -å¦?æ?? CONFIG_FRONTSWAP 被ç¦?ç?¨ï¼?æ¯?个 frontswap é?©å?é?½ä¼?ç¼?è¯?æ??空ï¼?å?¯ä¸?ç??å¼?é??æ?¯æ¯? -个 swapon'ed swap 设å¤?ç??å? 个é¢?å¤?å?è??ã??å¦?æ?? CONFIG_FRONTSWAP 被å?¯ç?¨ï¼?ä½?没æ?? -frontswapç?? â??backendâ?? å¯?å?å?¨ï¼?æ¯?读æ??å??ä¸?个交æ?¢é¡µå°±ä¼?æ??ä¸?个é¢?å¤?ç??å?¨å±?å??é??ï¼?è??ä¸? -æ?¯é?¶ã??å¦?æ?? CONFIG_FRONTSWAP 被å?¯ç?¨ï¼?并ä¸?æ??ä¸?个frontswapç??backendå¯?å?å?¨ï¼?并ä¸? -å??端æ¯?次 â??storeâ?? 请æ±?é?½å¤±è´¥ï¼?å?³å°½ç®¡å£°ç§°å?¯è?½ï¼?ä½?没æ??æ??ä¾?å??å?ï¼?ï¼?CPU ç??å¼?é??ä»?ç?¶å?¯ä»¥ -忽ç?¥ä¸?计 - å? 为æ¯?次frontswap失败é?½æ?¯å?¨äº¤æ?¢é¡µå??å?°ç£?ç??ä¹?å??ï¼?ç³»ç»?å¾?å?¯è?½æ?¯ I/O ç»?å®? -ç??ï¼?æ? 论å¦?ä½?使ç?¨ä¸?å°?é?¨å??ç?? CPU é?½æ?¯ä¸?ç?¸å?³ç??ã?? - -è?³äº?空é?´ï¼?å¦?æ??CONFIG_FRONTSWAP被å?¯ç?¨ï¼?并ä¸?æ??ä¸?个frontswapç??backend注å??ï¼?é?£ä¹? -æ¯?个交æ?¢è®¾å¤?ç??æ¯?个交æ?¢é¡µé?½ä¼?被å??é??ä¸?个æ¯?ç?¹ã??è¿?æ?¯å?¨å??æ ¸å·²ç»?为æ¯?个交æ?¢è®¾å¤?ç??æ¯?个交æ?¢ -页å??é??ç??8ä½?ï¼?å?¨2.6.34ä¹?å??æ?¯16ä½?ï¼?ä¸?å¢?å? ç??ã??(Hugh Dickinsè§?å¯?å?°ï¼?frontswapå?¯è?½ -ä¼?å?·å??ç?°æ??ç??8个æ¯?ç?¹ï¼?ä½?æ?¯æ??们以å??å??æ?¥æ??å¿?è¿?个å°?ç??ä¼?å??é?®é¢?)ã??对äº?æ ?å??ç??4K页é?¢å¤§å°?ç?? -é??常大ç??交æ?¢ç??ï¼?è¿?å¾?ç½?è§?ï¼?ï¼?è¿?æ?¯æ¯?32GB交æ?¢ç??1MBå¼?é??ã?? - -å½?交æ?¢é¡µå?å?¨å?¨transcendent memoryä¸è??ä¸?æ?¯å??å?°ç£?ç??ä¸?æ?¶ï¼?æ??ä¸?个å?¯ä½?ç?¨ï¼?å?³è¿?å?¯è?½ä¼? -产ç??æ?´å¤?ç??å??å?å??å??ï¼?æ??å?¯è?½è¶?è¿?å?¶ä»?ç??ä¼?ç?¹ã??ä¸?个backendï¼?æ¯?å¦?zcacheï¼?å¿?é¡»å®?ç?°ç?ç?¥ -æ?¥ä»?ç»?ï¼?ä½?å?¨æ??å?°ï¼?管ç??å??å?é??å?¶ï¼?以确ä¿?è¿?ç§?æ??å?µä¸?ä¼?å??ç??ã?? - -* 好å?§ï¼?é?£å°±ç?¨å??æ ¸éª?客è?½ç??解ç??æ?¯è¯æ?¥å¿«é??æ¦?è¿°ä¸?ä¸?è¿?个frontswapè¡¥ä¸?ç??ä½?ç?¨å¦?ä½?ï¼? - -æ??们å??设å?¨å??æ ¸å??å§?å??è¿?ç¨?ä¸ï¼?ä¸?个frontswap ç?? â??backendâ?? å·²ç»?注å??äº?ï¼?è¿?个注å??表 -æ??è¿?个frontswap ç?? â??backendâ?? å?¯ä»¥è®¿é?®ä¸?äº?ä¸?被å??æ ¸ç?´æ?¥è®¿é?®ç??â??å??å?â??ã??å®?å?°åº?æ?? -ä¾?äº?å¤?å°?å??å?æ?¯å®?å?¨å?¨æ??å??é??æ?ºç??ã?? - -æ¯?å½?ä¸?个交æ?¢è®¾å¤?被交æ?¢æ?¶ï¼?å°±ä¼?è°?ç?¨frontswap_init()ï¼?æ??交æ?¢è®¾å¤?ç??ç¼?å?·ï¼?å??称â??ç±» -å??â??ï¼?ä½?为ä¸?个å??æ?°ä¼ ç»?å®?ã??è¿?å°±é??ç?¥äº?frontswapï¼?以æ??å¾? â??storeâ?? ä¸?该å?·ç ?ç?¸å?³ç??交 -æ?¢é¡µç??å°?è¯?ã?? - -æ¯?å½?交æ?¢å?ç³»ç»?å??å¤?å°?ä¸?个页é?¢å??å?¥äº¤æ?¢è®¾å¤?æ?¶ï¼?å??è§?swap_writepage()ï¼?ï¼?å°±ä¼?è°?ç?¨ -frontswap_storeã??Frontswapä¸?frontswap backendå??å??ï¼?å¦?æ??backend说å®?没æ??空 -é?´ï¼?frontswap_storeè¿?å??-1ï¼?å??æ ¸å°±ä¼?ç?§å¸¸æ??页æ?¢å?°äº¤æ?¢è®¾å¤?ä¸?ã??注æ??ï¼?æ?¥è?ªfrontswap -backendç??å??åº?对å??æ ¸æ?¥è¯´æ?¯ä¸?å?¯é¢?æµ?ç??ï¼?å®?å?¯è?½é??æ?©ä»?ä¸?æ?¥å??ä¸?个页é?¢ï¼?å?¯è?½æ?¥å??æ¯?ä¹?个 -页é?¢ï¼?ä¹?å?¯è?½æ?¥å??æ¯?ä¸?个页é?¢ã??ä½?æ?¯å¦?æ??backendç¡®å®?æ?¥å??äº?ä¸?个页é?¢ï¼?é?£ä¹?è¿?个页é?¢ç??æ?° -æ?®å·²ç»?被å¤?å?¶å¹¶ä¸?ç±»å??å??å??移é??ç?¸å?³è??äº?ï¼?è??ä¸?backendä¿?è¯?äº?æ?°æ?®ç??æ??ä¹?æ?§ã??å?¨è¿?ç§?æ??å?µ -ä¸?ï¼?frontswapå?¨äº¤æ?¢è®¾å¤?ç??â??frontswap_mapâ?? ä¸è®¾ç½®äº?ä¸?个ä½?ï¼?对åº?äº?交æ?¢è®¾å¤?ä¸?ç?? -页é?¢å??移é??ï¼?å?¦å??å®?å°±ä¼?å°?æ?°æ?®å??å?¥è¯¥è®¾å¤?ã?? - -å½?交æ?¢å?ç³»ç»?é??è¦?交æ?¢ä¸?个页é?¢æ?¶ï¼?swap_readpage()ï¼?ï¼?å®?é¦?å??è°?ç?¨frontswap_load()ï¼? -æ£?æ?¥frontswap_mapï¼?ç??è¿?个页é?¢æ?¯å?¦æ?©å??被frontswap backendæ?¥å??ã??å¦?æ??æ?¯ï¼?该页 -ç??æ?°æ?®å°±ä¼?ä»?frontswapå??端填å??ï¼?æ?¢å?¥å°±å®?æ??äº?ã??å¦?æ??ä¸?æ?¯ï¼?æ£å¸¸ç??交æ?¢ä»£ç ?å°?被æ?§è¡?ï¼? -以便ä»?ç??æ£ç??交æ?¢è®¾å¤?ä¸?è?·å¾?è¿?ä¸?页ç??æ?°æ?®ã?? - -æ??以æ¯?次frontswap backendæ?¥å??ä¸?个页é?¢æ?¶ï¼?交æ?¢è®¾å¤?ç??读å??å??ï¼?å?¯è?½ï¼?交æ?¢è®¾å¤?ç??å?? -å?¥é?½è¢« â??frontswap backend storeâ?? å??ï¼?å?¯è?½ï¼?â??frontswap backend loadsâ?? -æ??å??代ï¼?è¿?å?¯è?½ä¼?å¿«å¾?å¤?ã?? - -* frontswapä¸?è?½è¢«é??置为ä¸?个 â??ç?¹æ®?ç??â?? 交æ?¢è®¾å¤?ï¼?å®?ç??ä¼?å??级è¦?é«?äº?ä»»ä½?ç??æ£ç??交æ?¢ - 设å¤?ï¼?ä¾?å¦?å??zswapï¼?æ??è??å?¯è?½æ?¯swap-over-nbd/NFSï¼?ï¼? - -é¦?å??ï¼?ç?°æ??ç??交æ?¢å?ç³»ç»?ä¸?å??许æ??ä»»ä½?ç§?ç±»ç??交æ?¢å±?次ç»?æ??ã??ä¹?许å®?å?¯ä»¥è¢«é??å??以é??åº?å±?次 -ç»?æ??ï¼?ä½?è¿?å°?é??è¦?ç?¸å½?大ç??æ?¹å??ã??å?³ä½¿å®?被é??å??ï¼?ç?°æ??ç??交æ?¢å?ç³»ç»?ä¹?使ç?¨äº?å??I/Oå±?ï¼?å®? -å??å®?交æ?¢è®¾å¤?æ?¯å?ºå®?大å°?ç??ï¼?å?¶ä¸ç??ä»»ä½?页é?¢é?½æ?¯å?¯çº¿æ?§å¯»å??ç??ã??Frontswapå? ä¹?没æ??触 -å??ç?°æ??ç??交æ?¢å?ç³»ç»?ï¼?è??æ?¯å?´ç»?ç??å??I/Oå?ç³»ç»?ç??é??å?¶ï¼?æ??ä¾?äº?大é??ç??ç?µæ´»æ?§å??å?¨æ??æ?§ã?? - -ä¾?å¦?ï¼?frontswap backend对任ä½?交æ?¢é¡µç??æ?¥å??æ?¯å®?å?¨ä¸?å?¯é¢?æµ?ç??ã??è¿?对frontswap backend -ç??å®?ä¹?è?³å?³é??è¦?ï¼?å? 为å®?èµ?äº?äº?backendå®?å?¨å?¨æ??ç??å?³å®?æ??ã??å?¨zcacheä¸ï¼?人们æ? æ³?é¢? -å??ç?¥é??ä¸?个页é?¢ç??å?¯å??缩æ?§å¦?ä½?ã??å?¯å??缩æ?§ â??å·®â?? ç??页é?¢ä¼?被æ??ç»?ï¼?è?? â??å·®â?? æ?¬èº«ä¹?å?¯ -ä»¥æ ¹æ?®å½?å??ç??å??å?é??å?¶å?¨æ??å?°å®?ä¹?ã?? - -æ¤å¤?ï¼?frontswapæ?¯å®?å?¨å??æ¥ç??ï¼?è??ç??æ£ç??交æ?¢è®¾å¤?ï¼?æ ¹æ?®å®?ä¹?ï¼?æ?¯å¼?æ¥ç??ï¼?并ä¸?使ç?¨ -å??I/Oã??å??I/Oå±?ä¸?ä»?æ?¯ä¸?å¿?è¦?ç??ï¼?è??ä¸?å?¯è?½è¿?è¡? â??ä¼?å??â??ï¼?è¿?对é?¢å??RAMç??设å¤?æ?¥è¯´æ?¯ -ä¸?å??é??ç??ï¼?å??æ?¬å°?ä¸?äº?页é?¢ç??å??å?¥å»¶è¿?ç?¸å½?é?¿ç??æ?¶é?´ã??å??æ¥æ?¯å¿?é¡»ç??ï¼?以确ä¿?å??端ç??å?¨ -æ??æ?§ï¼?并é?¿å??æ£?æ??ç??ç«?äº?æ?¡ä»¶ï¼?è¿?å°?ä¸?å¿?è¦?å?°å¤§å¤§å¢?å? frontswapå??/æ??å??I/Oå?ç³»ç»?ç?? -å¤?æ??æ?§ã??ä¹?å°±æ?¯è¯´ï¼?å?ªæ??æ??å??ç?? â??storeâ?? å?? â??loadâ?? æ??ä½?æ?¯é??è¦?å??æ¥ç??ã??ä¸?个ç?¬ç«? -ç??å¼?æ¥çº¿ç¨?å?¯ä»¥è?ªç?±å?°æ??ä½?ç?±frontswapå?å?¨ç??页é?¢ã??ä¾?å¦?ï¼?RAMsterä¸ç?? â??remotificationâ?? -线ç¨?使ç?¨æ ?å??ç??å¼?æ¥å??æ ¸å¥?æ?¥å?ï¼?å°?å??缩ç??frontswap页é?¢ç§»å?¨å?°è¿?ç¨?æ?ºå?¨ã??å??æ ·ï¼? -KVMç??客æ?·æ?¹å®?ç?°å?¯ä»¥è¿?è¡?客æ?·å??å??缩ï¼?并使ç?¨ â??batchedâ?? hypercallsã?? - -å?¨è??æ??å??ç?¯å¢?ä¸ï¼?å?¨æ??æ?§å??许管ç??ç¨?åº?ï¼?æ??主æ?ºæ??ä½?ç³»ç»?ï¼?å??â??intelligent overcommitâ??ã?? -ä¾?å¦?ï¼?å®?å?¯ä»¥é??æ?©å?ªæ?¥å??页é?¢ï¼?ç?´å?°ä¸»æ?ºäº¤æ?¢å?¯è?½å?³å°?å??ç??ï¼?ç?¶å??强迫客æ?·æ?ºå??ä»?们 -è?ªå·±ç??交æ?¢ã?? - -transcendent memoryè§?æ ¼ç??frontswapæ??ä¸?个å??å¤?ã??å? 为任ä½? â??storeâ?? é?½å?¯ -è?½å¤±è´¥ï¼?æ??以å¿?é¡»å?¨ä¸?个ç??æ£ç??交æ?¢è®¾å¤?ä¸?æ??ä¸?个ç??æ£ç??æ??槽æ?¥äº¤æ?¢é¡µé?¢ã??å? æ¤ï¼? -frontswapå¿?é¡»ä½?为æ¯?个交æ?¢è®¾å¤?ç?? â??å½±å?â?? æ?¥å®?ç?°ï¼?å®?æ??å?¯è?½å®¹çº³äº¤æ?¢è®¾å¤?å?¯è?½ -容纳ç??æ¯?ä¸?个页é?¢ï¼?ä¹?æ??å?¯è?½æ ¹æ?¬ä¸?容纳任ä½?页é?¢ã??è¿?æ??å?³ç??frontswapä¸?è?½å??å?«æ¯? -swap设å¤?æ?»æ?°æ?´å¤?ç??页é?¢ã??ä¾?å¦?ï¼?å¦?æ??å?¨æ??äº?å®?è£?ä¸?没æ??é??置交æ?¢è®¾å¤?ï¼?frontswap -就没æ??ç?¨ã??æ? 交æ?¢è®¾å¤?ç??便æ?ºå¼?设å¤?ä»?ç?¶å?¯ä»¥ä½¿ç?¨frontswapï¼?ä½?æ?¯è¿?ç§?设å¤?ç?? -backendå¿?é¡»é??ç½®æ??ç§? â??ghostâ?? 交æ?¢è®¾å¤?ï¼?并确ä¿?å®?æ°¸è¿?ä¸?ä¼?被使ç?¨ã?? - - -* 为ä»?ä¹?ä¼?æ??è¿?ç§?å?³äº? â??é??å¤?å?å?¨â?? ç??å¥?æ?ªå®?ä¹?ï¼?å¦?æ??ä¸?个页é?¢ä»¥å??被æ??å??å?°å?å?¨è¿?ï¼? - é?¾é??å®?ä¸?è?½æ?»æ?¯è¢«æ??å??å?°è¦?ç??å??ï¼? - -å? ä¹?æ?»æ?¯å?¯ä»¥ç??ï¼?ä¸?ï¼?æ??æ?¶ä¸?è?½ã??è??è??ä¸?个ä¾?å?ï¼?æ?°æ?®è¢«å??缩äº?ï¼?å??æ?¥ç??4K页é?¢è¢«å?? -缩å?°äº?1Kã??ç?°å?¨ï¼?æ??人è¯?å?¾ç?¨ä¸?å?¯å??缩ç??æ?°æ?®è¦?ç??该页ï¼?å? æ¤ä¼?å? ç?¨æ?´ä¸ª4Kã??ä½?æ?¯ -backend没æ??æ?´å¤?ç??空é?´äº?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?è¿?个å?å?¨å¿?须被æ??ç»?ã??æ¯?å½?frontswap -æ??ç»?ä¸?个ä¼?è¦?ç??ç??å?å?¨æ?¶ï¼?å®?ä¹?å¿?须使æ?§ç??æ?°æ?®ä½?åº?ï¼?并确ä¿?å®?ä¸?å??被访é?®ã??å? 为交 -æ?¢å?ç³»ç»?ä¼?æ??æ?°ç??æ?°æ?®å??å?°è¯»äº¤æ?¢è®¾å¤?ä¸?ï¼?è¿?æ?¯ç¡®ä¿?ä¸?è?´æ?§ç??æ£ç¡®å??æ³?ã?? - -* 为ä»?ä¹?frontswapè¡¥ä¸?ä¼?å??建æ?°ç??头æ??件swapfile.hï¼? - -frontswap代ç ?ä¾?èµ?äº?ä¸?äº?swapå?ç³»ç»?å??é?¨ç??æ?°æ?®ç»?æ??ï¼?è¿?äº?æ?°æ?®ç»?æ??å¤?å¹´æ?¥ä¸?ç?´ -å?¨é??æ??å??å?¨å±?ä¹?é?´æ?¥å??移å?¨ã??è¿?ä¼¼ä¹?æ?¯ä¸?个å??ç??ç??妥å??ï¼?å°?å®?们å®?ä¹?为å?¨å±?ï¼?ä½?å?¨ä¸? -个æ?°ç??å??å?«æ??件ä¸å£°æ??å®?们ï¼?该æ??件ä¸?被å??å?«swap.hç??大é??æº?æ??件æ??å??å?«ã?? - -Dan Magenheimerï¼?æ??å??æ?´æ?°äº?2012å¹´4æ??9æ?¥ --- a/Documentation/translations/zh_CN/vm/highmem.rst +++ /dev/null @@ -1,128 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/highmem.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - -========== -é«?å??å?å¤?ç?? -========== - -ä½?è??: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx> - -.. contents:: :local: - -é«?å??å?æ?¯ä»?ä¹?ï¼? -============== - -å½?ç?©ç??å??å?ç??大å°?æ?¥è¿?æ??è¶?è¿?è??æ??å??å?ç??æ??大大å°?æ?¶ï¼?å°±ä¼?使ç?¨é«?å??å?ï¼?highmemï¼?ã??å?¨è¿?ä¸?ç?¹ä¸?ï¼?å?? -æ ¸ä¸?å?¯è?½å?¨ä»»ä½?æ?¶å??é?½ä¿?æ??æ??æ??å?¯ç?¨ç??ç?©ç??å??å?ç??æ? å°?ã??è¿?æ??å?³ç??å??æ ¸é??è¦?å¼?å§?使ç?¨å®?æ?³è®¿é?®ç??ç?©ç??å?? -å?ç??临æ?¶æ? å°?ã?? - -没æ??被永ä¹?æ? å°?è¦?ç??ç??é?£é?¨å??ï¼?ç?©ç??ï¼?å??å?å°±æ?¯æ??们æ??说ç?? "é«?å??å?"ã??对äº?è¿?个边ç??ç??ç¡®å??ä½?ç½®ï¼?æ?? -å??ç§?æ?¶æ??ä¸?ç??é??å?¶ã?? - -ä¾?å¦?ï¼?å?¨i386æ?¶æ??ä¸ï¼?æ??们é??æ?©å°?å??æ ¸æ? å°?å?°æ¯?个è¿?ç¨?ç??è??æ??空é?´ï¼?è¿?æ ·æ??们就ä¸?å¿?为å??æ ¸ç??è¿?å?¥/é?? -å?ºä»?å?ºå?¨é?¨ç??TLBä½?åº?代价ã??è¿?æ??å?³ç??å?¯ç?¨ç??è??æ??å??å?空é?´ï¼?i386ä¸?为4GiBï¼?å¿?é¡»å?¨ç?¨æ?·å??å??æ ¸ç©ºé?´ä¹? -é?´è¿?è¡?å??å??ã?? - -使ç?¨è¿?ç§?æ?¹æ³?ç??æ?¶æ??ç??ä¼ ç»?å??é??æ?¹å¼?æ?¯3:1ï¼?3GiBç?¨äº?ç?¨æ?·ç©ºé?´ï¼?顶é?¨ç??1GiBç?¨äº?å??æ ¸ç©ºé?´ã??:: - - +--------+ 0xffffffff - | Kernel | - +--------+ 0xc0000000 - | | - | User | - | | - +--------+ 0x00000000 - -è¿?æ??å?³ç??å??æ ¸å?¨ä»»ä½?æ?¶å??æ??å¤?å?¯ä»¥æ? å°?1GiBç??ç?©ç??å??å?ï¼?ä½?æ?¯ç?±äº?æ??们é??è¦?è??æ??å?°å??空é?´æ?¥å??å?¶ä»?äº? -æ??--å??æ?¬è®¿é?®å?¶ä½?ç?©ç??å??å?ç??临æ?¶æ? å°?--å®?é??ç??ç?´æ?¥æ? å°?é??常ä¼?æ?´å°?ï¼?é??常å?¨~896MiBå·¦å?³ï¼?ã?? - -å?¶ä»?æ??mmä¸?ä¸?æ??æ ?ç¾ç??TLBç??æ?¶æ??å?¯ä»¥æ??ç?¬ç«?ç??å??æ ¸å??ç?¨æ?·æ? å°?ã??ç?¶è??ï¼?ä¸?äº?硬件ï¼?å¦?ä¸?äº?ARMï¼?å?¨ä½¿ -ç?¨mmä¸?ä¸?æ??æ ?ç¾æ?¶ï¼?å?¶è??æ??空é?´æ??é??ã?? - - -临æ?¶è??æ??æ? å°? -============ - -å??æ ¸å??å?«å? ç§?å??建临æ?¶æ? å°?ç??æ?¹æ³?ã??: - -* vmap(). è¿?å?¯ä»¥ç?¨æ?¥å°?å¤?个ç?©ç??页é?¿æ??æ? å°?å?°ä¸?个è¿?ç»ç??è??æ??空é?´ã??å®?é??è¦?synchronization - æ?¥è§£é?¤æ? å°?ã?? - -* kmap(). è¿?å??许对å??个页é?¢è¿?è¡?ç?æ??æ? å°?ã??å®?é??è¦?synchronizationï¼?ä½?å?¨ä¸?å®?ç¨?度ä¸?被æ??é??ã?? - å½?以åµ?å¥?æ?¹å¼?使ç?¨æ?¶ï¼?å®?ä¹?å¾?容æ??å?ºç?°æ»é??ï¼?å? æ¤ä¸?建议å?¨æ?°ä»£ç ?ä¸ä½¿ç?¨å®?ã?? - -* kmap_atomic(). è¿?å??许对å??个页é?¢è¿?è¡?é??常ç?ç??æ?¶é?´æ? å°?ã??ç?±äº?æ? å°?被é??å?¶å?¨å??å¸?å®?ç??CPUä¸?ï¼? - å®?表ç?°å¾?å¾?好ï¼?ä½?å??å¸?ä»»å?¡å? æ¤è¢«è¦?æ±?ç??å?¨è¯¥CPUä¸?ç?´å?°å®?å®?æ??ï¼?以å??å?¶ä»?ä»»å?¡å??代å®?ç??æ? å°?ã?? - - kmap_atomic() ä¹?å?¯ä»¥ç?±ä¸æ?ä¸?ä¸?æ??使ç?¨ï¼?å? 为å®?ä¸?ç?¡ç? ï¼?è??ä¸?è°?ç?¨è??å?¯è?½å?¨è°?ç?¨kunmap_atomic() - ä¹?å??æ??ç?¡ç? ã?? - - å?¯ä»¥å??设k[un]map_atomic()ä¸?ä¼?失败ã?? - - -使ç?¨kmap_atomic -=============== - -ä½?æ?¶ä½?å?°ä½¿ç?¨ kmap_atomic() æ?¯å¾?ç?´æ?¥ç??ã??å½?代ç ?æ?³è¦?访é?®ä¸?个å?¯è?½ä»?é«?å??å?ï¼?è§?__GFP_HIGHMEMï¼? -å??é??ç??页é?¢ç??å??容æ?¶ï¼?ä¾?å¦?å?¨é¡µç¼?å?ä¸ç??页é?¢ï¼?å°±ä¼?使ç?¨å®?ã??该APIæ??两个å?½æ?°ï¼?å®?们ç??使ç?¨æ?¹å¼?ä¸? -ä¸?é?¢ç±»ä¼¼:: - - /* æ?¾å?°æ??å?´è¶£ç??页é?¢ã?? */ - struct page *page = find_get_page(mapping, offset); - - /* è?·å¾?对该页å??容ç??访é?®æ??ã?? */ - void *vaddr = kmap_atomic(page); - - /* 对该页ç??å??容å??ä¸?äº?å¤?ç??ã?? */ - memset(vaddr, 0, PAGE_SIZE); - - /* 解é?¤è¯¥é¡µé?¢ç??æ? å°?ã?? */ - kunmap_atomic(vaddr); - -注æ??ï¼?kunmap_atomic()è°?ç?¨ç??æ?¯kmap_atomic()è°?ç?¨ç??ç»?æ??è??ä¸?æ?¯å??æ?°ã?? - -å¦?æ??ä½ é??è¦?æ? å°?两个页é?¢ï¼?å? ä¸ºä½ æ?³ä»?ä¸?个页é?¢å¤?å?¶å?°å?¦ä¸?个页é?¢ï¼?ä½ é??è¦?ä¿?æ??kmap_atomicè°?ç?¨ä¸¥ -æ ¼åµ?å¥?ï¼?å¦?:: - - vaddr1 = kmap_atomic(page1); - vaddr2 = kmap_atomic(page2); - - memcpy(vaddr1, vaddr2, PAGE_SIZE); - - kunmap_atomic(vaddr2); - kunmap_atomic(vaddr1); - - -临æ?¶æ? å°?ç??æ??æ?¬ -============== - -å??建临æ?¶æ? å°?ç??代价å?¯è?½ç?¸å½?é«?ã??ä½?ç³»æ?¶æ??å¿?é¡»æ??ä½?å??æ ¸ç??页表ã??æ?°æ?®TLBå??/æ??MMUç??å¯?å?å?¨ã?? - -å¦?æ??CONFIG_HIGHMEM没æ??被设置ï¼?é?£ä¹?å??æ ¸ä¼?å°?è¯?ç?¨ä¸?ç?¹è®¡ç®?æ?¥å??建æ? å°?ï¼?å°?页é?¢ç»?æ??å?°å??转æ?¢æ?? -æ??å??页é?¢å??容ç??æ??é??ï¼?è??ä¸?æ?¯å?»æ?£é¼?æ? å°?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?解æ? å°?æ??ä½?å?¯è?½æ?¯ä¸?个空æ??ä½?ã?? - -å¦?æ??CONFIG_MMU没æ??被设置ï¼?é?£ä¹?å°±ä¸?å?¯è?½æ??临æ?¶æ? å°?å??é«?å??å?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?ä¹?å°?使ç?¨è®¡ç®?æ?¹æ³?ã?? - - -i386 PAE -======== - -å?¨æ??äº?æ??å?µä¸?ï¼?i386 æ?¶æ??å°?å??è®¸ä½ å?¨ 32 ä½?æ?ºå?¨ä¸?å®?è£?å¤?è¾¾ 64GiB ç??å??å?ã??ä½?è¿?æ??ä¸?äº?å??æ??: - -* Linuxé??è¦?为系ç»?ä¸ç??æ¯?个页é?¢å»ºç«?ä¸?个页帧ç»?æ??ï¼?è??ä¸?页帧é??è¦?é©»å?¨æ°¸ä¹?æ? å°?ä¸ï¼?è¿?æ??å?³ç??ï¼? - -* ä½ æ??å¤?å?¯ä»¥æ??896M/sizeof(struct page)页帧ï¼?ç?±äº?页ç»?æ??ä½?æ?¯32å?è??ç??ï¼?æ??以æ??ç»?ä¼?æ?? - 112Gç??页ï¼?ç?¶è??ï¼?å??æ ¸é??è¦?å?¨å??å?ä¸å?å?¨æ?´å¤?ç??页帧...... - -* PAEä½¿ä½ ç??页表å??大--è¿?使系ç»?å??æ?¢ï¼?å? 为æ?´å¤?ç??æ?°æ?®é??è¦?å?¨TLBå¡«å??ç?æ?¹é?¢è¢«è®¿é?®ã??ä¸?个好å¤? - æ?¯ï¼?PAEæ??æ?´å¤?ç??PTEä½?ï¼?å?¯ä»¥æ??ä¾?å??NXå??PATè¿?æ ·ç??é«?级å??è?½ã?? - -ä¸?è?¬ç??建议æ?¯ï¼?ä½ ä¸?è¦?å?¨32ä½?æ?ºå?¨ä¸?使ç?¨è¶?è¿?8GiBç??空é?´--尽管æ?´å¤?ç??空é?´å?¯è?½å¯¹ä½ å??ä½ ç??å·¥ä½? -é??æ??ç?¨ï¼?ä½?ä½ å? ä¹?æ?¯é? ä½ è?ªå·±--ä¸?è¦?æ??æ??å??æ ¸å¼?å??è??ç??ç??ä¼?å¾?å?³å¿?äº?æ??ç??è¿?å±?æ??å?µã?? --- a/Documentation/translations/zh_CN/vm/hmm.rst +++ /dev/null @@ -1,361 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/hmm.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - -================== -å¼?æ??å??å?管ç?? (HMM) -================== - -æ??ä¾?å?ºç¡?设æ?½å??帮å?©ç¨?åº?以å°?é??常è§?å??å?ï¼?设å¤?å??å?ï¼?å¦?æ?¿ä¸? GPU å??å?ï¼?é??æ??å?°å¸¸è§?å??æ ¸è·¯å¾?ä¸ï¼?å?¶ -å?ºç?³æ?¯æ¤ç±»å??å?ç??ä¸?ç?¨struct pageï¼?请å??é??æ?¬æ??æ¡£ç??第 5 è?³ 7 è??ï¼?ã?? - -HMM è¿?为 SVMï¼?å?±äº«è??æ??å??å?ï¼?æ??ä¾?äº?å?¯é??ç??帮å?©ç¨?åº?ï¼?å?³å??许设å¤?é??æ??å?°è®¿é?®ä¸? CPU ä¸?è?´ç??ç¨?åº? -å?°å??ï¼?è¿?æ??å?³ç?? CPU ä¸?ç??ä»»ä½?æ??æ??æ??é??ä¹?æ?¯è¯¥è®¾å¤?ç??æ??æ??æ??é??ã??è¿?对äº?ç®?å??é«?级å¼?æ??计ç®?ç??使ç?¨å??å¾? -å¿?ä¸?å?¯å°?ï¼?å?¶ä¸ GPUã??DSP æ?? FPGA ç?¨äº?代表è¿?ç¨?æ?§è¡?å??ç§?计ç®?ã?? - -æ?¬æ??æ¡£å??为以ä¸?é?¨å??ï¼?å?¨ç¬¬ä¸?é?¨å??ä¸ï¼?æ??æ?示äº?ä¸?使ç?¨ç?¹å®?äº?设å¤?ç??å??å?å??é??å?¨ç?¸å?³ç??é?®é¢?ã??å?¨ç¬¬äº? -é?¨å??ä¸ï¼?æ??æ?示äº?许å¤?å¹³å?°å?ºæ??ç??硬件é??å?¶ã??第ä¸?é?¨å??æ¦?è¿°äº? HMM 设计ã??第å??é?¨å??解é??äº? CPU 页 -表é??å??ç??å·¥ä½?å??ç??以å?? HMM å?¨è¿?ç§?æ??å?µä¸?ç??ç?®ç??ã??第äº?é?¨å??å¤?ç??å??æ ¸ä¸å¦?ä½?表示设å¤?å??å?ã??æ??å??ï¼? -æ??å??ä¸?è??ä»?ç»?äº?ä¸?个æ?°ç??è¿?移å?©æ??ï¼?å®?å??许å?©ç?¨è®¾å¤? DMA å¼?æ??ã?? - -.. contents:: :local: - -使ç?¨ç?¹å®?äº?设å¤?ç??å??å?å??é??å?¨ç??é?®é¢? -================================ - -å?·æ??大é??æ?¿è½½å??å?ï¼?å? GBï¼?ç??设å¤?ï¼?å¦? GPUï¼?å??æ?¥é??è¿?ä¸?ç?¨é©±å?¨ç¨?åº?ç?¹å®? API 管ç??å?¶å??å?ã??è¿?ä¼? -é? æ??设å¤?驱å?¨ç¨?åº?å??é??å??管ç??ç??å??å?ä¸?常è§?åº?ç?¨ç¨?åº?å??å?ï¼?ç§?æ??å?¿å??ã??å?±äº«å??å?æ??常è§?æ??件æ?¯æ??å??å?ï¼? -ä¹?é?´ç??é??æ?ã??ä»?è¿?é??å¼?å§?ï¼?æ??å°?æ??è¿?个æ?¹é?¢ç§°ä¸ºå??å?²ç??å?°å??空é?´ã??æ??使ç?¨å?±äº«å?°å??空é?´æ?¥æ??代ç?¸å??ç??æ??å?µï¼? -å?³ï¼?设å¤?å?¯ä»¥é??æ??å?°ä½¿ç?¨ä»»ä½?åº?ç?¨ç¨?åº?å??å?å?ºå??ã?? - -å??å?²ç??å?°å??空é?´ç??å??ç??æ?¯å? 为设å¤?å?ªè?½è®¿é?®é??è¿?设å¤?ç?¹å®? API å??é??ç??å??å?ã??è¿?æ??å?³ç??ä»?设å¤?ç??è§?度æ?¥ -ç??ï¼?ç¨?åº?ä¸ç??æ??æ??å??å?对象并ä¸?å¹³ç?ï¼?è¿?使å¾?ä¾?èµ?äº?广æ³?ç??åº?ç??大å??ç¨?åº?å??å¾?å¤?æ??ã?? - -å?·ä½?æ?¥è¯´ï¼?è¿?æ??å?³ç??æ?³è¦?å?©ç?¨å?? GPU è¿?æ ·ç??设å¤?ç??代ç ?é??è¦?å?¨é??ç?¨å??é??ç??å??å?ï¼?mallocã??mmap -ç§?æ??ã??mmap å?±äº«ï¼?å??é??è¿?设å¤?驱å?¨ç¨?åº? API å??é??ç??å??å?ä¹?é?´å¤?å?¶å¯¹è±¡ï¼?è¿?ä»?ç?¶ä»¥ mmap ç»?æ??ï¼? -ä½?æ?¯æ?¯è®¾å¤?æ??件ï¼?ã?? - -对äº?å¹³é?¢æ?°æ?®é??ï¼?æ?°ç»?ã??ç½?æ ¼ã??å?¾å??â?¦â?¦ï¼?ï¼?è¿?并ä¸?é?¾å®?ç?°ï¼?ä½?对äº?å¤?æ??æ?°æ?®é??ï¼?å??表ã??æ ?â?¦â?¦ï¼?ï¼? -å¾?é?¾å??å?°æ£ç¡®ã??å¤?å?¶ä¸?个å¤?æ??ç??æ?°æ?®é??é??è¦?é??æ?°æ? å°?å?¶æ¯?个å??ç´ ä¹?é?´ç??æ??æ??æ??é??å?³ç³»ã??è¿?å¾?容æ??å?ºé??ï¼? -è??ä¸?ç?±äº?æ?°æ?®é??å??å?°å??ç??é??å¤?ï¼?ç¨?åº?æ?´é?¾è°?è¯?ã?? - -å??å?²å?°å??空é?´ä¹?æ??å?³ç??åº?ä¸?è?½é??æ??å?°ä½¿ç?¨å®?们ä»?æ ¸å¿?ç¨?åº?æ??å?¦ä¸?个åº?ä¸è?·å¾?ç??æ?°æ?®ï¼?å? æ¤æ¯?个åº?å?¯è?½ -ä¸?å¾?ä¸?使ç?¨è®¾å¤?ç?¹å®?ç??å??å?å??é??å?¨æ?¥é??å¤?å?¶è¾?å?¥æ?°æ?®é??ã??大å??项ç?®ä¼?å? æ¤å??å?°å½±å??ï¼?并å? 为å??ç§?å??å? -æ?·è´?è??浪费èµ?æº?ã?? - -å¤?å?¶æ¯?个åº?ç??API以æ?¥å??æ¯?个设å¤?ç?¹å®?å??é??å?¨å??é??ç??å??å?ä½?为è¾?å?¥æ??è¾?å?ºï¼?并ä¸?æ?¯ä¸?个å?¯è¡?ç??é??æ?©ã?? -è¿?å°?导è?´åº?å?¥å?£ç?¹ç??ç»?å??ç??ç?¸ã?? - -æ??å??ï¼?é??ç??é«?级è¯è¨?ç»?æ??ï¼?å?¨ C++ ä¸ï¼?å½?ç?¶ä¹?å?¨å?¶ä»?è¯è¨?ä¸ï¼?ç??è¿?æ¥ï¼?ç¼?è¯?å?¨ç?°å?¨æ??å?¯è?½å?¨æ²¡æ??ç¨? -åº?å??å¹²é¢?ç??æ??å?µä¸?å?©ç?¨ GPU å??å?¶ä»?设å¤?ã??æ??äº?ç¼?è¯?å?¨è¯?å?«ç??模å¼?ä»?é??ç?¨äº?å?±äº«å?°å??空é?´ã??对æ??æ?? -å?¶ä»?模å¼?ï¼?使ç?¨å?±äº«å?°å??空é?´ä¹?æ?´å??ç??ã?? - - -I/O æ?»çº¿ã??设å¤?å??å?ç?¹æ?§ -====================== - -ç?±äº?ä¸?äº?é??å?¶ï¼?I/O æ?»çº¿å??å¼±äº?å?±äº«å?°å??空é?´ã??大å¤?æ?° I/O æ?»çº¿å?ªå??许ä»?设å¤?å?°ä¸»å??å?ç??å?ºæ?¬ -å??å?访é?®ï¼?ç??è?³ç¼?å?ä¸?è?´æ?§é??常æ?¯å?¯é??ç??ã??ä»? CPU 访é?®è®¾å¤?å??å?ç??è?³æ?´å? æ??é??ã??é??常æ??å?µä¸?ï¼?å®? -ä¸?æ?¯ç¼?å?ä¸?è?´ç??ã?? - -å¦?æ??æ??们å?ªè??è?? PCIE æ?»çº¿ï¼?é?£ä¹?设å¤?å?¯ä»¥è®¿é?®ä¸»å??å?ï¼?é??常é??è¿? IOMMUï¼?并ä¸? CPU ç¼?å?ä¸? -è?´ã??ä½?æ?¯ï¼?å®?å?ªå??许设å¤?对主å?å?¨å?¨è¿?è¡?ä¸?ç»?æ??é??ç??å??å?æ??ä½?ã??è¿?å?¨å?¦ä¸?个æ?¹å??ä¸?æ?´ç³?ï¼?CPU -å?ªè?½è®¿é?®æ??é??è??å?´ç??设å¤?å??å?ï¼?è??ä¸?è?½å¯¹å?¶æ?§è¡?å??å?æ??ä½?ã??å? æ¤ï¼?ä»?å??æ ¸ç??è§?度æ?¥ç??ï¼?设å¤?å??å?ä¸? -è?½è¢«è§?为ä¸?常è§?å??å?ç?å??ã?? - -å?¦ä¸?个严é??ç??å? ç´ æ?¯å¸¦å®½æ??é??ï¼?约 32GBytes/sï¼?PCIE 4.0 å?? 16 é??é??ï¼?ã??è¿?æ¯?æ??å¿«ç?? GPU -å??å? (1 TBytes/s) æ?¢ 33 å??ã??æ??å??ä¸?个é??å?¶æ?¯å»¶è¿?ã??ä»?设å¤?访é?®ä¸»å??å?ç??延è¿?æ¯?设å¤?访é?®è?ª -å·±ç??å??å?æ?¶é«?ä¸?个æ?°é??级ã?? - -ä¸?äº?å¹³å?°æ£å?¨å¼?å??æ?°ç?? I/O æ?»çº¿æ??对 PCIE ç??æ·»å? /ä¿®æ?¹ä»¥è§£å?³å?¶ä¸ä¸?äº?é??å?¶ -ï¼?OpenCAPIã??CCIXï¼?ã??å®?们主è¦?å??许 CPU å??设å¤?ä¹?é?´ç??å??å??ç¼?å?ä¸?è?´æ?§ï¼?并å??许æ?¶æ??æ?¯æ??ç??æ?? -æ??å??å?æ??ä½?ã??é??æ?¾ç??æ?¯ï¼?并é??æ??æ??å¹³å?°é?½é?µå¾ªè¿?ä¸?è¶?å?¿ï¼?并ä¸?ä¸?äº?主è¦?æ?¶æ??没æ??é??对è¿?äº?é?®é¢?ç??硬 -件解å?³æ?¹æ¡?ã?? - -å? æ¤ï¼?为äº?使å?±äº«å?°å??空é?´æ??æ??ä¹?ï¼?æ??们ä¸?ä»?å¿?é¡»å??许设å¤?访é?®ä»»ä½?å??å?ï¼?è??ä¸?è¿?å¿?é¡»å??许任ä½?å?? -å?å?¨è®¾å¤?使ç?¨æ?¶è¿?移å?°è®¾å¤?å??å?ï¼?å?¨è¿?移æ?¶é?»æ¢ CPU 访é?®ï¼?ã?? - - -å?±äº«å?°å??空é?´å??è¿?移 -================== - -HMM æ??ç®?æ??ä¾?两个主è¦?å??è?½ã??第ä¸?个æ?¯é??è¿?å¤?å?¶cpu页表å?°è®¾å¤?页表ä¸æ?¥å?±äº«å?°å??空é?´ï¼?å? æ¤å¯¹ -äº?è¿?ç¨?å?°å??空é?´ä¸ç??ä»»ä½?æ??æ??主å??å?å?°å??ï¼?ç?¸å??ç??å?°å??æ??å??ç?¸å??ç??ç?©ç??å??å?ã?? - -为äº?å®?ç?°è¿?ä¸?ç?¹ï¼?HMM æ??ä¾?äº?ä¸?ç»?帮å?©ç¨?åº?æ?¥å¡«å??设å¤?页表ï¼?å??æ?¶è·?踪 CPU 页表æ?´æ?°ã??设å¤?页表 -æ?´æ?°ä¸?å?? CPU 页表æ?´æ?°é?£ä¹?容æ??ã??è¦?æ?´æ?°è®¾å¤?页表ï¼?æ?¨å¿?é¡»å??é??ä¸?个ç¼?å?²å?ºï¼?æ??使ç?¨é¢?å??å??é??ç?? -ç¼?å?²å?ºæ± ï¼?并å?¨å?¶ä¸å??å?¥ GPU ç?¹å®?å?½ä»¤ä»¥æ?§è¡?æ?´æ?°ï¼?å??æ¶?æ? å°?ã??ç¼?å?失æ??å??å?·æ?°ç?ï¼?ã??è¿?ä¸?è?½é?? -è¿?æ??æ??设å¤?ç??é??ç?¨ä»£ç ?æ?¥å®?æ??ã??å? æ¤ï¼?为ä»?ä¹?HMMæ??ä¾?äº?帮å?©å?¨ï¼?å?¨æ??硬件ç??å?·ä½?ç»?è??ç??ç»?设å¤?驱 -å?¨ç¨?åº?ç??å??æ?¶ï¼?æ??ä¸?å??å?¯ä»¥è??è??ç??å? ç´ é?½è??è??è¿?å?»äº?ã?? - -HMM æ??ä¾?ç??第äº?ç§?æ?ºå?¶æ?¯ä¸?ç§?æ?°ç?? ZONE_DEVICE å??å?ï¼?å®?å??许为设å¤?å??å?ç??æ¯?个页é?¢å??é??ä¸?个 -struct pageã??è¿?äº?页é?¢å¾?ç?¹æ®?ï¼?å? 为 CPU æ? æ³?æ? å°?å®?们ã??ç?¶è??ï¼?å®?们å??许使ç?¨ç?°æ??ç??è¿?移æ?º -å?¶å°?主å??å?è¿?移å?°è®¾å¤?å??å?ï¼?ä»? CPU ç??è§?度æ?¥ç??ï¼?ä¸?å??ç??èµ·æ?¥é?½å??æ?¯æ?¢å?ºå?°ç£?ç??ç??页é?¢ã??使ç?¨ -struct pageå?¯ä»¥ä¸?ç?°æ??ç?? mm æ?ºå?¶è¿?è¡?æ??ç®?å??ã??æ??å¹²å??ç??é??æ??ã??å??次ï¼?HMM ä»?æ??ä¾?帮å?©ç¨?åº?ï¼? -é¦?å??为设å¤?å??å?ç?æ??æ??æ?°ç?? ZONE_DEVICE å??å?ï¼?ç?¶å??æ?§è¡?è¿?移ã??è¿?移å??容å??æ?¶é?´ç??ç?ç?¥å?³å®?ç?? -ç»?设å¤?驱å?¨ç¨?åº?ã?? - -请注æ??ï¼?ä»»ä½? CPU 对设å¤?页é?¢ç??访é?®é?½ä¼?触å??缺页å¼?常并è¿?移å??主å??å?ã??ä¾?å¦?ï¼?å½?æ?¯æ??ç»?å®?CPU -å?°å?? A ç??页é?¢ä»?主å??å?页é?¢è¿?移å?°è®¾å¤?页é?¢æ?¶ï¼?对å?°å?? A ç??ä»»ä½? CPU 访é?®é?½ä¼?触å??缺页å¼?常 -并å?¯å?¨å??主å??å?ç??è¿?移ã?? - -å?å??è¿?两个ç?¹æ?§ï¼?HMM ä¸?ä»?å??许设å¤?é??å??è¿?ç¨?å?°å??空é?´å¹¶ä¿?æ?? CPU å??设å¤?页表å??æ¥ï¼?è??ä¸?è¿?é?? -è¿?è¿?移设å¤?æ£å?¨ä½¿ç?¨ç??æ?°æ?®é??é?¨å??æ?¥å?©ç?¨è®¾å¤?å??å?ã?? - - -å?°å??空é?´é??å??å®?ç?°å??API -===================== - -å?°å??空é?´é??å??ç??主è¦?ç?®æ ?æ?¯å??许å°?ä¸?å®?è??å?´ç?? CPU 页表å¤?å?¶å?°ä¸?个设å¤?页表ä¸ï¼?HMM æ??å?©äº? -ä¿?æ??两è??å??æ¥ã??æ?³è¦?é??å??è¿?ç¨?å?°å??空é?´ç??设å¤?驱å?¨ç¨?åº?å¿?é¡»ä»?注å?? mmu_interval_notifier -å¼?å§?:: - - int mmu_interval_notifier_insert(struct mmu_interval_notifier *interval_sub, - struct mm_struct *mm, unsigned long start, - unsigned long length, - const struct mmu_interval_notifier_ops *ops); - -å?¨ ops->invalidate() å??è°?æ??é?´ï¼?设å¤?驱å?¨ç¨?åº?å¿?须对è??å?´æ?§è¡?æ?´æ?°æ??ä½?ï¼?å°?è??å?´æ ?记为å?ª -读ï¼?æ??å®?å?¨å??æ¶?æ? å°?ç?ï¼?ã??设å¤?å¿?é¡»å?¨é©±å?¨ç¨?åº?å??è°?è¿?å??ä¹?å??å®?æ??æ?´æ?°ã?? - -å½?设å¤?驱å?¨ç¨?åº?æ?³è¦?å¡«å??ä¸?个è??æ??å?°å??è??å?´æ?¶ï¼?å®?å?¯ä»¥ä½¿ç?¨:: - - int hmm_range_fault(struct hmm_range *range); - -å¦?æ??请æ±?å??访é?®ï¼?å®?å°?å?¨ä¸¢å¤±æ??å?ªè¯»æ?¡ç?®ä¸?触å??缺页å¼?常ï¼?è§?ä¸?æ??ï¼?ã??缺页å¼?常使ç?¨é??ç?¨ç?? mm 缺 -页å¼?常代ç ?è·¯å¾?ï¼?å°±å?? CPU 缺页å¼?常ä¸?æ ·ã?? - -è¿?两个å?½æ?°é?½å°? CPU 页表æ?¡ç?®å¤?å?¶å?°å®?们ç?? pfns æ?°ç»?å??æ?°ä¸ã??该æ?°ç»?ä¸ç??æ¯?个æ?¡ç?®å¯¹åº?äº?è??æ?? -è??å?´ä¸ç??ä¸?个å?°å??ã??HMM æ??ä¾?äº?ä¸?ç»?æ ?å¿?æ?¥å¸®å?©é©±å?¨ç¨?åº?è¯?å?«ç?¹æ®?ç?? CPU 页表项ã?? - -å?¨ sync_cpu_device_pagetables() å??è°?ä¸é??å®?æ?¯é©±å?¨ç¨?åº?å¿?é¡»å°?é??ç??æ??é??è¦?ç??æ?¹é?¢ï¼?以ä¿? -æ??äº?ç?©æ£ç¡®å??æ¥ã??使ç?¨æ¨¡å¼?æ?¯:: - - int driver_populate_range(...) - { - struct hmm_range range; - ... - - range.notifier = &interval_sub; - range.start = ...; - range.end = ...; - range.hmm_pfns = ...; - - if (!mmget_not_zero(interval_sub->notifier.mm)) - return -EFAULT; - - again: - range.notifier_seq = mmu_interval_read_begin(&interval_sub); - mmap_read_lock(mm); - ret = hmm_range_fault(&range); - if (ret) { - mmap_read_unlock(mm); - if (ret == -EBUSY) - goto again; - return ret; - } - mmap_read_unlock(mm); - - take_lock(driver->update); - if (mmu_interval_read_retry(&ni, range.notifier_seq) { - release_lock(driver->update); - goto again; - } - - /* Use pfns array content to update device page table, - * under the update lock */ - - release_lock(driver->update); - return 0; - } - -driver->update é??ä¸?驱å?¨ç¨?åº?å?¨å?¶ invalidate() å??è°?ä¸ä½¿ç?¨ç??é??ç?¸å??ã??该é??å¿?é¡»å?¨è°?ç?¨ -mmu_interval_read_retry() ä¹?å??ä¿?æ??ï¼?以é?¿å??ä¸?并å?? CPU 页表æ?´æ?°å??ç??ä»»ä½?ç«?äº?ã?? - -å?©ç?¨ default_flags å?? pfn_flags_mask -==================================== - -hmm_range ç»?æ??æ?? 2 个å?段ï¼?default_flags å?? pfn_flags_maskï¼?å®?们æ??å®?æ?´ä¸ªè??å?´ -ç??æ??é??æ??å¿«ç?§ç?ç?¥ï¼?è??ä¸?å¿?为 pfns æ?°ç»?ä¸ç??æ¯?个æ?¡ç?®è®¾ç½®å®?们ã?? - -ä¾?å¦?ï¼?å¦?æ??设å¤?驱å?¨ç¨?åº?é??è¦?è?³å°?å?·æ??读å??æ??é??ç??è??å?´ç??页é?¢ï¼?å®?ä¼?设置:: - - range->default_flags = HMM_PFN_REQ_FAULT; - range->pfn_flags_mask = 0; - -并å¦?ä¸?æ??è¿°è°?ç?¨ hmm_range_fault()ã??è¿?å°?å¡«å??è?³å°?å?·æ??读å??æ??é??ç??è??å?´å??ç??æ??æ??页é?¢ã?? - -ç?°å?¨å??设驱å?¨ç¨?åº?æ?³è¦?å??å??æ ·ç??äº?æ??ï¼?é?¤äº?å®?æ?³è¦?æ?¥æ??å??æ??é??ç??è??å?´å??ç??ä¸?页ã??ç?°å?¨é©±å?¨ç¨?åº?设 -ç½®:: - - range->default_flags = HMM_PFN_REQ_FAULT; - range->pfn_flags_mask = HMM_PFN_REQ_WRITE; - range->pfns[index_of_write] = HMM_PFN_REQ_WRITE; - -æ??äº?è¿?个ï¼?HMM å°?å?¨è?³å°?读å??ï¼?å?³æ??æ??ï¼?ç??æ??æ??页é?¢ä¸å¼?常ï¼?并ä¸?对äº?å?°å?? -== range->start + (index_of_write << PAGE_SHIFT) å®?å°?å¼?常å??å?¥æ??é??ï¼?å?³ï¼?å¦?æ?? -CPU pte 没æ??设置å??æ??é??ï¼?é?£ä¹?HMMå°?è°?ç?¨handle_mm_fault()ã?? - -hmm_range_fault å®?æ??å??ï¼?æ ?å¿?ä½?被设置为页表ç??å½?å??ç?¶æ??ï¼?å?³ HMM_PFN_VALID | å¦?æ??页 -é?¢å?¯å??ï¼?å°?设置 HMM_PFN_WRITEã?? - - -ä»?æ ¸å¿?å??æ ¸ç??è§?度表示å??管ç??设å¤?å??å? -================================== - -å°?è¯?äº?å? ç§?ä¸?å??ç??设计æ?¥æ?¯æ??设å¤?å??å?ã??第ä¸?个使ç?¨ç?¹å®?äº?设å¤?ç??æ?°æ?®ç»?æ??æ?¥ä¿?å?æ??å?³è¿?移å??å? -ç??ä¿¡æ?¯ï¼?HMM å°?è?ªèº«æ??æ?¥å?° mm 代ç ?ç??å??个ä½?ç½®ï¼?以å¤?ç??对设å¤?å??å?æ?¯æ??ç??å?°å??ç??ä»»ä½?访é?®ã?? -äº?å®?è¯?æ??ï¼?è¿?æ??ç»?å¤?å?¶äº? struct page ç??大é?¨å??å?段ï¼?并ä¸?è¿?é??è¦?æ?´æ?°è®¸å¤?å??æ ¸ä»£ç ?è·¯å¾?æ?? -è?½ç??解è¿?ç§?æ?°ç??å??å?ç±»å??ã?? - -大å¤?æ?°å??æ ¸ä»£ç ?è·¯å¾?ä»?ä¸?å°?è¯?访é?®é¡µé?¢å??é?¢ç??å??å?ï¼?è??å?ªå?³å¿?struct pageç??å??容ã??æ£å? 为å¦?æ¤ï¼? -HMM å??æ?¢å?°ç?´æ?¥ä½¿ç?¨ struct page ç?¨äº?设å¤?å??å?ï¼?è¿?使å¾?大å¤?æ?°å??æ ¸ä»£ç ?è·¯å¾?ä¸?ç?¥é??å·®å¼?ã?? -æ??们å?ªé??è¦?ç¡®ä¿?没æ??人è¯?å?¾ä»? CPU 端æ? å°?è¿?äº?页é?¢ã?? - -移å?¥å??移å?ºè®¾å¤?å??å? -================== - -ç?±äº? CPU æ? æ³?ç?´æ?¥è®¿é?®è®¾å¤?å??å?ï¼?å? æ¤è®¾å¤?驱å?¨ç¨?åº?å¿?须使ç?¨ç¡¬ä»¶ DMA æ??设å¤?ç?¹å®?ç??å? è½½/å? -å?¨æ??令æ?¥è¿?移æ?°æ?®ã??migrate_vma_setup()ã??migrate_vma_pages() å?? -migrate_vma_finalize() å?½æ?°æ?¨å?¨ä½¿é©±å?¨ç¨?åº?æ?´æ??äº?ç¼?å??并é??ä¸è·¨é©±å?¨ç¨?åº?ç??é??ç?¨ä»£ç ?ã?? - -å?¨å°?页é?¢è¿?移å?°è®¾å¤?ç§?æ??å??å?ä¹?å??ï¼?é??è¦?å??建ç?¹æ®?ç??设å¤?ç§?æ?? ``struct page`` ã??è¿?äº?å°?ç?¨ -ä½?ç?¹æ®?ç??â??交æ?¢â??页表æ?¡ç?®ï¼?以便 CPU è¿?ç¨?å?¨å°?è¯?访é?®å·²è¿?移å?°è®¾å¤?ä¸?ç?¨å??å?ç??页é?¢æ?¶ä¼?å??ç??å¼?常ã?? - -è¿?äº?å?¯ä»¥é??è¿?以ä¸?æ?¹å¼?å??é??å??é??æ?¾:: - - struct resource *res; - struct dev_pagemap pagemap; - - res = request_free_mem_region(&iomem_resource, /* number of bytes */, - "name of driver resource"); - pagemap.type = MEMORY_DEVICE_PRIVATE; - pagemap.range.start = res->start; - pagemap.range.end = res->end; - pagemap.nr_range = 1; - pagemap.ops = &device_devmem_ops; - memremap_pages(&pagemap, numa_node_id()); - - memunmap_pages(&pagemap); - release_mem_region(pagemap.range.start, range_len(&pagemap.range)); - -è¿?æ??devm_request_free_mem_region(), devm_memremap_pages(), -devm_memunmap_pages() å?? devm_release_mem_region() å½?èµ?æº?å?¯ä»¥ç»?å®?å?° ``struct device``. - -æ?´ä½?è¿?移æ¥éª¤ç±»ä¼¼äº?å?¨ç³»ç»?å??å?ä¸è¿?移 NUMA 页é?¢(see :ref:`Page migration <page_migration>`) ï¼? -ä½?è¿?äº?æ¥éª¤å??为设å¤?驱å?¨ç¨?åº?ç?¹å®?代ç ?å??å?±äº«å?¬å?±ä»£ç ?: - -1. ``mmap_read_lock()`` - - 设å¤?驱å?¨ç¨?åº?å¿?é¡»å°? ``struct vm_area_struct`` ä¼ é??ç»?migrate_vma_setup()ï¼? - å? æ¤é??è¦?å?¨è¿?移æ??é?´ä¿?ç?? mmap_read_lock() æ?? mmap_write_lock()ã?? - -2. ``migrate_vma_setup(struct migrate_vma *args)`` - - 设å¤?驱å?¨å??å§?å??äº? ``struct migrate_vma`` ç??å?段ï¼?并å°?该æ??é??ä¼ é??ç»? - migrate_vma_setup()ã??``args->flags`` å?段æ?¯ç?¨æ?¥è¿?滤å?ªäº?æº?页é?¢åº?该被è¿?移ã?? - ä¾?å¦?ï¼?设置 ``MIGRATE_VMA_SELECT_SYSTEM`` å°?å?ªè¿?移系ç»?å??å?ï¼?设置 - ``MIGRATE_VMA_SELECT_DEVICE_PRIVATE`` å°?å?ªè¿?移驻ç??å?¨è®¾å¤?ç§?æ??å??å?ä¸ç??页 - é?¢ã??å¦?æ??å??è??被设置ï¼? ``args->pgmap_owner`` å?段被ç?¨æ?¥è¯?å?«é©±å?¨æ??æ?¥æ??ç??设å¤? - ç§?æ??页ã??è¿?å°±é?¿å??äº?è¯?å?¾è¿?移驻ç??å?¨å?¶ä»?设å¤?ä¸ç??设å¤?ç§?æ??页ã??ç?®å??ï¼?å?ªæ??å?¿å??ç??ç§?æ??VMA - è??å?´å?¯ä»¥è¢«è¿?移å?°ç³»ç»?å??å?å??设å¤?ç§?æ??å??å?ã?? - - migrate_vma_setup()æ??å??ç??第ä¸?æ¥æ?¯ç?¨ ``mmu_notifier_invalidate_range_start()`` - å?? ``mmu_notifier_invalidate_range_end()`` è°?ç?¨æ?¥é??å??设å¤?å?¨å?´ç??页表ï¼?使 - å?¶ä»?设å¤?ç??MMUæ? æ??ï¼?以便å?¨ ``args->src`` æ?°ç»?ä¸å¡«å??è¦?è¿?移ç??PFNã?? - ``invalidate_range_start()`` å??è°?ä¼ é??ç»?ä¸?个``struct mmu_notifier_range`` ï¼? - å?¶ ``event`` å?段设置为MMU_NOTIFY_MIGRATEï¼? ``owner`` å?æ®µè®¾ç½®ä¸ºä¼ é??ç»? - migrate_vma_setup()ç?? ``args->pgmap_owner`` å?段ã??è¿?å??许设å¤?驱å?¨è·³è¿?æ? - æ??å??å??è°?ï¼?å?ªæ? æ??å??é?£äº?å®?é??æ£å?¨è¿?移ç??设å¤?ç§?æ??MMUæ? å°?ã??è¿?ä¸?ç?¹å°?å?¨ä¸?ä¸?è??详ç»?解é??ã?? - - - å?¨é??å??页表æ?¶ï¼?ä¸?个 ``pte_none()`` æ?? ``is_zero_pfn()`` æ?¡ç?®å¯¼è?´ä¸?个æ??æ?? - ç?? â??zeroâ?? PFN å?å?¨å?¨ ``args->src`` é?µå??ä¸ã??è¿?让驱å?¨å??é??设å¤?ç§?æ??å??å?并æ¸? - é?¤å®?ï¼?è??ä¸?æ?¯å¤?å?¶ä¸?个é?¶é¡µã??å?°ç³»ç»?å??å?æ??设å¤?ç§?æ??ç»?æ??页ç??æ??æ??PTEæ?¡ç?®å°?被 - ``lock_page()``é??å®?ï¼?ä¸?LRUé??离ï¼?å¦?æ??ç³»ç»?å??å?å??设å¤?ç§?æ??页ä¸?å?¨LRUä¸?ï¼?ï¼?ä»?è¿? - ç¨?ä¸å??æ¶?æ? å°?ï¼?并æ??å?¥ä¸?个ç?¹æ®?ç??è¿?移PTEæ?¥ä»£æ?¿å??æ?¥ç??PTEã?? migrate_vma_setup() - è¿?æ¸?é?¤äº? ``args->dst`` æ?°ç»?ã?? - -3. 设å¤?驱å?¨ç¨?åº?å??é??ç?®æ ?页é?¢å¹¶å°?æº?页é?¢å¤?å?¶å?°ç?®æ ?页é?¢ã?? - - 驱å?¨ç¨?åº?æ£?æ?¥æ¯?个 ``src`` æ?¡ç?®ä»¥æ?¥ç??该 ``MIGRATE_PFN_MIGRATE`` ä½?æ?¯å?¦å·² - 设置并跳è¿?æ?ªè¿?移ç??æ?¡ç?®ã??设å¤?驱å?¨ç¨?åº?è¿?å?¯ä»¥é??è¿?ä¸?å¡«å??页é?¢ç?? ``dst`` æ?°ç»?æ?¥é?? - æ?©è·³è¿?页é?¢è¿?移ã?? - - ç?¶å??ï¼?驱å?¨ç¨?åº?å??é??ä¸?个设å¤?ç§?æ?? struct page æ??ä¸?个系ç»?å??å?页ï¼?ç?¨ ``lock_page()`` - é??å®?该页ï¼?并å°? ``dst`` æ?°ç»?æ?¡ç?®å¡«å?¥:: - - dst[i] = migrate_pfn(page_to_pfn(dpage)); - - ç?°å?¨é©±å?¨ç¨?åº?ç?¥é??è¿?个页é?¢æ£å?¨è¢«è¿?移ï¼?å®?å?¯ä»¥ä½¿è®¾å¤?ç§?æ?? MMU æ? å°?æ? æ??并å°?设å¤?ç§?æ?? - å??å?å¤?å?¶å?°ç³»ç»?å??å?æ??å?¦ä¸?个设å¤?ç§?æ??页é?¢ã??ç?±äº?æ ¸å¿? Linux å??æ ¸ä¼?å¤?ç?? CPU 页表失 - æ??ï¼?å? æ¤è®¾å¤?驱å?¨ç¨?åº?å?ªé??使å?¶è?ªå·±ç?? MMU æ? å°?失æ??ã?? - - 驱å?¨ç¨?åº?å?¯ä»¥ä½¿ç?¨ ``migrate_pfn_to_page(src[i])`` æ?¥è?·å??æº?设å¤?ç?? - ``struct page`` é?¢ï¼?并å°?æº?页é?¢å¤?å?¶å?°ç?®æ ?设å¤?ä¸?ï¼?å¦?æ??æ??é??为 ``NULL`` ï¼?æ?? - å?³ç??æº?页é?¢æ²¡æ??被填å??å?°ç³»ç»?å??å?ä¸ï¼?å??æ¸?é?¤ç?®æ ?设å¤?ç??ç§?æ??å??å?ã?? - -4. ``migrate_vma_pages()`` - - è¿?ä¸?æ¥æ?¯å®?é??â??æ??交â??è¿?移ç??å?°æ?¹ã?? - - å¦?æ??æº?页æ?¯ ``pte_none()`` æ?? ``is_zero_pfn()`` 页ï¼?è¿?æ?¶æ?°å??é??ç??页ä¼?被æ?? - å?¥å?°CPUç??页表ä¸ã??å¦?æ??ä¸?个CPU线ç¨?å?¨å??ä¸?页é?¢ä¸?å??ç??å¼?常ï¼?è¿?å?¯è?½ä¼?失败ã??ç?¶è??ï¼?页 - 表被é??å®?ï¼?å?ªæ??ä¸?个æ?°é¡µä¼?被æ??å?¥ã??å¦?æ??å®?失å?»äº?ç«?äº?ï¼?设å¤?驱å?¨å°?ç??å?° - ``MIGRATE_PFN_MIGRATE`` ä½?被æ¸?é?¤ã?? - - å¦?æ??æº?页被é??å®?ã??é??离ç?ï¼?æº? ``struct page`` ä¿¡æ?¯ç?°å?¨è¢«å¤?å?¶å?°ç?®æ ? - ``struct page`` ï¼?æ??ç»?å®?æ??CPU端ç??è¿?移ã?? - -5. 设å¤?驱å?¨ä¸ºä»?å?¨è¿?移ç??页é?¢æ?´æ?°è®¾å¤?MMU页表ï¼?å??æ»?æ?ªè¿?移ç??页é?¢ã?? - - å¦?æ?? ``src`` æ?¡ç?®ä»?ç?¶æ?? ``MIGRATE_PFN_MIGRATE`` ä½?被设置ï¼?设å¤?驱å?¨å?¯ä»¥ - æ?´æ?°è®¾å¤?MMUï¼?å¦?æ?? ``MIGRATE_PFN_WRITE`` ä½?被设置ï¼?å??设置å??å?¯ç?¨ä½?ã?? - -6. ``migrate_vma_finalize()`` - - è¿?ä¸?æ¥ç?¨æ?°é¡µç??页表项æ?¿æ?¢ç?¹æ®?ç??è¿?移页表项ï¼?并é??æ?¾å¯¹æº?å??ç?®ç?? ``struct page`` - ç??å¼?ç?¨ã?? - -7. ``mmap_read_unlock()`` - - ç?°å?¨å?¯ä»¥é??æ?¾é??äº?ã?? - -ç?¬å? 访é?®å?å?¨å?¨ -============== - -ä¸?äº?设å¤?å?·æ??诸å¦?å??å?PTEä½?ç??å??è?½ï¼?å?¯ä»¥ç?¨æ?¥å®?ç?°å¯¹ç³»ç»?å??å?ç??å??å?访é?®ã??为äº?æ?¯æ??对ä¸? -个å?±äº«ç??è??æ??å??å?页ç??å??å?æ??ä½?ï¼?è¿?æ ·ç??设å¤?é??è¦?对该页ç??访é?®æ?¯æ??ä»?ç??ï¼?è??ä¸?æ?¯æ?¥è?ªCPU -ç??ä»»ä½?ç?¨æ?·ç©ºé?´è®¿é?®ã?? ``make_device_exclusive_range()`` å?½æ?°å?¯ä»¥ç?¨æ?¥ä½¿ä¸? -个å??å?è??å?´ä¸?è?½ä»?ç?¨æ?·ç©ºé?´è®¿é?®ã?? - -è¿?å°?ç?¨ç?¹æ®?ç??交æ?¢æ?¡ç?®æ?¿æ?¢ç»?å®?è??å?´å??ç??æ??æ??页ç??æ? å°?ã??ä»»ä½?è¯?å?¾è®¿é?®äº¤æ?¢æ?¡ç?®ç??è¡?为é?½ä¼? -导è?´ä¸?个å¼?常ï¼?该å¼?常ä¼?é??è¿?ç?¨å??å§?æ? å°?æ?¿æ?¢è¯¥æ?¡ç?®è??å¾?å?°æ?¢å¤?ã??驱å?¨ç¨?åº?ä¼?被é??ç?¥æ? å°?å·² -ç»?被MMUé??ç?¥å?¨æ?¹å??ï¼?ä¹?å??å®?å°?ä¸?å??æ??对该页ç??ç?¬å? 访é?®ã??ç?¬å? 访é?®è¢«ä¿?è¯?æ??ç»å?°é©±å?¨ç¨?åº? -æ?¾å¼?页é?¢é??å??页é?¢å¼?ç?¨ä¸ºæ¢ï¼?è¿?æ?¶é¡µé?¢ä¸?ç??ä»»ä½?CPUå¼?常é?½å?¯ä»¥æ??æ??è¿°è¿?è¡?ã?? - -å??å? cgroup (memcg) å?? rss ç»?计 -=============================== - -ç?®å??ï¼?设å¤?å??å?被è§?为 rss 计æ?°å?¨ä¸ç??ä»»ä½?常è§?页é?¢ï¼?å¦?æ??设å¤?页é?¢ç?¨äº?å?¿å??ï¼?å??为å?¿å??ï¼? -å¦?æ??设å¤?页é?¢ç?¨äº?æ??件æ?¯æ??页é?¢ï¼?å??为æ??件ï¼?å¦?æ??设å¤?页é?¢ç?¨äº?å?±äº«å??å?ï¼?å??为 shmemï¼?ã?? -è¿?æ?¯ä¸ºäº?ä¿?æ??ç?°æ??åº?ç?¨ç¨?åº?ç??æ??æ??é??æ?©ï¼?è¿?äº?åº?ç?¨ç¨?åº?å?¯è?½å?¨ä¸?ç?¥æ??ç??æ??å?µä¸?å¼?å§?使ç?¨è®¾å¤? -å??å?ï¼?è¿?è¡?ä¸?å??å½±å??ã?? - -ä¸?个缺ç?¹æ?¯ OOM æ??æ??å?¯è?½ä¼?æ??æ»ä½¿ç?¨å¤§é??设å¤?å??å?è??ä¸?æ?¯å¤§é??常è§?ç³»ç»?å??å?ç??åº?ç?¨ç¨?åº?ï¼? -å? æ¤ä¸?ä¼?é??æ?¾å¤ªå¤?ç³»ç»?å??å?ã??å?¨å?³å®?以ä¸?å??æ?¹å¼?计ç®?设å¤?å??å?ä¹?å??ï¼?æ??们å¸?æ??æ?¶é??æ?´å¤?å?³ -äº?åº?ç?¨ç¨?åº?å??ç³»ç»?å?¨å?å?¨è®¾å¤?å??å?ç??æ??å?µä¸?å?¨å??å?å??å??ä¸?å¦?ä½?å??åº?ç??å®?é??ç»?éª?ã?? - -对å??å? cgroup å??å?ºäº?ç?¸å??ç??å?³å®?ã??设å¤?å??å?页é?¢æ ¹æ?®ç?¸å??ç??å??å? cgroup 计ç®?ï¼?常è§? -页é?¢å°?被计ç®?å?¨å??ã??è¿?ç¡®å®?ç®?å??äº?è¿?å?ºè®¾å¤?å??å?ç??è¿?移ã??è¿?ä¹?æ??å?³ç??ä»?设å¤?å??å?è¿?移å??常è§? -å??å?ä¸?ä¼?失败ï¼?å? 为å®?ä¼?è¶?è¿?å??å? cgroup é??å?¶ã??ä¸?æ?¦æ??们对设å¤?å??å?ç??使ç?¨æ?¹å¼?å??å?¶å¯¹ -å??å?èµ?æº?æ?§å?¶ç??å½±å??æ??äº?æ?´å¤?ç??äº?解ï¼?æ??们å?¯è?½ä¼?å?¨å??é?¢é??æ?°è??è??è¿?个é??æ?©ã?? - -请注æ??ï¼?设å¤?å??å?æ°¸è¿?ä¸?è?½ç?±è®¾å¤?驱å?¨ç¨?åº?æ??é??è¿? GUP å?ºå®?ï¼?å? æ¤æ¤ç±»å??å?å?¨è¿?ç¨?é??å?ºæ?¶ -æ?»æ?¯è¢«é??æ?¾ç??ã??æ??è??å?¨å?±äº«å??å?æ??æ??件æ?¯æ??å??å?ç??æ??å?µä¸?ï¼?å½?å? é?¤æ??å??ä¸?个å¼?ç?¨æ?¶ã?? --- a/Documentation/translations/zh_CN/vm/hugetlbfs_reserv.rst +++ /dev/null @@ -1,436 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/hugetlbfs_reserv.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - -============== -Hugetlbfs é¢?ç?? -============== - -æ¦?è¿° -==== - -:ref:`hugetlbpage` ä¸æ??è¿°ç??巨页é??常æ?¯é¢?å??å??é??ç»?åº?ç?¨ç¨?åº?使ç?¨ç??ã??å¦?æ??VMAæ?? -示è¦?使ç?¨å·¨é¡µï¼?è¿?äº?巨页ä¼?å?¨ç¼ºé¡µå¼?常æ?¶è¢«å®?ä¾?å??å?°ä»»å?¡ç??å?°å??空é?´ã??å¦?æ??å?¨ç¼ºé¡µå¼?常 -æ?¶æ²¡æ??巨页å?å?¨ï¼?ä»»å?¡å°±ä¼?被å??é??ä¸?个SIGBUSï¼?并ç»?常ä¸?é«?å?´å?°æ»å?»ã??å?¨å? å?¥å·¨é¡µæ?¯ -æ??å??ä¸?ä¹?ï¼?人们å?³å®?ï¼?å?¨mmap()æ?¶æ£?æµ?巨页ç??ç?缺æ??å?µä¼?æ?´å¥½ã??è¿?个æ?³æ³?æ?¯ï¼?å¦?æ?? -没æ??足å¤?ç??巨页æ?¥è¦?ç??æ? å°?ï¼?mmap()å°?失败ã??è¿?é¦?å??æ?¯å?¨mmap()æ?¶å?¨ä»£ç ?ä¸å??ä¸?个 -ç®?å??ç??æ£?æ?¥ï¼?以确å®?æ?¯å?¦æ??足å¤?ç??空é?²å·¨é¡µæ?¥è¦?ç??æ? å°?ã??å°±å??å??æ ¸ä¸ç??大å¤?æ?°ä¸?西ä¸? -æ ·ï¼?代ç ?é??ç??æ?¶é?´ç??æ?¨ç§»è??ä¸?æ?å??å±?ã??ç?¶è??ï¼?å?ºæ?¬ç??æ?³æ³?æ?¯å?¨mmap()æ?¶ â??é¢?ç??â?? -巨页ï¼?以确ä¿?巨页å?¯ä»¥ç?¨äº?该æ? å°?ä¸ç??缺页å¼?常ã??ä¸?é?¢ç??æ??è¿°è¯?å?¾æ??è¿°å?¨v4.10å??æ ¸ -ä¸æ?¯å¦?ä½?è¿?è¡?巨页é¢?ç??å¤?ç??ç??ã?? - - -读è?? -==== -è¿?个æ??述主è¦?æ?¯é??对æ£å?¨ä¿®æ?¹hugetlbfs代ç ?ç??å??æ ¸å¼?å??è??ã?? - - -æ?°æ?®ç»?æ?? -======== - -resv_huge_pages - è¿?æ?¯ä¸?个å?¨å±?ç??ï¼?per-hstateï¼?é¢?ç??ç??巨页ç??计æ?°ã??é¢?ç??ç??巨页å?ªå¯¹é¢?ç??å®?们ç??ä»» - å?¡å?¯ç?¨ã??å? æ¤ï¼?ä¸?è?¬å?¯ç?¨ç??巨页ç??æ?°é??被计ç®?为(``free_huge_pages - resv_huge_pages``)ã?? -Reserve Map - é¢?ç??æ? å°?ç?±ä»¥ä¸?ç»?æ??ä½?æ??è¿°:: - - struct resv_map { - struct kref refs; - spinlock_t lock; - struct list_head regions; - long adds_in_progress; - struct list_head region_cache; - long region_cache_count; - }; - - ç³»ç»?ä¸æ¯?个巨页æ? å°?é?½æ??ä¸?个é¢?ç??æ? å°?ã??resv_mapä¸ç??regionså??表æ??è¿°äº?æ? å°?ä¸ç?? - å?ºå??ã??ä¸?个å?ºå??被æ??述为:: - - struct file_region { - struct list_head link; - long from; - long to; - }; - - file_regionç»?æ??ä½?ç?? â??fromâ?? å?? â??toâ?? å?段æ?¯è¿?å?¥æ? å°?ç??巨页索å¼?ã??æ ¹æ?®æ? å°?ç??ç±»å??ï¼?å?¨ - reserv_map ä¸ç??ä¸?个å?ºå??å?¯è?½è¡¨ç¤ºè¯¥è??å?´å?å?¨é¢?ç??ï¼?æ??é¢?ç??ä¸?å?å?¨ã?? -Flags for MAP_PRIVATE Reservations - è¿?äº?被å?å?¨å?¨é¢?ç??ç??æ? å°?æ??é??ç??åº?é?¨ã?? - - ``#define HPAGE_RESV_OWNER (1UL << 0)`` - 表示该任å?¡æ?¯ä¸?该æ? å°?ç?¸å?³ç??é¢?ç??ç??æ??æ??è??ã?? - ``#define HPAGE_RESV_UNMAPPED (1UL << 1)`` - 表示æ??å??æ? å°?æ¤è??å?´ï¼?并å??建å?¨å¤?ï¼?ç??ä»»å?¡ç?±äº?COW失败è??ä»?该任å?¡ï¼?å?ä»»å?¡ï¼?ä¸å??æ¶?æ? - å°?äº?ä¸?个页é?¢ã?? -Page Flags - PagePrivate页é?¢æ ?å¿?æ?¯ç?¨æ?¥æ??示å?¨é??æ?¾å·¨é¡µæ?¶å¿?é¡»æ?¢å¤?巨页ç??é¢?ç??ã??æ?´å¤?ç»?è??å°?å?¨ - â??é??æ?¾å·¨é¡µâ?? ä¸?è??ä¸è®¨è®ºã?? - - -é¢?ç??æ? å°?ä½?ç½®ï¼?ç§?æ??æ??å?±äº«ï¼? -========================== - -ä¸?个巨页æ? å°?æ??段è¦?ä¹?æ?¯ç§?æ??ç??ï¼?è¦?ä¹?æ?¯å?±äº«ç??ã??å¦?æ??æ?¯ç§?æ??ç??ï¼?å®?é??常å?ªå¯¹ä¸?个å?°å??空é?´ -ï¼?ä»»å?¡ï¼?å?¯ç?¨ã??å¦?æ??æ?¯å?±äº«ç??ï¼?å®?å?¯ä»¥è¢«æ? å°?å?°å¤?个å?°å??空é?´ï¼?ä»»å?¡ï¼?ã??对äº?è¿?两ç§?ç±»å??ç??æ? å°?ï¼? -é¢?ç??æ? å°?ç??ä½?ç½®å??è¯ä¹?æ?¯æ??æ?¾ä¸?å??ç??ã??ä½?ç½®ç??å·®å¼?æ?¯ï¼? - -- 对äº?ç§?æ??æ? å°?ï¼?é¢?ç??æ? å°?æ??å?¨VMAç»?æ??ä½?ä¸?ã??å?·ä½?æ?¥è¯´ï¼?å°±æ?¯vma->vm_private_dataã??è¿?个ä¿? - ç??æ? å°?æ?¯å?¨å??建æ? å°?ï¼?mmap(MAP_PRIVATE)ï¼?æ?¶å??建ç??ã?? -- 对äº?å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?æ??å?¨inodeä¸?ã??å?·ä½?æ?¥è¯´ï¼?å°±æ?¯inode->i_mapping->private_dataã?? - ç?±äº?å?±äº«æ? å°?æ?»æ?¯ç?±hugetlbfsæ??件系ç»?ä¸ç??æ??件æ?¯æ??ï¼?hugetlbfs代ç ?ç¡®ä¿?æ¯?个è??ç?¹å??å?«ä¸?个é¢? - ç??æ? å°?ã??å? æ¤ï¼?é¢?ç??æ? å°?å?¨å??建è??ç?¹æ?¶è¢«å??é??ã?? - - -å??建é¢?ç?? -======== -å½?å??建ä¸?个巨大ç??æ??页é?¢æ?¯æ??ç??å?±äº«å??å?段ï¼?shmget(SHM_HUGETLB)ï¼?æ??é??è¿?mmap(MAP_HUGETLB) -å??建ä¸?个æ? å°?æ?¶ï¼?å°±ä¼?å??建é¢?ç??ã??è¿?äº?æ??ä½?ä¼?导è?´å¯¹å?½æ?°hugetlb_reserve_pages()ç??è°?ç?¨:: - - int hugetlb_reserve_pages(struct inode *inode, - long from, long to, - struct vm_area_struct *vma, - vm_flags_t vm_flags) - -hugetlb_reserve_pages()å??ç??第ä¸?件äº?æ?¯æ£?æ?¥å?¨è°?ç?¨shmget()æ??mmap()æ?¶æ?¯å?¦æ??å®?äº?NORESERVE -æ ?å¿?ã??å¦?æ??æ??å®?äº?NORESERVEï¼?é?£ä¹?è¿?个å?½æ?°ç«?å?³è¿?å??ï¼?å? 为ä¸?é??è¦?é¢?ç??ã?? - -å??æ?°'from'å??'to'æ?¯æ? å°?æ??å?ºç¡?æ??件ç??巨页索å¼?ã??对äº?shmget()ï¼?'from'æ?»æ?¯0ï¼?'to'对åº?äº?段/æ? å°? -ç??é?¿åº¦ã??对äº?mmap()ï¼?offsetå??æ?°å?¯ä»¥ç?¨æ?¥æ??å®?è¿?å?¥åº?å±?æ??件ç??å??移é??ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?'from'å??'to' -å??æ?°å·²ç»?被è¿?个å??移é??æ??è°?æ?´ã?? - -PRIVATEå??SHAREDæ? å°?ä¹?é?´ç??ä¸?个å¾?大ç??å?ºå?«æ?¯é¢?ç??å?¨é¢?ç??æ? å°?ä¸ç??表示æ?¹å¼?ã?? - -- 对äº?å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?ä¸ç??æ?¡ç?®è¡¨ç¤ºå¯¹åº?页é?¢ç??é¢?ç??å?å?¨æ??æ?¾ç»?å?å?¨ã??å½?é¢?ç??被æ¶?è??æ?¶ï¼?é¢?ç??æ? å°?ä¸?被 - ä¿®æ?¹ã?? -- 对äº?ç§?æ??æ? å°?ï¼?é¢?ç??æ? å°?ä¸æ²¡æ??æ?¡ç?®è¡¨ç¤ºç?¸åº?页é?¢å?å?¨é¢?ç??ã??é??ç??é¢?ç??被æ¶?è??ï¼?æ?¡ç?®è¢«æ·»å? å?°é¢?ç??æ? å°?ä¸ã?? - å? æ¤ï¼?é¢?ç??æ? å°?ä¹?å?¯ç?¨äº?ç¡®å®?å?ªäº?é¢?ç??已被æ¶?è??ã?? - -对äº?ç§?æ??æ? å°?ï¼?hugetlb_reserve_pages()å??建é¢?ç??æ? å°?并å°?å?¶æ??å?¨VMAç»?æ??ä½?ä¸?ã??æ¤å¤?ï¼? -HPAGE_RESV_OWNERæ ?å¿?被设置ï¼?以表æ??该VMAæ?¥æ??é¢?ç??ã?? - -é¢?ç??æ? å°?被æ?¥é??以确å®?å½?å??æ? å°?/段é??è¦?å¤?å°?巨页é¢?ç??ã??对äº?ç§?æ??æ? å°?ï¼?è¿?å§?ç»?æ?¯ä¸?个å?¼ï¼?to - fromï¼?ã?? -ç?¶è??ï¼?对äº?å?±äº«æ? å°?æ?¥è¯´ï¼?ä¸?äº?é¢?ç??å?¯è?½å·²ç»?å?å?¨äº?(to - from)ç??è??å?´å??ã??å?³äº?å¦?ä½?å®?ç?°è¿?ä¸?ç?¹ç??ç»?è??ï¼? -请å??è§? :ref:`é¢?ç??æ? å°?ç??ä¿®æ?¹ <resv_map_modifications>` ä¸?è??ã?? - -该æ? å°?å?¯è?½ä¸?ä¸?个å?æ± ï¼?subpoolï¼?ç?¸å?³è??ã??å¦?æ??æ?¯è¿?æ ·ï¼?å°?æ?¥è¯¢å?æ± ä»¥ç¡®ä¿?æ??足å¤?ç??空é?´ç?¨äº?æ? å°?ã??å?æ± -æ??å?¯è?½å·²ç»?é¢?ç??äº?å?¯ç?¨äº?æ? å°?ç??é¢?ç??空é?´ã??æ?´å¤?ç»?è??请å??è§? :ref: `å?æ± é¢?ç?? <sub_pool_resv>` -ä¸?è??ã?? - -å?¨å?¨è¯¢äº?é¢?ç??æ? å°?å??å?æ± ä¹?å??ï¼?å°±ç?¥é??äº?é??è¦?ç??æ?°é¢?ç??æ?°é??ã??hugetlb_acct_memory()å?½æ?°è¢«è°?ç?¨ä»¥æ£?æ?¥ -并è?·å??æ??è¦?æ±?ç??é¢?ç??æ?°é??ã??hugetlb_acct_memory()è°?ç?¨å?°å?¯è?½å??é??å??è°?æ?´å?©ä½?页æ?°ç??å?½æ?°ã??ç?¶è??ï¼?å?¨è¿? -äº?å?½æ?°ä¸ï¼?代ç ?å?ªæ?¯æ£?æ?¥ä»¥ç¡®ä¿?æ??足å¤?ç??空é?²ç??巨页æ?¥å®¹çº³é¢?ç??ã??å¦?æ??æ??ç??è¯?ï¼?å?¨å±?é¢?ç??计æ?°resv_huge_pages -ä¼?被è°?æ?´ï¼?å¦?ä¸?æ??示:: - - if (resv_needed <= (resv_huge_pages - free_huge_pages)) - resv_huge_pages += resv_needed; - -注æ??ï¼?å?¨æ£?æ?¥å??è°?æ?´è¿?äº?计æ?°å?¨æ?¶ï¼?å?¨å±?é??hugetlb_lockä¼?被é¢?ç??ã?? - -å¦?æ??æ??足å¤?ç??空é?²ç??巨页ï¼?并ä¸?å?¨å±?计æ?°resv_huge_pages被è°?æ?´ï¼?é?£ä¹?ä¸?æ? å°?ç?¸å?³ç??é¢?ç??æ? å°?被修æ?¹ä»¥ -å??æ? é¢?ç??ã??å?¨å?±äº«æ? å°?ç??æ??å?µä¸?ï¼?å°?å?å?¨ä¸?个file_regionï¼?å??æ?¬'from'-'to'è??å?´ã??对äº?ç§?æ??æ? å°?ï¼? -ä¸?对é¢?ç??æ? å°?è¿?è¡?ä¿®æ?¹ï¼?å? 为没æ??æ?¡ç?®è¡¨ç¤ºå?å?¨é¢?ç??ã?? - -å¦?æ??hugetlb_reserve_pages()æ??å??ï¼?å?¨å±?é¢?ç??æ?°å??ä¸?æ? å°?ç?¸å?³ç??é¢?ç??æ? å°?å°?æ ¹æ?®é??è¦?被修æ?¹ï¼?以确ä¿? -å?¨'from'-'to'è??å?´å??å?å?¨é¢?ç??ã?? - -æ¶?è??é¢?ç??/å??é??ä¸?个巨页 -=========================== - -å½?ä¸?é¢?ç??ç?¸å?³ç??巨页å?¨ç?¸åº?ç??æ? å°?ä¸è¢«å??é??å??å®?ä¾?å??æ?¶ï¼?é¢?ç??就被æ¶?è??äº?ã??该å??é??æ?¯å?¨å?½æ?°alloc_huge_page() -ä¸è¿?è¡?ç??:: - - struct page *alloc_huge_page(struct vm_area_struct *vma, - unsigned long addr, int avoid_reserve) - -alloc_huge_pageè¢«ä¼ é??ç»?ä¸?个VMAæ??é??å??ä¸?个è??æ??å?°å??ï¼?å? æ¤å®?å?¯ä»¥æ?¥é??é¢?ç??æ? å°?以确å®?æ?¯å?¦å?å?¨é¢?ç??ã?? -æ¤å¤?ï¼?alloc_huge_pageé??è¦?ä¸?个å??æ?°avoid_reserveï¼?该å??æ?°è¡¨ç¤ºå?³ä½¿ç??èµ·æ?¥å·²ç»?为æ??å®?ç??å?°å??é¢?ç??äº? -é¢?ç??ï¼?ä¹?ä¸?åº?该使ç?¨é¢?ç??ã??avoid_reserveå??æ?°æ??常被ç?¨äº?å??æ?¶æ?·è´?å??页é?¢è¿?移ç??æ??å?µä¸?ï¼?å?³ç?°æ??页é?¢ç??é¢? -å¤?æ?·è´?被å??é??ã?? - - -è°?ç?¨è¾?å?©å?½æ?°vma_needs_reservation()æ?¥ç¡®å®?æ?¯å?¦å?å?¨å¯¹æ? å°?(vma)ä¸å?°å??ç??é¢?ç??ã??å?³äº?è¿?个å?½æ?°ç??详 -ç»?å??容ï¼?请å??è§? :ref:`é¢?ç??æ? å°?帮å?©å?½æ?° <resv_map_helpers>` ä¸?è??ã??ä»? -vma_needs_reservation()è¿?å??ç??å?¼é??常为0æ??1ã??å¦?æ??该å?°å??å?å?¨é¢?ç??ï¼?å??为0ï¼?å¦?æ??ä¸?å?å?¨é¢?ç??ï¼?å??为1ã?? -å¦?æ??ä¸?å?å?¨é¢?ç??ï¼?并ä¸?æ??ä¸?个ä¸?æ? å°?ç?¸å?³è??ç??å?æ± ï¼?å??æ?¥è¯¢å?æ± ä»¥ç¡®å®?å®?æ?¯å?¦å??å?«é¢?ç??ã??å¦?æ??å?æ± å??å?«é¢?ç??ï¼? -å??å?¯å°?å?¶ä¸ä¸?个ç?¨äº?该å??é??ã??ç?¶è??ï¼?å?¨ä»»ä½?æ??å?µä¸?ï¼?avoid_reserveå??æ?°é?½ä¼?ä¼?å??è??è??为å??é??使ç?¨é¢?ç??ã??å?¨ -ç¡®å®?é¢?ç??æ?¯å?¦å?å?¨å¹¶å?¯ç?¨äº?å??é??å??ï¼?è°?ç?¨dequeue_huge_page_vma()å?½æ?°ã??è¿?个å?½æ?°é??è¦?两个ä¸?é¢?ç??æ??å?³ -ç??å??æ?°ï¼? - -- avoid_reserveï¼?è¿?æ?¯ä¼ é??ç»?alloc_huge_page()ç??å??ä¸?个å?¼/å??æ?°ã?? -- chgï¼?尽管è¿?个å??æ?°ç??ç±»å??æ?¯longï¼?ä½?å?ªæ??0æ??1ç??å?¼è¢«ä¼ é??ç»?dequeue_huge_page_vmaã??å¦?æ??该å?¼ä¸º0ï¼? - å??表æ??å?å?¨é¢?ç??ï¼?å?³äº?å?¯è?½ç??é?®é¢?ï¼?请å??è§? â??é¢?ç??å??å??å?ç?ç?¥â?? ä¸?è??ï¼?ã??å¦?æ??å?¼ - 为1ï¼?å??表示ä¸?å?å?¨é¢?ç??ï¼?å¦?æ??å?¯è?½ç??è¯?ï¼?å¿?é¡»ä»?å?¨å±?空é?²æ± ä¸å??å?ºè¯¥é¡µã?? - -ä¸?VMAç??å??å?ç?ç?¥ç?¸å?³ç??空é?²å??表被æ??ç´¢å?°ä¸?个空é?²é¡µã??å¦?æ??æ?¾å?°äº?ä¸?个页é?¢ï¼?å½?该页é?¢ä»?空é?²å??表ä¸ç§»é?¤æ?¶ï¼? -free_huge_pagesç??å?¼è¢«é??å??ã??å¦?æ??æ??ä¸?个ä¸?该页ç?¸å?³ç??é¢?ç??ï¼?å°?è¿?è¡?以ä¸?è°?æ?´:: - - SetPagePrivate(page); /* 表示å??é??è¿?个页é?¢æ¶?è??äº?ä¸?个é¢?ç??ï¼? - * å¦?æ??é??å?°é??误ï¼?以è?³äº?å¿?é¡»é??æ?¾è¿?个页é?¢ï¼?é¢?ç??å°?被 - * æ?¢å¤?ã?? */ - resv_huge_pages--; /* å??å°?å?¨å±?é¢?ç??计æ?° */ - -注æ??ï¼?å¦?æ??æ?¾ä¸?å?°æ»¡è¶³VMAå??å?ç?ç?¥ç??巨页ï¼?å°?å°?è¯?使ç?¨ä¼?ä¼´å??é??å?¨å??é??ä¸?个ã??è¿?就带æ?¥äº?è¶?å?ºé¢?ç??è??å?´ -ç??å?©ä½?巨页å??è¶?é¢?å??é??ç??é?®é¢?ã??å?³ä½¿å??é??äº?ä¸?个å¤?ä½?ç??页é?¢ï¼?ä¹?ä¼?è¿?è¡?ä¸?ä¸?é?¢ä¸?æ ·ç??å?ºäº?é¢?ç??ç??è°?æ?´: -SetPagePrivate(page) å?? resv_huge_pages--. - -å?¨è?·å¾?ä¸?个æ?°ç??巨页å??ï¼?(page)->private被设置为ä¸?该页é?¢ç?¸å?³ç??å?æ± ç??å?¼ï¼?å¦?æ??å®?å?å?¨ç??è¯?ã??å½?页 -é?¢è¢«é??æ?¾æ?¶ï¼?è¿?å°?被ç?¨äº?å?æ± ç??计æ?°ã?? - -ç?¶å??è°?ç?¨å?½æ?°vma_commit_reservation()ï¼?æ ¹æ?®é¢?ç??ç??æ¶?è??æ??å?µè°?æ?´é¢?ç??æ? å°?ã??ä¸?è?¬æ?¥è¯´ï¼?è¿?æ¶?å?? -å?°ç¡®ä¿?页é?¢å?¨å?ºå??æ? å°?ç??file_regionç»?æ??ä½?ä¸è¢«è¡¨ç¤ºã??对äº?é¢?ç??å?å?¨ç??å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?ä¸ç??æ?¡ç?® -å·²ç»?å?å?¨ï¼?æ??以ä¸?å??ä»»ä½?æ?¹å??ã??ç?¶è??ï¼?å¦?æ??å?±äº«æ? å°?ä¸æ²¡æ??é¢?ç??ï¼?æ??è??è¿?æ?¯ä¸?个ç§?æ??æ? å°?ï¼?å??å¿?é¡»å??建ä¸? -个æ?°ç??æ?¡ç?®ã?? - -注æ??ï¼?å¦?æ??æ?¾ä¸?å?°æ»¡è¶³VMAå??å?ç?ç?¥ç??巨页ï¼?å°?å°?è¯?使ç?¨ä¼?ä¼´å??é??å?¨å??é??ä¸?个ã??è¿?就带æ?¥äº?è¶?å?ºé¢?ç??è??å?´ -ç??å?©ä½?巨页å??è¿?度å??é??ç??é?®é¢?ã??å?³ä½¿å??é??äº?ä¸?个å¤?ä½?ç??页é?¢ï¼?ä¹?ä¼?è¿?è¡?ä¸?ä¸?é?¢ä¸?æ ·ç??å?ºäº?é¢?ç??ç??è°?æ?´ã?? -SetPagePrivate(page)å??resv_huge_pages-ã?? - -å?¨è?·å¾?ä¸?个æ?°ç??巨页å??ï¼?(page)->private被设置为ä¸?该页é?¢ç?¸å?³ç??å?æ± ç??å?¼ï¼?å¦?æ??å®?å?å?¨ç??è¯?ã??å½?页 -é?¢è¢«é??æ?¾æ?¶ï¼?è¿?å°?被ç?¨äº?å?æ± ç??计æ?°ã?? - -ç?¶å??è°?ç?¨å?½æ?°vma_commit_reservation()ï¼?æ ¹æ?®é¢?ç??ç??æ¶?è??æ??å?µè°?æ?´é¢?ç??æ? å°?ã??ä¸?è?¬æ?¥è¯´ï¼?è¿?æ¶?å?? -å?°ç¡®ä¿?页é?¢å?¨å?ºå??æ? å°?ç??file_regionç»?æ??ä½?ä¸è¢«è¡¨ç¤ºã??对äº?é¢?ç??å?å?¨ç??å?±äº«æ? å°?ï¼?é¢?ç??æ? å°?ä¸ç??æ?¡ç?® -å·²ç»?å?å?¨ï¼?æ??以ä¸?å??ä»»ä½?æ?¹å??ã??ç?¶è??ï¼?å¦?æ??å?±äº«æ? å°?ä¸æ²¡æ??é¢?ç??ï¼?æ??è??è¿?æ?¯ä¸?个ç§?æ??æ? å°?ï¼?å??å¿?é¡»å??建 -ä¸?个æ?°ç??æ?¡ç?®ã?? - -å?¨alloc_huge_page()å¼?å§?è°?ç?¨vma_needs_reservation()å??页é?¢å??é??å??è°?ç?¨ -vma_commit_reservation()ä¹?é?´ï¼?é¢?ç??æ? å°?æ??å?¯è?½è¢«æ?¹å??ã??å¦?æ??hugetlb_reserve_pageså?¨å?± -享æ? å°?ä¸ä¸ºå??ä¸?页é?¢è¢«è°?ç?¨ï¼?è¿?å°?æ?¯å?¯è?½ç??ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?é¢?ç??计æ?°å??å?æ± ç©ºé?²é¡µè®¡æ?°ä¼?æ??ä¸?个å??å·®ã?? -è¿?ç§?ç½?è§?ç??æ??å?µå?¯ä»¥é??è¿?æ¯?è¾?vma_needs_reservationå??vma_commit_reservationç??è¿?å??å?¼æ?¥ -è¯?å?«ã??å¦?æ??æ£?æµ?å?°è¿?ç§?ç«?äº?ï¼?å?æ± å??å?¨å±?é¢?ç??计æ?°å°?被è°?æ?´ä»¥è¿?è¡?è¡¥å?¿ã??å?³äº?è¿?äº?å?½æ?°ç??æ?´å¤?ä¿¡æ?¯ï¼?请 -å??è§? :ref:`é¢?ç??æ? å°?帮å?©å?½æ?° <resv_map_helpers>` ä¸?è??ã?? - - -å®?ä¾?å??巨页 -========== - -å?¨å·¨é¡µå??é??ä¹?å??ï¼?页é?¢é??常被添å? å?°å??é??ä»»å?¡ç??页表ä¸ã??å?¨æ¤ä¹?å??ï¼?å?±äº«æ? å°?ä¸ç??页é?¢è¢«æ·»å? å?°é¡µé?¢ç¼? -å?ä¸ï¼?ç§?æ??æ? å°?ä¸ç??页é?¢è¢«æ·»å? å?°å?¿å??å??å??æ? å°?ä¸ã??å?¨è¿?两ç§?æ??å?µä¸?ï¼?PagePrivateæ ?å¿?被æ¸?é?¤ã??å? æ¤ï¼? -å½?ä¸?个已ç»?å®?ä¾?å??ç??巨页被é??æ?¾æ?¶ï¼?ä¸?ä¼?对å?¨å±?é¢?ç??计æ?°ï¼?resv_huge_pagesï¼?è¿?è¡?è°?æ?´ã?? - - -é??æ?¾å·¨é¡µ -======== - -巨页é??æ?¾æ?¯ç?±å?½æ?°free_huge_page()æ?§è¡?ç??ã??è¿?个å?½æ?°æ?¯hugetlbfså¤?å??页ç??æ??æ??å?¨ã??å? æ¤ï¼?å®?å?ªä¼ -é??ä¸?个æ??å??页é?¢ç»?æ??ä½?ç??æ??é??ã??å½?ä¸?个巨页被é??æ?¾æ?¶ï¼?å?¯è?½é??è¦?è¿?è¡?é¢?ç??计ç®?ã??å¦?æ??该页ä¸?å??å?«ä¿? -ç??ç??å?æ± ç?¸å?³è??ï¼?æ??è??该页å?¨é??误路å¾?ä¸?被é??æ?¾ï¼?å¿?é¡»æ?¢å¤?å?¨å±?é¢?ç??计æ?°ï¼?å°±ä¼?å?ºç?°è¿?ç§?æ??å?µã?? - -page->privateå?段æ??å??ä¸?该页ç?¸å?³ç??ä»»ä½?å?æ± ã??å¦?æ??PagePrivateæ ?å¿?被设置ï¼?å®?表æ??å?¨å±?é¢?ç??计æ?° -åº?该被è°?æ?´ï¼?å?³äº?å¦?ä½?设置è¿?äº?æ ?å¿?ç??ä¿¡æ?¯ï¼?请å??è§? -:ref: `æ¶?è??é¢?ç??/å??é??ä¸?个巨页 <consume_resv>` ï¼?ã?? - - -该å?½æ?°é¦?å??è°?ç?¨hugepage_subpool_put_pages()æ?¥å¤?ç??该页ã??å¦?æ??è¿?个å?½æ?°è¿?å??ä¸?个0ç??å?¼ï¼?ä¸?ç?äº? -ä¼ é??ç??1ç??å?¼ï¼?ï¼?å®?表æ??é¢?ç??ä¸?å?æ± ç?¸å?³è??ï¼?è¿?个æ?°é??æ?¾ç??页é?¢å¿?须被ç?¨æ?¥ä¿?æ??å?æ± é¢?ç??ç??æ?°é??è¶?è¿?æ??å°?å?¼ã?? -å? æ¤ï¼?å?¨è¿?ç§?æ??å?µä¸?ï¼?å?¨å±?resv_huge_pages计æ?°å?¨è¢«é??å¢?ã?? - -å¦?æ??页é?¢ä¸è®¾ç½®äº?PagePrivateæ ?å¿?ï¼?é?£ä¹?å?¨å±?resv_huge_pages计æ?°å?¨å°?æ°¸è¿?被é??å¢?ã?? - -å?æ± é¢?ç?? -======== - -æ??ä¸?个ç»?æ??ä½?hstateä¸?æ¯?个巨页尺寸ç?¸å?³è??ã??hstateè·?踪æ??æ??æ??å®?大å°?ç??巨页ã??ä¸?个å?æ± ä»£è¡¨ä¸? -个hstateä¸ç??页é?¢å?é??ï¼?å®?ä¸?ä¸?个已æ??è½½ç??hugetlbfsæ??件系ç»?ç?¸å?³ - -å½?ä¸?个hugetlbfsæ??件系ç»?被æ??è½½æ?¶ï¼?å?¯ä»¥æ??å®?min_sizeé??项ï¼?å®?表示æ??件系ç»?æ??é??ç??æ??å°?ç??巨页æ?°é??ã?? -å¦?æ??æ??å®?äº?è¿?个é??项ï¼?ä¸?min_sizeç?¸å¯¹åº?ç??巨页ç??æ?°é??å°?被é¢?ç??ç»?æ??件系ç»?使ç?¨ã??è¿?个æ?°å?å?¨ç»?æ??ä½? -hugepage_subpoolç??min_hpageså?段ä¸è¢«è·?踪ã??å?¨æ??è½½æ?¶ï¼?hugetlb_acct_memory(min_hpages) -被è°?ç?¨ä»¥é¢?ç??æ??å®?æ?°é??ç??巨页ã??å¦?æ??å®?们ä¸?è?½è¢«é¢?ç??ï¼?æ??载就ä¼?失败ã?? - -å½?ä»?å?æ± ä¸è?·å??æ??é??æ?¾é¡µé?¢æ?¶ï¼?ä¼?è°?ç?¨hugepage_subpool_get/put_pages()å?½æ?°ã?? -hugepage_subpool_get/put_pagesè¢«ä¼ é??ç»?巨页æ?°é??ï¼?以æ¤æ?¥è°?æ?´å?æ± ç?? â??å·²ç?¨é¡µé?¢â?? 计æ?° -ï¼?get为ä¸?é??ï¼?put为ä¸?å??ï¼?ã??é??常æ??å?µä¸?ï¼?å¦?æ??å?æ± ä¸æ²¡æ??足å¤?ç??页é?¢ï¼?å®?们ä¼?è¿?å??ä¸?ä¼ é??ç??ç?¸å??ç??å?¼æ?? -ä¸?个é??误ã?? - -ç?¶è??ï¼?å¦?æ??é¢?ç??ä¸?å?æ± ç?¸å?³è??ï¼?å?¯è?½ä¼?è¿?å??ä¸?个å°?äº?ä¼ é??å?¼ç??è¿?å??å?¼ã??è¿?个è¿?å??å?¼è¡¨ç¤ºå¿?é¡»è¿?è¡?ç??é¢?å¤?å?¨å±? -æ± è°?æ?´ç??æ?°é??ã??ä¾?å¦?ï¼?å??设ä¸?个å?æ± å??å?«3个é¢?ç??ç??巨页ï¼?æ??人è¦?æ±?5个ã??ä¸?å?æ± ç?¸å?³ç??3个é¢?ç??页å?¯ä»¥ç?¨æ?¥ -满足é?¨å??请æ±?ã??ä½?æ?¯ï¼?å¿?é¡»ä»?å?¨å±?æ± ä¸è?·å¾?2个页é?¢ã??为äº?å??è°?ç?¨è??转达è¿?ä¸?ä¿¡æ?¯ï¼?å°?è¿?å??å?¼2ã??ç?¶å??ï¼?è°?ç?¨ -è??è¦?è´?è´£ä»?å?¨å±?æ± ä¸è?·å??å?¦å¤?两个页é?¢ã?? - - -COWå??é¢?ç?? -========== - -ç?±äº?å?±äº«æ? å°?é?½æ??å??并使ç?¨ç?¸å??ç??åº?å±?页é?¢ï¼?COWæ??大ç??é¢?ç??é?®é¢?æ?¯ç§?æ??æ? å°?ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?两个任å?¡å?¯ -以æ??å??å??ä¸?个å??å??å??é??ç??页é?¢ã??ä¸?个任å?¡è¯?å?¾å??å?°è¯¥é¡µï¼?æ??以å¿?é¡»å??é??ä¸?个æ?°ç??页ï¼?以便æ¯?个任å?¡é?½æ??å??å®? -è?ªå·±ç??页ã?? - -å½?该页æ??å??被å??é??æ?¶ï¼?该页ç??é¢?ç??被æ¶?è??äº?ã??å½?ç?±äº?COWè??è¯?å?¾å??é??ä¸?个æ?°ç??页é?¢æ?¶ï¼?æ??å?¯è?½æ²¡æ??空é?²ç??å·¨ -页ï¼?å??é??ä¼?失败ã?? - -å½?æ??å??å??建ç§?æ??æ? å°?æ?¶ï¼?é??è¿?设置æ??æ??è??ç??é¢?ç??æ? å°?æ??é??ä¸ç??HPAGE_RESV_OWNERä½?æ?¥æ ?è®°æ? å°?ç??æ??æ??è??ã?? -ç?±äº?æ??æ??è??å??建äº?æ? å°?ï¼?æ??æ??è??æ?¥æ??ä¸?æ? å°?ç?¸å?³ç??æ??æ??é¢?ç??ã??å? æ¤ï¼?å½?ä¸?个å??å¼?常å??ç??并ä¸?没æ??å?¯ç?¨ç??页é?¢ -æ?¶ï¼?对é¢?ç??ç??æ??æ??è??å??é??æ??æ??è??é??å??ä¸?å??ç??è¡?å?¨ã?? - -å?¨å??ç??å¼?常ç??ä»»å?¡ä¸?æ?¯æ??æ??è??ç??æ??å?µä¸?ï¼?å¼?常å°?失败ï¼?该任å?¡é??常ä¼?æ?¶å?°ä¸?个SIGBUSã?? - -å¦?æ??æ??æ??è??æ?¯å??ç??å¼?常ç??ä»»å?¡ï¼?æ??们å¸?æ??å®?è?½å¤?æ??å??ï¼?å? 为å®?æ?¥æ??å??å§?ç??é¢?ç??ã??为äº?è¾¾å?°è¿?个ç?®ç??ï¼?该页被 -ä»?é??æ??æ??è??ä»»å?¡ä¸è§£æ? å°?å?ºæ?¥ã??è¿?æ ·ä¸?æ?¥ï¼?å?¯ä¸?ç??å¼?ç?¨å°±æ?¯æ?¥è?ªæ?¥æ??è??ç??ä»»å?¡ã??æ¤å¤?ï¼?HPAGE_RESV_UNMAPPED -ä½?被设置å?¨é??æ?¥æ??ä»»å?¡ç??é¢?ç??æ? å°?æ??é??ä¸ã??å¦?æ??é??æ?¥æ??è??ä»»å?¡å??æ?¥å?¨ä¸?个ä¸?å?å?¨ç??页é?¢ä¸?å??ç??å¼?常ï¼?å®?å?¯è?½ -ä¼?æ?¶å?°ä¸?个SIGBUSã??ä½?æ?¯ï¼?æ? å°?/é¢?ç??ç??å??å§?æ?¥æ??è??ç??è¡?为å°?ä¸?é¢?æ??ä¸?è?´ã?? - -é¢?ç??æ? å°?ç??ä¿®æ?¹ -============== - -以ä¸?ä½?级å?½æ?°ç?¨äº?对é¢?ç??æ? å°?è¿?è¡?ä¿®æ?¹ã??é??常æ??å?µä¸?ï¼?è¿?äº?å?½æ?°ä¸?ä¼?被ç?´æ?¥è°?ç?¨ã??è??æ?¯è°?ç?¨ä¸?个é¢?ç??æ? å°?è¾? -å?©å?½æ?°ï¼?该å?½æ?°è°?ç?¨è¿?äº?ä½?级å?½æ?°ä¸ç??ä¸?个ã??è¿?äº?ä½?级å?½æ?°å?¨æº?代ç ?ï¼?mm/hugetlb.cï¼?ä¸å¾?å?°äº?ç?¸å½?好ç?? -è®°å½?ã??è¿?äº?å?½æ?°æ?¯:: - - long region_chg(struct resv_map *resv, long f, long t); - long region_add(struct resv_map *resv, long f, long t); - void region_abort(struct resv_map *resv, long f, long t); - long region_count(struct resv_map *resv, long f, long t); - -å?¨é¢?ç??æ? å°?ä¸?ç??æ??ä½?é??常æ¶?å??两个æ??ä½?: - -1) region_chg()被è°?ç?¨æ?¥æ£?æ?¥é¢?ç??æ? å°?ï¼?并确å®?å?¨æ??å®?ç??è??å?´[f, t]å??æ??å¤?å°?页ç?®å??没æ??被代表ã?? - - è°?ç?¨ä»£ç ?æ?§è¡?å?¨å±?æ£?æ?¥å??å??é??ï¼?以确å®?æ?¯å?¦æ??足å¤?ç??巨页使æ??ä½?æ??å??ã?? - -2) - a) å¦?æ??æ??ä½?è?½å¤?æ??å??ï¼?regi_add()å°?被è°?ç?¨ï¼?以å®?é??ä¿®æ?¹å??å??ä¼ é??ç»?regi_chg()ç??ç?¸å??è??å?´ - [f, t]ç??é¢?ç??æ? å°?ã?? - b) å¦?æ??æ??ä½?ä¸?è?½æ??å??ï¼?region_abort被è°?ç?¨ï¼?å?¨ç?¸å??ç??è??å?´[f, t]å??ä¸æ¢æ??ä½?ã?? - -注æ??ï¼?è¿?æ?¯ä¸?个两æ¥ç??è¿?ç¨?ï¼? region_add()å?? region_abort()å?¨äº?å??è°?ç?¨ region_chg()å??ä¿?è¯? -æ??å??ã?? region_chg()è´?è´£é¢?å??å??é??ä»»ä½?å¿?è¦?ç??æ?°æ?®ç»?æ??以确ä¿?å??ç»æ??ä½?ï¼?ç?¹å?«æ?¯ region_add()ï¼?ç?? -æ??å??ã?? - -å¦?ä¸?æ??è¿°ï¼?region_chg()ç¡®å®?该è??å?´å??å½?å??没æ??å?¨æ? å°?ä¸è¡¨ç¤ºç??页é?¢ç??æ?°é??ã??region_add()è¿?å??æ·»å? -å?°æ? å°?ä¸ç??è??å?´å??ç??页æ?°ã??å?¨å¤§å¤?æ?°æ??å?µä¸?ï¼? region_add() ç??è¿?å??å?¼ä¸? region_chg() ç??è¿?å??å?¼ç?¸ -å??ã??ç?¶è??ï¼?å?¨å?±äº«æ? å°?ç??æ??å?µä¸?ï¼?æ??å?¯è?½å?¨è°?ç?¨ region_chg() å?? region_add() ä¹?é?´å¯¹é¢?ç??æ? å°?è¿? -è¡?æ?´æ?¹ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?regi_add()ç??è¿?å??å?¼å°?ä¸?regi_chg()ç??è¿?å??å?¼ä¸?符ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?å?¨å±?计æ?° -å??å?æ± è®¡æ?°å¾?å?¯è?½æ?¯ä¸?æ£ç¡®ç??ï¼?é??è¦?è°?æ?´ã??æ£?æ?¥è¿?ç§?æ??å?µå¹¶è¿?è¡?é??å½?ç??è°?æ?´æ?¯è°?ç?¨è??ç??责任ã?? - -å?½æ?°region_del()被è°?ç?¨ä»¥ä»?é¢?ç??æ? å°?ä¸ç§»é?¤å?ºå??ã?? -å®?é??常å?¨ä»¥ä¸?æ??å?µä¸?被è°?ç?¨: - -- å½?hugetlbfsæ??件系ç»?ä¸ç??ä¸?个æ??件被å? é?¤æ?¶ï¼?该è??ç?¹å°?被é??æ?¾ï¼?é¢?ç??æ? å°?ä¹?被é??æ?¾ã??å?¨é??æ?¾é¢?ç??æ? å°? - ä¹?å??ï¼?æ??æ??å??ç?¬ç??file_regionç»?æ??ä½?å¿?须被é??æ?¾ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?region_delç??è??å?´æ?¯[0, LONG_MAX]ã?? -- å½?ä¸?个hugetlbfsæ??件æ£å?¨è¢«æ?ªæ?æ?¶ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?æ??æ??å?¨æ?°æ??件大å°?ä¹?å??å??é??ç??页é?¢å¿?须被é??æ?¾ã?? - æ¤å¤?ï¼?é¢?ç??æ? å°?ä¸ä»»ä½?è¶?è¿?æ?°æ??件大å°?ç??file_regionæ?¡ç?®å¿?须被å? é?¤ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?region_del - ç??è??å?´æ?¯[new_end_of_file, LONG_MAX]ã?? -- å½?å?¨ä¸?个hugetlbfsæ??件ä¸æ??æ´?æ?¶ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?巨页被ä¸?次次ä»?æ??件ç??ä¸é?´ç§»é?¤ã??å½?è¿?äº?页被移é?¤ - æ?¶ï¼?region_del()被è°?ç?¨ä»¥ä»?é¢?ç??æ? å°?ä¸ç§»é?¤ç?¸åº?ç??æ?¡ç?®ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?region_delè¢«ä¼ é??ç??è?? - å?´æ?¯[page_idx, page_idx + 1]ã?? - -å?¨ä»»ä½?æ??å?µä¸?ï¼?region_del()é?½ä¼?è¿?å??ä»?é¢?ç??æ? å°?ä¸å? é?¤ç??页é?¢æ?°é??ã??å?¨é??常ç½?è§?ç??æ??å?µä¸?ï¼?region_del() -ä¼?失败ã??è¿?å?ªè?½å??ç??å?¨æ??æ´?ç??æ??å?µä¸?ï¼?å?³å®?å¿?é¡»å??å?²ä¸?个ç?°æ??ç??file_regionæ?¡ç?®ï¼?è??ä¸?è?½å??é??ä¸?个æ?°ç?? -ç»?æ??ä½?ã??å?¨è¿?ç§?é??误æ??å?µä¸?ï¼?region_del()å°?è¿?å??-ENOMEMã??è¿?é??ç??é?®é¢?æ?¯ï¼?é¢?ç??æ? å°?å°?æ?¾ç¤ºå¯¹è¯¥é¡µæ?? -é¢?ç??ã??ç?¶è??ï¼?å?æ± å??å?¨å±?é¢?ç??计æ?°å°?ä¸?å??æ? 该é¢?ç??ã??为äº?å¤?ç??è¿?ç§?æ??å?µï¼?è°?ç?¨å?½æ?°hugetlb_fix_reserve_counts() -æ?¥è°?æ?´è®¡æ?°å?¨ï¼?使å?¶ä¸?ä¸?è?½è¢«å? é?¤ç??é¢?ç??æ? å°?æ?¡ç?®ç?¸å¯¹åº?ã?? - -region_count()å?¨è§£é?¤ç§?æ??巨页æ? å°?æ?¶è¢«è°?ç?¨ã??å?¨ç§?æ??æ? å°?ä¸ï¼?é¢?ç??æ? å°?ä¸æ²¡æ??æ?¡ç?®è¡¨æ??å?å?¨ä¸?个é¢?ç??ã?? -å? æ¤ï¼?é??è¿?计ç®?é¢?ç??æ? å°?ä¸ç??æ?¡ç?®æ?°ï¼?æ??们ç?¥é??æ??å¤?å°?é¢?ç??被æ¶?è??äº?ï¼?æ??å¤?å°?é¢?ç??æ?¯æ?ªå®?æ??ç?? -ï¼?Outstanding = (end - start) - region_countï¼?resv, start, endï¼?ï¼?ã??ç?±äº?æ? å°?æ£å?¨æ¶? -失ï¼?å?æ± å??å?¨å±?é¢?ç??计æ?°è¢«æ?ªå®?æ??ç??é¢?ç??æ?°é??æ??å??å?»ã?? - -é¢?ç??æ? å°?帮å?©å?½æ?° -================ - -æ??å? 个è¾?å?©å?½æ?°å?¯ä»¥æ?¥è¯¢å??ä¿®æ?¹é¢?ç??æ? å°?ã??è¿?äº?å?½æ?°å?ªå¯¹ç?¹å®?ç??巨页ç??é¢?ç??æ??å?´è¶£ï¼?æ??以å®?们å?ªæ?¯ä¼ å?¥ä¸?个 -å?°å??è??ä¸?æ?¯ä¸?个è??å?´ã??æ¤å¤?ï¼?å®?们è¿?ä¼ å?¥ç?¸å?³ç??VMAã??ä»?VMAä¸ï¼?å?¯ä»¥ç¡®å®?æ? å°?ç??ç±»å??ï¼?ç§?æ??æ??å?±äº«ï¼?å??é¢?ç?? -æ? å°?ç??ä½?ç½®ï¼?inodeæ??VMAï¼?ã??è¿?äº?å?½æ?°å?ªæ?¯è°?ç?¨ â??é¢?ç??æ? å°?ç??ä¿®æ?¹â?? ä¸?è??ä¸æ??è¿°ç??å?ºç¡?å?½æ?°ã??ç?¶è??ï¼? -å®?们确å®?è??è??å?°äº?ç§?æ??å??å?±äº«æ? å°?ç??é¢?ç??æ? å°?æ?¡ç?®ç?? â??ç?¸å??â?? å?«ä¹?ï¼?并å??è°?ç?¨è??é??è??äº?è¿?个ç»?è??:: - - long vma_needs_reservation(struct hstate *h, - struct vm_area_struct *vma, - unsigned long addr) - -该å?½æ?°ä¸ºæ??å®?ç??页é?¢è°?ç?¨ region_chg()ã??å¦?æ??ä¸?å?å?¨é¢?ç??ï¼?å??è¿?å??1ã??å¦?æ??å?å?¨é¢?ç??ï¼?å??è¿?å??0:: - - long vma_commit_reservation(struct hstate *h, - struct vm_area_struct *vma, - unsigned long addr) - -è¿?å°?è°?ç?¨ region_add()ï¼?ç?¨äº?æ??å®?ç??页é?¢ã??ä¸?region_chgå??region_addç??æ??å?µä¸?æ ·ï¼?该å?½æ?°åº?å?¨ -å??å??è°?ç?¨ç??vma_needs_reservationå??è°?ç?¨ã??å®?å°?为该页添å? ä¸?个é¢?ç??æ?¡ç?®ã??å¦?æ??é¢?ç??被添å? ï¼?å®?å°? -è¿?å??1ï¼?å¦?æ??没æ??å??è¿?å??0ã??è¿?å??å?¼åº?ä¸?ä¹?å??è°?ç?¨vma_needs_reservationç??è¿?å??å?¼è¿?è¡?æ¯?è¾?ã??å¦?æ??å?º -ç?°æ??å¤?ç??å·®å¼?ï¼?说æ??å?¨ä¸¤æ¬¡è°?ç?¨ä¹?é?´ä¿®æ?¹äº?é¢?ç??æ? å°?:: - - void vma_end_reservation(struct hstate *h, - struct vm_area_struct *vma, - unsigned long addr) - -è¿?å°?è°?ç?¨æ??å®?页é?¢ç?? region_abort()ã??ä¸?region_chgå??region_abortç??æ??å?µä¸?æ ·ï¼?该å?½æ?°åº?å?¨ -å??å??è°?ç?¨ç??vma_needs_reservationå??被è°?ç?¨ã??å®?å°?ä¸æ¢/ç»?æ??æ£å?¨è¿?è¡?ç??é¢?ç??æ·»å? æ??ä½?:: - - long vma_add_reservation(struct hstate *h, - struct vm_area_struct *vma, - unsigned long addr) - -è¿?æ?¯ä¸?个ç?¹æ®?ç??å??è£?å?½æ?°ï¼?æ??å?©äº?å?¨é??误路å¾?ä¸?æ¸?ç??é¢?ç??ã??å®?å?ªä»?repare_reserve_on_error()å?½æ?° -ä¸è°?ç?¨ã??该å?½æ?°ä¸?vma_needs_reservationä¸?起使ç?¨ï¼?è¯?å?¾å°?ä¸?个é¢?ç??æ·»å? å?°é¢?ç??æ? å°?ä¸ã??å®?è??è??å?° -äº?ç§?æ??å??å?±äº«æ? å°?ç??ä¸?å??é¢?ç??æ? å°?è¯ä¹?ã??å? æ¤ï¼?region_add被è°?ç?¨ç?¨äº?å?±äº«æ? å°?ï¼?å? 为æ? å°?ä¸ç??æ?¡ç?®è¡¨ -示é¢?ç??ï¼?ï¼?è??region_del被è°?ç?¨ç?¨äº?ç§?æ??æ? å°?ï¼?å? 为æ? å°?ä¸æ²¡æ??æ?¡ç?®è¡¨ç¤ºé¢?ç??ï¼?ã??å?³äº?å?¨é??误路å¾?ä¸?é?? -è¦?å??ä»?ä¹?ç??æ?´å¤?ä¿¡æ?¯ï¼?请å??è§? â??é??误路å¾?ä¸ç??é¢?ç??æ¸?ç??â?? ã?? - - -é??误路å¾?ä¸ç??é¢?ç??æ¸?ç?? -==================== - -æ£å¦?å?¨:ref:`é¢?ç??æ? å°?帮å?©å?½æ?°<resv_map_helpers>` ä¸?è??ä¸æ??å?°ç??ï¼?é¢?ç??ç??ä¿®æ?¹å??两æ¥è¿?è¡?ã??é¦? -å??ï¼?å?¨å??é??页é?¢ä¹?å??è°?ç?¨vma_needs_reservationã??å¦?æ??å??é??æ??å??ï¼?å??è°?ç?¨vma_commit_reservationã?? -å¦?æ??ä¸?æ?¯ï¼?å??è°?ç?¨vma_end_reservationã??å?¨å±?å??å?æ± ç??é¢?ç??计æ?°æ ¹æ?®æ??ä½?ç??æ??å??æ??失败è¿?è¡?è°?æ?´ï¼? -ä¸?å??é?½å¾?好ã?? - -æ¤å¤?ï¼?å?¨ä¸?个巨页被å®?ä¾?å??å??ï¼?PagePrivateæ ?å¿?被æ¸?空ï¼?è¿?æ ·ï¼?å½?页é?¢æ??ç»?被é??æ?¾æ?¶ï¼?计æ?°æ?¯ -æ£ç¡®ç??ã?? - -ç?¶è??ï¼?æ??å? ç§?æ??å?µæ?¯ï¼?å?¨ä¸?个巨页被å??é??å??ï¼?ä½?å?¨å®?被å®?ä¾?å??ä¹?å??ï¼?å°±é??å?°äº?é??误ã??å?¨è¿?ç§?æ??å?µä¸?ï¼? -页é?¢å??é??å·²ç»?æ¶?è??äº?é¢?ç??ï¼?并è¿?è¡?äº?é??å½?ç??å?æ± ã??é¢?ç??æ? å°?å??å?¨å±?计æ?°è°?æ?´ã??å¦?æ??页é?¢å?¨è¿?个æ?¶å??被é??æ?¾ -ï¼?å?¨å®?ä¾?å??å??æ¸?é?¤PagePrivateä¹?å??ï¼?ï¼?é?£ä¹?free_huge_pageå°?å¢?å? å?¨å±?é¢?ç??计æ?°ã??ç?¶è??ï¼?é¢?ç??æ? å°? -æ?¾ç¤ºæ?¥ç??被æ¶?è??äº?ã??è¿?ç§?ä¸?ä¸?è?´ç??ç?¶æ??å°?导è?´é¢?ç??ç??巨页ç?? â??æ³?æ¼?â?? ã??å?¨å±?é¢?ç??计æ?°å°?æ¯?å®?å??æ?¬ç??è¦?é«?ï¼? -并é?»æ¢å??é??ä¸?个é¢?å??å??é??ç??页é?¢ã?? - -å?½æ?° restore_reserve_on_error() è¯?å?¾å¤?ç??è¿?ç§?æ??å?µã??å®?æ??ç?¸å½?å®?å??ç??æ??æ¡£ã??è¿?个å?½æ?°ç??ç?®ç?? -æ?¯å°?é¢?ç??æ? å°?æ?¢å¤?å?°é¡µé?¢å??é??å??ç??ç?¶æ??ã??é??è¿?è¿?ç§?æ?¹å¼?ï¼?é¢?ç??æ? å°?ç??ç?¶æ??å°?ä¸?页é?¢é??æ?¾å??ç??å?¨å±?é¢?ç??计 -æ?°ç?¸å¯¹åº?ã?? - -å?½æ?°restore_reserve_on_erroræ?¬èº«å?¨è¯?å?¾æ?¢å¤?é¢?ç??æ? å°?æ?¡ç?®æ?¶å?¯è?½ä¼?é??å?°é??误ã??å?¨è¿?ç§?æ??å?µä¸?ï¼? -å®?å°?ç®?å??å?°æ¸?é?¤è¯¥é¡µç??PagePrivateæ ?å¿?ã??è¿?æ ·ä¸?æ?¥ï¼?å½?页é?¢è¢«é??æ?¾æ?¶ï¼?å?¨å±?é¢?ç??计æ?°å°?ä¸?ä¼?被é??å¢?ã?? -ç?¶è??ï¼?é¢?ç??æ? å°?å°?继ç»ç??èµ·æ?¥å??é¢?ç??被æ¶?è??äº?ä¸?æ ·ã??ä¸?个页é?¢ä»?ç?¶å?¯ä»¥è¢«å??é??å?°è¯¥å?°å??ï¼?ä½?å®?ä¸?ä¼?å??æ?? -å??设æ?³ç??é?£æ ·ä½¿ç?¨ä¸?个é¢?ç??页ã?? - -æ??ä¸?äº?代ç ?ï¼?æ??æ??æ?¾ç??æ?¯userfaultfdï¼?ä¸?è?½è°?ç?¨restore_reserve_on_errorã??å?¨è¿?ç§?æ??å?µä¸?ï¼? -å®?ç®?å??å?°ä¿®æ?¹äº?PagePrivateï¼?以便å?¨é??æ?¾å·¨é¡µæ?¶ä¸?ä¼?æ³?é?²é¢?ç??ã?? - - -é¢?ç??å??å??å?ç?ç?¥ -============== -å½?git第ä¸?次被ç?¨æ?¥ç®¡ç??Linux代ç ?æ?¶ï¼?æ¯?个è??ç?¹ç??巨页å??表就å?å?¨äº?hstateç»?æ??ä¸ã??é¢?ç??ç??æ¦?念æ?¯ -å?¨ä¸?段æ?¶é?´å??å? å?¥ç??ã??å½?é¢?ç??被添å? æ?¶ï¼?没æ??å°?è¯?å°?å??å?ç?ç?¥è??è??å?¨å??ã??è?½ç?¶cpusetsä¸?å??å?ç?ç?¥ä¸? -å®?å?¨ç?¸å??ï¼?ä½?hugetlb_acct_memoryä¸ç??è¿?个注é??æ?»ç»?äº?é¢?ç??å??cpusets/å??å?ç?ç?¥ä¹?é?´ç??ç?¸äº?ä½? -ç?¨:: - - - /* - * å½?cpuset被é??ç½®æ?¶ï¼?å®?æ??ç ´äº?ä¸¥æ ¼ç??hugetlb页é?¢é¢?ç??ï¼?å? 为计æ?°æ?¯å?¨ä¸?个å?¨å±?å??é??ä¸?å®? - * æ??ç??ã??å?¨æ??cpusetç??æ??å?µä¸?ï¼?è¿?æ ·ç??é¢?ç??å®?å?¨æ?¯å??å?¾ï¼?å? 为é¢?ç??没æ??æ ¹æ?®å½?å??cpusetç?? - * 页é?¢å?¯ç?¨æ?§æ?¥æ£?æ?¥ã??å?¨ä»»å?¡æ??å?¨ç??cpusetä¸ç¼ºä¹?空é?²ç??htlb页é?¢æ?¶ï¼?åº?ç?¨ç¨?åº?ä»?ç?¶æ??å?¯è?½ - * 被å??æ ¸OOM'edã??è¯?å?¾ç?¨cpusetæ?¥æ?§è¡?ä¸¥æ ¼ç??计æ?°å? ä¹?æ?¯ä¸?å?¯è?½ç??ï¼?æ??è??说太é?¾ç??äº?ï¼?ï¼?å? - * 为cpuset太ä¸?稳å®?äº?ï¼?ä»»å?¡æ??å??å?è??ç?¹å?¯ä»¥å?¨cpusetä¹?é?´å?¨æ??移å?¨ã??ä¸?cpusetå?±äº« - * hugetlbæ? å°?ç??è¯ä¹?å??å??æ?¯ä¸?å?¯å??ç??ã??ç?¶è??ï¼?为äº?é¢?ç??ä¸?äº?è¯ä¹?ï¼?æ??们é??å??å?°æ£?æ?¥å½?å??空é?² - * 页ç??å?¯ç?¨æ?§ï¼?ä½?为ä¸?ç§?æ??好ç??å°?è¯?ï¼?å¸?æ??è?½å°?cpusetæ?¹å??è¯ä¹?ç??å½±å??é??å?°æ??ä½?ã?? - */ - -æ·»å? 巨页é¢?ç??æ?¯ä¸ºäº?é?²æ¢å?¨ç¼ºé¡µå¼?常æ?¶å?ºç?°æ??å¤?ç??页é?¢å??é??失败ï¼?OOMï¼?ã??ç?¶è??ï¼?å¦?æ??ä¸?个åº?ç?¨ -ç¨?åº?使ç?¨cpusetsæ??å??å?ç?ç?¥ï¼?å°±ä¸?è?½ä¿?è¯?å?¨æ??é??ç??è??ç?¹ä¸?æ??巨页å?¯ç?¨ã??å?³ä½¿æ??足å¤?æ?°é??ç??å?¨å±? -é¢?ç??ï¼?ä¹?æ?¯å¦?æ¤ã?? - -Hugetlbfså??å½?æµ?è¯? -================= - -æ??å®?æ?´ç??hugetlbæµ?è¯?é??å?¨libhugetlbfsä»?åº?ã??å¦?æ??ä½ ä¿®æ?¹äº?ä»»ä½?hugetlbç?¸å?³ç??代ç ?ï¼?请使ç?¨ -libhugetlbfsæµ?è¯?å¥?件æ?¥æ£?æ?¥å??å½?æ??å?µã??æ¤å¤?ï¼?å¦?æ??ä½ æ·»å? äº?ä»»ä½?æ?°ç??hugetlbå??è?½ï¼?请å?¨ -libhugetlbfsä¸æ·»å? é??å½?ç??æµ?è¯?ã?? - --- -Mike Kravetzï¼?2017å¹´4æ??7æ?¥ --- a/Documentation/translations/zh_CN/vm/hwpoison.rst +++ /dev/null @@ -1,166 +0,0 @@ - -:Original: Documentation/vm/hwpoison.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -======== -hwpoison -======== - -ä»?ä¹?æ?¯hwpoison? -=============== - - -å?³å°?æ?¨å?ºç??è?±ç?¹å°?CPUæ?¯æ??ä»?ä¸?äº?å??å?é??误ä¸æ?¢å¤?ï¼? ``MCAæ?¢å¤?`` ï¼?ã??è¿?é??è¦?æ??ä½?ç³»ç»?宣å¸? -ä¸?个页é?¢"poisoned"ï¼?æ??æ»ä¸?ä¹?ç?¸å?³ç??è¿?ç¨?ï¼?并é?¿å??å?¨æ?ªæ?¥ä½¿ç?¨å®?ã?? - -è¿?个补ä¸?å??å?¨è??æ??æ?ºä¸å®?ç?°äº?å¿?è¦?ç??(ç¼?ç¨?)æ¡?æ?¶ã?? - -å¼?ç?¨æ¦?è¿°ä¸ç??è¯?论:: - - é«?级æ?ºå?¨ç??æ£?æ?¥ä¸?å¤?ç??ã??å¤?ç??æ?¹æ³?æ?¯æ??å??ç??页é?¢è¢«ç¡¬ä»¶æ?¥å??ï¼?é??常æ?¯ç?±äº?2ä½?ECCå?? - å?æ??é«?é??ç¼?å?æ??é??ã?? - - è¿?主è¦?æ?¯é??对å?¨å??å?°æ£?æµ?å?°ç??æ??å??ç??页é?¢ã??å½?å½?å??ç??CPUè¯?å?¾è®¿é?®å®?æ?¶ï¼?å½?å??è¿?è¡?ç??è¿?ç¨? - å?¯ä»¥ç?´æ?¥è¢«æ??æ»ã??å? 为è¿?没æ??访é?®æ??å??ç??页é?¢, å¦?æ??é??误ç?±äº?æ??ç§?å??å? ä¸?è?½è¢«å¤?ç??ï¼?å°±å?¯ - 以å®?å?¨å?°å¿½ç?¥å®?. è??ä¸?æ?¯ç?¨å?¦å¤?ä¸?个æ?ºå?¨æ£?æ?¥å?»å¤?ç??å®?ã?? - - å¤?ç??ä¸?å??ç?¶æ??ç??页é?¢ç¼?å?页ã??è¿?é??æ£?æ??ç??é?¨å??æ?¯ï¼?ç?¸å¯¹äº?å?¶ä»?è??æ??å??å?ç?¨æ?·ï¼? æ??们å?¯ä»¥å¼? - æ¥è®¿é?®ä»»ä½?页é?¢ã??å? 为å??å?æ??é??å?¯è?½é??æ?¶é??å?°å??ç??ï¼?å?¯è?½è¿?å??äº?ä»?们ç??ä¸?äº?å??设ã??è¿?å°±æ?¯ - 为ä»?ä¹?è¿?段代ç ?å¿?é¡»é??常å°?å¿?ã??ä¸?è?¬æ?¥è¯´ï¼?å®?è¯?å?¾ä½¿ç?¨æ£å¸¸ç??é??è§?å??ï¼?å¦?è?·å¾?æ ?å??é??ï¼?å?³ä½¿ - è¿?æ??å?³ç??é??误å¤?ç??å?¯è?½é??è¦?å¾?é?¿ç??æ?¶é?´ã?? - - è¿?é??ç??ä¸?äº?æ??ä½?æ??ç?¹ä½?æ??ï¼?并ä¸?å?·æ??é??线æ?§ç??ç®?æ³?å¤?æ??æ?§ï¼?å? 为æ?°æ?®ç»?æ??没æ??é??对è¿?ç§?æ?? - å?µè¿?è¡?ä¼?å??ã??ç?¹å?«æ?¯ä»?vmaå?°è¿?ç¨?ç??æ? å°?å°±æ?¯è¿?ç§?æ??å?µã??ç?±äº?è¿?ç§?æ??å?µå¤§æ¦?ç??æ?¯ç½?è§?ç??ï¼?æ?? - 以æ??们å¸?æ??æ??们å?¯ä»¥æ??è?±è¿?ç§?æ??å?µã?? - -该代ç ?ç?±mm/memory-failure.cä¸ç??é«?级å¤?ç??ç¨?åº?ã??ä¸?个æ?°ç??页é?¢poisonä½?å??è??æ??æ?ºä¸ç?? -å??ç§?æ£?æ?¥ç»?æ??ï¼?ç?¨æ?¥å¤?ç??poisonç??页é?¢ã?? - -ç?°å?¨ä¸»è¦?ç?®æ ?æ?¯KVM客æ?·æ?ºï¼?ä½?å®?é??ç?¨äº?æ??æ??ç±»å??ç??åº?ç?¨ç¨?åº?ã??æ?¯æ??KVMé??è¦?æ??è¿?ç??qemu-kvm -ç??æ?¬ã?? - -对äº?KVMç??使ç?¨ï¼?é??è¦?ä¸?个æ?°ç??ä¿¡å?·ç±»å??ï¼?è¿?æ ·KVMå°±å?¯ä»¥ç?¨é??å½?ç??å?°å??å°?æ?ºå?¨æ£?æ?¥æ³¨å?¥å?°å®¢æ?· -æ?ºä¸ã??è¿?å?¨ç??论ä¸?ä¹?å??许å?¶ä»?åº?ç?¨ç¨?åº?å¤?ç??å??å?æ??é??ã??æ??们ç??æ??æ??æ?¯ï¼?æ??æ??ç??åº?ç?¨ç¨?åº?é?½ä¸?è¦?è¿? -æ ·å??ï¼?ä½?ä¸?äº?é??常ä¸?ä¸?ç??åº?ç?¨ç¨?åº?å?¯è?½ä¼?è¿?æ ·å??ã?? - -æ??é??æ?¢å¤?模å¼? -============ - -æ??两ç§?ï¼?å®?é??ä¸?æ?¯ä¸?ç§?ï¼?模å¼?ç??å??å?æ??é??æ?¢å¤?å?¯ä»¥å?¨ã?? - -vm.memory_failure_recovery sysctl ç½®é?¶: - æ??æ??ç??å??å?æ??é??é?½ä¼?导è?´panicã??请ä¸?è¦?å°?è¯?æ?¢å¤?ã?? - -æ?©æ??å¤?ç?? - (å?¯ä»¥å?¨å?¨å±?å??æ¯?个è¿?ç¨?ä¸æ?§å?¶) ä¸?æ?¦æ£?æµ?å?°é??误ï¼?ç«?å?³å??åº?ç?¨ç¨?åº?å??é??SIGBUSè¿?å??许 - åº?ç?¨ç¨?åº?以温å??ç??æ?¹å¼?å¤?ç??å??å?é??误ï¼?ä¾?å¦?ï¼?æ?¾å¼?å??å½±å??ç??对象ï¼? è¿?æ?¯KVM qemu使ç?¨ç?? - 模å¼?ã?? - -æ?¨è¿?å¤?ç?? - å½?åº?ç?¨ç¨?åº?è¿?è¡?å?°æ??å??ç??页é?¢æ?¶ï¼?å??é??SIGBUSã??è¿?对ä¸?ç?¥é??å??å?é??误ç??åº?ç?¨ç¨?åº?æ?¥è¯´æ?¯ - æ??好ç??ï¼?é»?认æ??å?µä¸?注æ??ä¸?äº?页é?¢æ?»æ?¯è¢«å½?ä½?late killå¤?ç??ã?? - -ç?¨æ?·æ?§å?¶ -======== - -vm.memory_failure_recovery - å??é?? sysctl.txt - -vm.memory_failure_early_kill - å?¨å±?å?¯ç?¨early kill - -PR_MCE_KILL - 设置early/late kill mode/revert å?°ç³»ç»?é»?认å?¼ã?? - - arg1: PR_MCE_KILL_CLEAR: - æ?¢å¤?å?°ç³»ç»?é»?认å?¼ - arg1: PR_MCE_KILL_SET: - arg2å®?ä¹?äº?线ç¨?ç?¹å®?模å¼? - - PR_MCE_KILL_EARLY: - Early kill - PR_MCE_KILL_LATE: - Late kill - PR_MCE_KILL_DEFAULT - 使ç?¨ç³»ç»?å?¨å±?é»?认å?¼ - - 注æ??ï¼?å¦?æ??ä½ æ?³æ??ä¸?个ä¸?é?¨ç??线ç¨?代表è¿?ç¨?å¤?ç??SIGBUS(BUS_MCEERR_AO)ï¼?ä½ åº?该å?¨ - æ??å®?线ç¨?ä¸?è°?ç?¨prctl(PR_MCE_KILL_EARLY)ã??å?¦å??ï¼?SIGBUSå°?被å??é??å?°ä¸»çº¿ç¨?ã?? - -PR_MCE_KILL_GET - è¿?å??å½?å??模å¼? - -æµ?è¯? -==== - -* madvise(MADV_HWPOISON, ....) (as root) - å?¨æµ?è¯?è¿?ç¨?ä¸Poisonä¸?个页é?¢ - -* é??è¿?debugfs ``/sys/kernel/debug/hwpoison/`` hwpoison-inject模å?? - - corrupt-pfn - å?¨PFNå¤?注å?¥hwpoisonæ??é??ï¼?并echoedå?°è¿?个æ??件ã??è¿?å??äº?ä¸?äº?æ?©æ??è¿?滤ï¼?以é?¿ - å??å?¨æµ?è¯?å¥?件ä¸æ??å??é??é¢?æ??页é?¢ã?? - unpoison-pfn - å?¨PFNç??Software-unpoison页é?¢å¯¹åº?å?°è¿?个æ??件ã??è¿?æ ·ï¼?ä¸?个页é?¢å?¯ä»¥å??次被 - å¤?ç?¨ã??è¿?å?ªå¯¹Linux注å?¥ç??æ??é??èµ·ä½?ç?¨ï¼?对ç??æ£ç??å??å?æ??é??ä¸?èµ·ä½?ç?¨ã?? - - 注æ??è¿?äº?注å?¥æ?¥å?£å¹¶ä¸?稳å®?ï¼?å?¯è?½ä¼?å?¨ä¸?å??ç??å??æ ¸ç??æ?¬ä¸å??ç??å??å?? - - corrupt-filter-dev-major, corrupt-filter-dev-minor - å?ªå¤?ç??ä¸?å??设å¤?major/minorå®?ä¹?ç??æ??件系ç»?ç?¸å?³ç??页é?¢ç??å??å?æ??é??ã??-1Uæ?¯é?? - é??符å?¼ã??è¿?åº?该å?ªç?¨äº?人工注å?¥ç??æµ?è¯?ã?? - - corrupt-filter-memcg - é??å?¶æ³¨å?¥å?°memgroupæ?¥æ??ç??页é?¢ã??ç?±memcgç??inodeå?·æ??å®?ã?? - - Example:: - - mkdir /sys/fs/cgroup/mem/hwpoison - - usemem -m 100 -s 1000 & - echo `jobs -p` > /sys/fs/cgroup/mem/hwpoison/tasks - - memcg_ino=$(ls -id /sys/fs/cgroup/mem/hwpoison | cut -f1 -d' ') - echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg - - page-types -p `pidof init` --hwpoison # shall do nothing - page-types -p `pidof usemem` --hwpoison # poison its pages - - corrupt-filter-flags-mask, corrupt-filter-flags-value - å½?æ??å®?æ?¶ï¼?å?ªæ??å?¨((page_flags & mask) == value)ç??æ??å?µä¸?æ??ä¼?poison页é?¢ã?? - è¿?å??许对许å¤?ç§?ç±»ç??页é?¢è¿?è¡?å??å??æµ?è¯?ã??page_flagsä¸?/proc/kpageflagsä¸ç??ç?¸ - å??ã??è¿?äº?æ ?å¿?ä½?å?¨include/linux/kernel-page-flags.hä¸å®?ä¹?ï¼?并å?¨ - Documentation/admin-guide/mm/pagemap.rstä¸è®°å½?ã?? - -* æ?¶æ??ç?¹å®?ç??MCE注å?¥å?¨ - - x86 æ?? mce-inject, mce-test - - å?¨mce-testä¸ç??ä¸?äº?便æ?ºå¼?hwpoisonæµ?è¯?ç¨?åº?ï¼?è§?ä¸?æ??ã?? - -å¼?ç?¨ -==== - -http://halobates.de/mce-lc09-2.pdf - 09å¹´LinuxConç??æ¦?è¿°æ¼?讲 - -git://git.kernel.org/pub/scm/utils/cpu/mce/mce-test.git - æµ?è¯?å¥?件ï¼?å?¨tsrcä¸ç??hwpoisonç?¹å®?å?¯ç§»æ¤?æµ?è¯?ï¼?ã?? - -git://git.kernel.org/pub/scm/utils/cpu/mce/mce-inject.git - x86ç?¹å®?ç??注å?¥å?¨ - - -é??å?¶ -==== -- ä¸?æ?¯æ??æ??ç??页é?¢ç±»å??é?½è¢«æ?¯æ??ï¼?è??ä¸?æ°¸è¿?ä¸?ä¼?ã??大å¤?æ?°å??æ ¸å??é?¨å¯¹è±¡ä¸?è?½è¢«æ?¢ - å¤?ï¼?ç?®å??å?ªæ??LRU页ã?? - ---- -Andi Kleen, 2009å¹´10æ?? --- a/Documentation/translations/zh_CN/vm/index.rst +++ /dev/null @@ -1,54 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/index.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - -================= -Linuxå??å?管ç??æ??æ¡£ -================= - -è¿?æ?¯ä¸?个å?³äº?Linuxå??å?管ç??ï¼?mmï¼?å?ç³»ç»?å??é?¨ç??æ??æ¡£é??ï¼?å?¶ä¸æ??ä¸?å??å±?次ç??ç»?è??ï¼?å??æ?¬æ³¨é?? -å??é?®ä»¶å??表ç??å??å¤?ï¼?ç?¨äº?é??è¿°æ?°æ?®ç»?æ??å??ç®?æ³?ç??å?ºæ?¬æ??å?µã??å¦?æ??ä½ æ£å?¨å¯»æ?¾å?³äº?ç®?å??å??é??å??å?ç??建 -è®®ï¼?请å??é??(Documentation/translations/zh_CN/core-api/memory-allocation.rst)ã?? -对äº?æ?§å?¶å??è°?æ?´æ??å??ï¼?请å??é??(Documentation/admin-guide/mm/index)ã?? -TODO:å¾?å¼?ç?¨æ??æ¡£é??被翻è¯?å®?æ¯?å??请å??æ?¶ä¿®æ?¹æ¤å¤?ï¼? - -.. toctree:: - :maxdepth: 1 - - active_mm - balance - damon/index - free_page_reporting - highmem - ksm - frontswap - hmm - hwpoison - hugetlbfs_reserv - memory-model - mmu_notifier - numa - overcommit-accounting - page_frags - page_owner - page_table_check - remap_file_pages - split_page_table_lock - z3fold - zsmalloc - -TODOLIST: -* arch_pgtable_helpers -* free_page_reporting -* hugetlbfs_reserv -* page_migration -* slub -* transhuge -* unevictable-lru -* vmalloced-kernel-stacks --- a/Documentation/translations/zh_CN/vm/ksm.rst +++ /dev/null @@ -1,70 +0,0 @@ -.. include:: ../disclaimer-zh_CN.rst - -:Original: Documentation/vm/ksm.rst - -:ç¿»è¯?: - - å¾?é?« xu xin <xu.xin16@xxxxxxxxxx> - -============ -å??æ ¸å??页å??并 -============ - -KSM æ?¯ä¸?ç§?è??ç??å??å?ç??æ?°æ?®å?»é??å??è?½ï¼?ç?±CONFIG_KSM=yå?¯ç?¨ï¼?并å?¨2.6.32ç??æ?¬æ?¶è¢«æ·»å? -å?°Linuxå??æ ¸ã??详è§? ``mm/ksm.c`` ç??å®?ç?°ï¼?以å??http://lwn.net/Articles/306704å;?? -https://lwn.net/Articles/330589 - -KSMç??ç?¨æ?·ç©ºé?´ç??æ?¥å?£å?¨Documentation/translations/zh_CN/admin-guide/mm/ksm.rst -æ??æ¡£ä¸æ??æ??è¿°ã?? - -设计 -==== - -æ¦?è¿° ----- - -æ¦?è¿°å??容请è§?mm/ksm.cæ??æ¡£ä¸ç??â??DOC: Overviewâ?? - -é??æ? å°? ------- -KSMç»´æ?¤ç??稳å®?æ ?ä¸ç??KSM页ç??é??æ? å°?ä¿¡æ?¯ã?? - -å½?KSM页é?¢ç??å?±äº«æ?°å°?äº? ``max_page_sharing`` ç??è??æ??å??å?å?ºå??(VMAs)æ?¶ï¼?å??代表äº? -KSM页ç??稳å®?æ ?å?¶ä¸ç??è??ç?¹æ??å??äº?ä¸?个rmap_itemç»?æ??ä½?ç±»å??ç??å??表ã??å??æ?¶ï¼?è¿?个KSM页 -ç?? ``page->mapping`` æ??å??äº?该稳å®?æ ?è??ç?¹ã?? - -å¦?æ??å?±äº«æ?°è¶?è¿?äº?é??å?¼ï¼?KSMå°?ç»?稳å®?æ ?æ·»å? 第äº?个维度ã??稳å®?æ ?å°±å??æ??é?¾æ?¥ä¸?个æ??å¤? -个稳å®?æ ?"å?¯æ?¬"ç??"é?¾"ã??æ¯?个å?¯æ?¬é?½ä¿?ç??KSM页ç??é??æ? å°?ä¿¡æ?¯ï¼?å?¶ä¸ ``page->mapping`` -æ??å??该"å?¯æ?¬"ã?? - -æ¯?个é?¾ä»¥å??é?¾æ?¥å?°è¯¥é?¾ä¸ç??æ??æ??"å?¯æ?¬"强å?¶ä¸?å??ç??æ?¯ï¼?å®?们代表äº?ç?¸å??ç??å??ä¿?æ?¤å??å? -å??容ï¼?尽管任ä¸ä¸?个"å?¯æ?¬"æ?¯ç?±å??ä¸?ç??å??å?å?ºç??ä¸?å??ç??KSMå¤?å?¶é¡µæ??æ??å??ç??ã?? - -è¿?æ ·ä¸?æ?¥ï¼?ç?¸æ¯?ä¸?æ? é??ç??é??æ? å°?é?¾è¡¨ï¼?稳å®?æ ?ç??æ?¥æ?¾è®¡ç®?å¤?æ??æ?§ä¸?å??å½±å??ã??ä½?å?¨ç¨³å®?æ ? -æ?¬èº«ä¸ä¸?è?½æ??é??å¤?ç??KSM页é?¢å??容ä»?ç?¶æ?¯å¼ºå?¶è¦?æ±?ã?? - -ç?± ``max_page_sharing`` 强å?¶å?³å®?ç??æ?°æ?®å?»é??é??å?¶æ?¯å¿?è¦?ç??ï¼?以æ¤æ?¥é?¿å??è??æ??å??å? -rmapé?¾è¡¨å??å¾?è¿?大ã??rmapç??é??å??å?·æ??O(N)ç??å¤?æ??度ï¼?å?¶ä¸Næ?¯å?±äº«é¡µé?¢ç??rmap_项ï¼?å?³ -è??æ??æ? å°?ï¼?ç??æ?°é??ï¼?è??è¿?个å?±äº«é¡µé?¢ç??è??ç?¹æ?°é??å??被 ``max_page_sharing`` æ??é??å?¶ã?? -å? æ¤ï¼?è¿?æ??æ??å?°å°?线æ?§O(N)计ç®?å¤?æ??度ä»?rmapé??å??ä¸å??æ?£å?°ä¸?å??ç??KSM页é?¢ä¸?ã??ksmdè¿? -ç¨?å?¨ç¨³å®?è??ç?¹"é?¾"ä¸?ç??é??å??ä¹?æ?¯O(N)ï¼?ä½?è¿?个Næ?¯ç¨³å®?æ ?"å?¯æ?¬"ç??æ?°é??ï¼?è??ä¸?æ?¯rmap项 -ç??æ?°é??ï¼?å? æ¤å®?对ksmdæ?§è?½æ²¡æ??æ?¾è??å½±å??ã??å®?é??ä¸?ï¼?æ??佳稳å®?æ ?"å?¯æ?¬"ç??å??é??è??ç?¹å°? -ä¿?ç??å?¨"å?¯æ?¬"å??表ç??å¼?头ã?? - -``max_page_sharing`` ç??å?¼è®¾ç½®å¾?é«?äº?ä¼?ä¿?使æ?´å¿«ç??å??å?å??并ï¼?å? 为å°?æ??æ?´å°?ç??稳å®? -æ ?å?¯æ?¬æ??é??è¿?å?¥ç¨³å®?è??ç?¹chain->hlistï¼?å??æ?´é«?ç??æ?°æ?®å?»é??ç³»æ?°ï¼?ä½?代价æ?¯å?¨äº¤æ?¢ã??å?? -缩ã??NUMA平衡å??页é?¢è¿?移è¿?ç¨?ä¸å?¯è?½å¯¼è?´KSM页ç??æ??大rmapé??å??é??度è¾?æ?¢ã?? - -``stable_node_dups/stable_node_chains`` ç??æ¯?å?¼è¿?å?? ``max_page_sharing`` è°?æ?§ -ç??å½±å??ï¼?é«?æ¯?å?¼å?¯è?½æ??å?³ç??稳å®?è??ç?¹dupä¸å?å?¨ç¢?ç??ï¼?è¿?å?¯ä»¥é??è¿?å?¨ksmdä¸å¼?å?¥ç¢?ç??ç®? -æ³?æ?¥è§£å?³ï¼?该ç®?æ³?å°?rmap项ä»?ä¸?个稳å®?è??ç?¹dupé??å®?ä½?å?°å?¦ä¸?个稳å®?è??ç?¹dupï¼?以便é??æ?¾ -é?£äº?ä»?å??å?«æ??å°?rmap项ç??稳å®?è??ç?¹"dup"ï¼?ä½?è¿?å?¯è?½ä¼?å¢?å? ksmdè¿?ç¨?ç??CPU使ç?¨ç??ï¼?并å?¯ -è?½ä¼?å??æ?¢åº?ç?¨ç¨?åº?å?¨KSM页é?¢ä¸?ç??å?ªè¯»è®¡ç®?ã?? - -KSMä¼?å®?æ??æ?«æ??稳å®?è??ç?¹"é?¾"ä¸é?¾æ?¥ç??æ??æ??稳å®?æ ?"å?¯æ?¬"ï¼?以便å? å??è¿?æ?¶äº?ç??稳å®?è??ç?¹ã?? -è¿?ç§?æ?«æ??ç??é¢?ç??ç?± ``stable_node_chains_prune_millisecs`` è¿?个sysfs æ?¥å?£å®?ä¹?ã?? - -å??è?? -==== -å??æ ¸ä»£ç ?请è§?mm/ksm.cã?? -æ¶?å??ç??å?½æ?°(mm_slot ksm_scan stable_node rmap_item)ã?? --- a/Documentation/translations/zh_CN/vm/memory-model.rst +++ /dev/null @@ -1,135 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -:Original: Documentation/vm/memory-model.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -============ -ç?©ç??å??å?模å?? -============ - -ç³»ç»?ä¸ç??ç?©ç??å??å?å?¯ä»¥ç?¨ä¸?å??ç??æ?¹å¼?è¿?è¡?寻å??ã??æ??ç®?å??ç??æ??å?µæ?¯ï¼?ç?©ç??å??å?ä»?å?°å??0å¼? -å§?ï¼?è·¨è¶?ä¸?个è¿?ç»ç??è??å?´ï¼?ç?´å?°æ??大ç??å?°å??ã??ç?¶è??ï¼?è¿?个è??å?´å?¯è?½å??å?«CPUæ? æ³?访é?®ç?? -å°?å?é??ã??é?£ä¹?ï¼?å?¨å®?å?¨ä¸?å??ç??å?°å??å?¯è?½æ??å? 个è¿?ç»ç??è??å?´ã??è??ä¸?ï¼?å?«å¿?äº?NUMAï¼?å?³ä¸? -å??ç??å??å?åº?è¿?æ?¥å?°ä¸?å??ç??CPUã?? - -Linux使ç?¨ä¸¤ç§?å??å?模å??ä¸ç??ä¸?ç§?对è¿?ç§?å¤?æ ·æ?§è¿?è¡?æ?½è±¡ã??FLATMEMå??SPARSEMã??æ¯? -个æ?¶æ??é?½å®?ä¹?äº?å®?æ??æ?¯æ??ç??å??å?模å??ï¼?é»?认ç??å??å?模å??æ?¯ä»?ä¹?ï¼?以å??æ?¯å?¦æ??å?¯è?½æ??å?¨ -è¦?ç??该é»?认å?¼ã?? - -æ??æ??ç??å??å?模å??é?½ä½¿ç?¨æ??å??å?¨ä¸?个æ??å¤?个æ?°ç»?ä¸ç?? `struct page` æ?¥è·?踪ç?©ç??页 -帧ç??ç?¶æ??ã?? - -æ? 论é??æ?©å?ªç§?å??å?模å??ï¼?ç?©ç??页æ¡?å?·ï¼?PFNï¼?å??ç?¸åº?ç?? `struct page` ä¹?é?´é?½å? -å?¨ä¸?对ä¸?ç??æ? å°?å?³ç³»ã?? - -æ¯?个å??å?模å??é?½å®?ä¹?äº? :c:func:`pfn_to_page` å?? :c:func:`page_to_pfn` -帮å?©å?½æ?°ï¼?å??许ä»?PFNå?° `struct page` ç??转æ?¢ï¼?å??ä¹?亦ç?¶ã?? - -FLATMEM -======= - -æ??ç®?å??ç??å??å?模å??æ?¯FLATMEMã??è¿?个模å??é??ç?¨äº?é??NUMAç³»ç»?ç??è¿?ç»æ??大é?¨å??è¿?ç»ç?? -ç?©ç??å??å?ã?? - -å?¨FLATMEMå??å?模å??ä¸ï¼?æ??ä¸?个å?¨å±?ç?? `mem_map` æ?°ç»?æ?¥æ? å°?æ?´ä¸ªç?©ç??å??å?ã??对 -äº?大å¤?æ?°æ?¶æ??ï¼?å?é??å?¨ `mem_map` æ?°ç»?ä¸é?½æ??æ?¡ç?®ã??ä¸?å?æ´?ç?¸å¯¹åº?ç?? `struct page` -对象ä»?æ?ªè¢«å®?å?¨å??å§?å??ã?? - -为äº?å??é?? `mem_map` æ?°ç»?ï¼?æ?¶æ??ç?¹å®?ç??设置代ç ?åº?该è°?ç?¨free_area_init()å?½æ?°ã?? -ç?¶è??ï¼?å?¨è°?ç?¨memblock_free_all()å?½æ?°ä¹?å??ï¼?æ? å°?æ?°ç»?æ?¯ä¸?è?½ä½¿ç?¨ç??ï¼?该å?½æ?° -å°?æ??æ??ç??å??å?交ç»?页å??é??å?¨ã?? - -ä¸?个æ?¶æ??å?¯è?½ä¼?é??æ?¾ `mem_map` æ?°ç»?ä¸ä¸?å??æ?¬å®?é??ç?©ç??页ç??é?¨å??ã??å?¨è¿?ç§?æ??å?µä¸?ï¼?ç?¹ -å®?æ?¶æ??ç?? :c:func:`pfn_valid` å®?ç?°åº?该è??è??å?° `mem_map` ä¸ç??å?é??ã?? - -使ç?¨FLATMEMï¼?PFNå?? `struct page` ä¹?é?´ç??转æ?¢æ?¯ç?´æ?¥ç??ã?? `PFN - ARCH_PFN_OFFSET` -æ?¯ `mem_map` æ?°ç»?ç??ä¸?个索å¼?ã?? - -`ARCH_PFN_OFFSET` å®?ä¹?äº?ç?©ç??å??å?èµ·å§?å?°å??ä¸?å??äº?0ç??ç³»ç»?ç??第ä¸?个页æ¡?å?·ã?? - -SPARSEMEM -========= - -SPARSEMEMæ?¯Linuxä¸æ??é??ç?¨ç??å??å?模å??ï¼?å®?æ?¯å?¯ä¸?æ?¯æ??è?¥å¹²é«?级å??è?½ç??å??å?模å??ï¼? -å¦?ç?©ç??å??å?ç??ç?æ??æ??ã??é??æ??失æ?§å??å?设å¤?ç??æ?¿ä»£å??å?å?¾å??è¾?大系ç»?ç??å??å?å?¾ç??延è¿? -å??å§?å??ã?? - -SPARSEMEM模å??å°?ç?©ç??å??å?æ?¾ç¤ºä¸ºä¸?个é?¨å??ç??é??å??ã??ä¸?个å?ºæ®µç?¨mem_sectionç»?æ?? -ä½?表示ï¼?å®?å??å?« `section_mem_map` ï¼?ä»?é?»è¾?ä¸?讲ï¼?å®?æ?¯ä¸?个æ??å?? `struct page` -é?µå??ç??æ??é??ã??ç?¶è??ï¼?å®?被å?å?¨å?¨ä¸?äº?å?¶ä»?ç??magicä¸ï¼?以帮å?©å??å?ºç®¡ç??ã??å?ºæ®µç??大å°? -å??æ??大å?ºæ®µæ?°æ?¯ä½¿ç?¨ `SECTION_SIZE_BITS` å?? `MAX_PHYSMEM_BITS` 常é?? -æ?¥æ??å®?ç??ï¼?è¿?两个常é??æ?¯ç?±æ¯?个æ?¯æ??SPARSEMEMç??æ?¶æ??å®?ä¹?ç??ã?? `MAX_PHYSMEM_BITS` -æ?¯ä¸?个æ?¶æ??æ??æ?¯æ??ç??ç?©ç??å?°å??ç??å®?é??宽度ï¼?è?? `SECTION_SIZE_BITS` æ?¯ä¸?个任 -æ??ç??å?¼ã?? - -æ??大ç??段æ?°è¡¨ç¤ºä¸º `NR_MEM_SECTIONS` ï¼?å®?ä¹?为 - -.. math:: - - NR\_MEM\_SECTIONS = 2 ^ {(MAX\_PHYSMEM\_BITS - SECTION\_SIZE\_BITS)} - -`mem_section` 对象被å®?æ??å?¨ä¸?个å?«å?? `mem_sections` ç??äº?ç»´æ?°ç»?ä¸ã??è¿?个æ?°ç»?ç?? -大å°?å??ä½?ç½®å??å?³äº? `CONFIG_SPARSEM_EXTREME` å??å?¯è?½ç??æ??大段æ?°: - -* å½? `CONFIG_SPARSEMEM_EXTREME` 被ç¦?ç?¨æ?¶ï¼? `mem_sections` æ?°ç»?æ?¯é??æ??ç??ï¼?æ?? - `NR_MEM_SECTIONS` è¡?ã??æ¯?ä¸?è¡?æ??æ??ä¸?个 `mem_section` 对象ã?? -* å½? `CONFIG_SPARSEMEM_EXTREME` 被å?¯ç?¨æ?¶ï¼? `mem_sections` æ?°ç»?被å?¨æ??å??é??ã?? - æ¯?ä¸?è¡?å??å?«ä»·å?¼ `PAGE_SIZE` ç?? `mem_section` 对象ï¼?è¡?æ?°ç??计ç®?æ?¯ä¸ºäº?é??åº?æ??æ??ç?? - å??å?å?ºã?? - -æ?¶æ??设置代ç ?åº?该è°?ç?¨sparse_init()æ?¥å??å§?å??å??å?å?ºå??å??å?æ? å°?ã?? - -é??è¿?SPARSEMEMï¼?æ??两ç§?å?¯è?½ç??æ?¹å¼?å°?PFN转æ?¢ä¸ºç?¸åº?ç?? `struct page` --"classic sparse"å?? - "sparse vmemmap"ã??é??æ?©æ?¯å?¨æ??建æ?¶è¿?è¡?ç??ï¼?å®?ç?± `CONFIG_SPARSEMEM_VMEMMAP` ç?? - å?¼å?³å®?ã?? - -Classic sparseå?¨page->flagsä¸ç¼?ç ?äº?ä¸?个页é?¢ç??段å?·ï¼?并使ç?¨PFNç??é«?ä½?æ?¥è®¿é?®æ? å°?该页 -æ¡?ç??段ã??å?¨ä¸?个å?ºæ®µå??ï¼?PFNæ?¯æ??å??页æ?°ç»?ç??ç´¢å¼?ã?? - -Sparse vmemmapvmemmap使ç?¨è??æ??æ? å°?ç??å??å?æ? å°?æ?¥ä¼?å??pfn_to_pageå??page_to_pfnæ?? -ä½?ã??æ??ä¸?个å?¨å±?ç?? `struct page *vmemmap` æ??é??ï¼?æ??å??ä¸?个è??æ??è¿?ç»ç?? `struct page` -对象é?µå??ã??PFNæ?¯è¯¥æ?°ç»?ç??ä¸?个索å¼?ï¼?`struct page` ä»? `vmemmap` ç??å??移é??æ?¯è¯¥é¡µç??PFNã?? - -为äº?使ç?¨vmemmapï¼?ä¸?个æ?¶æ??å¿?é¡»ä¿?ç??ä¸?个è??æ??å?°å??ç??è??å?´ï¼?以æ? å°?å??å?«å??å?æ? å°?ç??ç?©ç??页ï¼?并 -ç¡®ä¿? `vmemmap`æ??å??该è??å?´ã??æ¤å¤?ï¼?æ?¶æ??åº?该å®?ç?° :c:func:`vmemmap_populate` æ?¹æ³?ï¼? -å®?å°?å??é??ç?©ç??å??å?并为è??æ??å??å?æ? å°?å??建页表ã??å¦?æ??ä¸?个æ?¶æ??对vmemmapæ? å°?没æ??ä»»ä½?ç?¹æ®?è¦?æ±?ï¼? -å®?å?¯ä»¥ä½¿ç?¨é??ç?¨å??å?管ç??æ??ä¾?ç??é»?认 :c:func:`vmemmap_populate_basepages`ã?? - -è??æ??æ? å°?ç??å??å?æ? å°?å??许å°?æ??ä¹?æ?§å??å?设å¤?ç?? `struct page` 对象å?å?¨å?¨è¿?äº?设å¤?ä¸?é¢?å??å?? -é??ç??å?å?¨ä¸ã??è¿?ç§?å?å?¨ç?¨vmem_altmapç»?æ??表示ï¼?æ??ç»?é??è¿?ä¸?é?¿ä¸²ç??å?½æ?°è°?ç?¨ä¼ é??ç»? -vmemmap_populate()ã??vmemmap_populate()å®?ç?°å?¯ä»¥ä½¿ç?¨ `vmem_altmap` å?? -:c:func:`vmemmap_alloc_block_buf` å?©æ??æ?¥å??é??æ??ä¹?æ?§å??å?设å¤?ä¸?ç??å??å?æ? å°?ã?? - -ZONE_DEVICE -=========== -`ZONE_DEVICE` 设æ?½å»ºç«?å?¨ `SPARSEM_VMEMMAP` ä¹?ä¸?ï¼?为设å¤?驱å?¨è¯?å?«ç??ç?©ç??å?°å??è?? -å?´æ??ä¾? `struct page` `mem_map` æ??å?¡ã?? `ZONE_DEVICE` ç?? "设å¤?" æ?¹é?¢ä¸?以ä¸? -äº?å®?æ??å?³ï¼?è¿?äº?å?°å??è??å?´ç??页é?¢å¯¹è±¡ä»?æ?ªè¢«å?¨çº¿æ ?è®°è¿?ï¼?è??ä¸?å¿?须对设å¤?è¿?è¡?å¼?ç?¨ï¼?è??ä¸?ä»?ä»? -æ?¯é¡µé?¢ï¼?以ä¿?æ??å??å?被â??é??å®?â??以便使ç?¨ã?? `ZONE_DEVICE` ï¼?é??è¿? :c:func:`devm_memremap_pages` ï¼? -为ç»?å®?ç??pfnsè??å?´æ?§è¡?足å¤?ç??å??å?ç?æ??æ??æ?¥å¼?å?¯ :c:func:`pfn_to_page`ï¼? -:c:func:`page_to_pfn`, ï¼?å?? :c:func:`get_user_pages` æ??å?¡ã??ç?±äº?页é?¢å¼? -ç?¨è®¡æ?°æ°¸è¿?ä¸?ä¼?ä½?äº?1ï¼?æ??以页é?¢æ°¸è¿?ä¸?ä¼?被追踪为空é?²å??å?ï¼?页é?¢ç?? `struct list_head lru` -空é?´è¢«é??æ?°å?©ç?¨ï¼?ç?¨äº?å??æ? å°?该å??å?ç??主æ?ºè®¾å¤?/驱å?¨ç¨?åº?è¿?è¡?å??å??å¼?ç?¨ã?? - -è?½ç?¶ `SPARSEMEM` å°?å??å?ä½?为ä¸?个å?ºæ®µç??é??å??ï¼?å?¯ä»¥é??æ?©æ?¶é??并å??æ??å??å?å??ï¼?ä½? -`ZONE_DEVICE` ç?¨æ?·é??è¦?æ?´å°?ç??é¢?ç²?度æ?¥å¡«å?? `mem_map` ã??é?´äº? `ZONE_DEVICE` -å??å?ä»?æ?ªè¢«å?¨çº¿æ ?è®°ï¼?å? æ¤å®?ç??å??å?è??å?´ä»?æ?ªé??è¿?sysfså??å?ç?æ??æ??apiæ?´é?²å?¨å??å?å??è¾¹ç?? -ä¸?ã??è¿?个å®?ç?°ä¾?èµ?äº?è¿?ç§?缺ä¹?ç?¨æ?·æ?¥å?£ç??约æ??ï¼?å??许å?段大å°?ç??å??å?è??å?´è¢«æ??å®?ç»? -:c:func:`arch_add_memory` ï¼?å?³å??å?ç?æ??æ??ç??ä¸?å??é?¨å??ã??å?段æ?¯æ??å??许2MBä½?为 -:c:func:`devm_memremap_pages` ç??è·¨æ?¶æ??é??ç?¨å¯¹é½?é¢?ç²?度ã?? - -`ZONE_DEVICE` ç??ç?¨æ?·æ?¯: - -* pmem: é??è¿?DAXæ? å°?å°?å¹³å?°æ??ä¹?æ?§å??å?ä½?为ç?´æ?¥I/Oç?®æ ?使ç?¨ã?? - -* hmm: ç?¨ `->page_fault()` å?? `->page_free()` äº?件å??è°?æ?©å±? `ZONE_DEVICE` ï¼? - 以å??许设å¤?驱å?¨ç¨?åº?å??è°?ä¸?设å¤?å??å?ç?¸å?³ç??å??å?管ç??äº?件ï¼?é??常æ?¯GPUå??å?ã??å??è§?/vm/hmm.rstã?? - -* p2pdma: å??建 `struct page` 对象ï¼?å??许PCI/Eæ??æ??ç»?æ??ä¸ç??peer设å¤?å??è°?å®?们ä¹?é?´ç?? - ç?´æ?¥DMAæ??ä½?ï¼?å?³ç»?è¿?主æ?ºå??å?ã?? --- a/Documentation/translations/zh_CN/vm/mmu_notifier.rst +++ /dev/null @@ -1,97 +0,0 @@ -:Original: Documentation/vm/mmu_notifier.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - - -ä»?ä¹?æ?¶å??é??è¦?页表é??å??é??ç?¥ï¼? -========================== - -å½?æ¸?é?¤ä¸?个pte/pmdæ?¶ï¼?æ??们å?¯ä»¥é??æ?©é??è¿?å?¨é¡µè¡¨é??ä¸?ï¼?é??ç?¥ç??ç??\*_clear_flushè°?ç?¨ -mmu_notifier_invalidate_rangeï¼?é??ç?¥äº?件ã??ä½?è¿?ç§?é??ç?¥å¹¶ä¸?æ?¯å?¨æ??æ??æ??å?µä¸?é?½é??è¦?ç??ã?? - -对äº?äº?级TLBï¼?é??CPU TLBï¼?ï¼?å¦?IOMMU TLBæ??设å¤?TLBï¼?å½?设å¤?使ç?¨ç±»ä¼¼ATS/PASIDç??ä¸?西让 -IOMMUèµ°CPU页表æ?¥è®¿é?®è¿?ç¨?ç??è??æ??å?°å??空é?´ï¼?ã??å?ªæ??两ç§?æ??å?µé??è¦?å?¨æ¸?é?¤pte/pmdæ?¶å?¨æ??æ??页 -表é??ç??å??æ?¶é??ç?¥è¿?äº?äº?级TLBï¼? - - A) å?¨mmu_notifier_invalidate_range_end()ä¹?å??ï¼?æ?¯æ??页ç??å?°å??被é??æ?¾ã?? - B) ä¸?个页表项被æ?´æ?°ä»¥æ??å??ä¸?个æ?°ç??页é?¢ï¼?COWï¼?é?¶é¡µä¸?ç??å??å¼?常ï¼?__replace_page()ï¼?...ï¼?ã?? - -æ??å?µAå¾?æ??æ?¾ï¼?ä½ ä¸?æ?³å??é£?é?©è®©è®¾å¤?å??å?°ä¸?个ç?°å?¨å?¯è?½è¢«ä¸?äº?å®?å?¨ä¸?å??ç??ä»»å?¡ä½¿ç?¨ç??页é?¢ã?? - -æ??å?µBæ?´å? å¾®å¦?ã??为äº?æ£ç¡®èµ·è§?ï¼?å®?é??è¦?æ??ç?§ä»¥ä¸?åº?å??å??ç??: - - - ä¸?页表é?? - - æ¸?é?¤é¡µè¡¨é¡¹å¹¶é??ç?¥ ([pmd/pte]p_huge_clear_flush_notify()) - - 设置页表项以æ??å??æ?°é¡µ - -å¦?æ??å?¨è®¾ç½®æ?°ç??pte/pmdå?¼ä¹?å??ï¼?æ¸?é?¤é¡µè¡¨é¡¹ä¹?å??没æ??è¿?è¡?é??ç?¥ï¼?é?£ä¹?ä½ å°±ä¼?ç ´å??设å¤?ç??C11æ?? -C++11ç?å??å?模å??ã?? - -è??è??以ä¸?æ??å?µï¼?设å¤?使ç?¨ç±»ä¼¼äº?ATS/PASIDç??å??è?½ï¼?ã?? - -两个å?°å??addrAå??addrBï¼?è¿?æ ·|addrA - addrB| >= PAGE_SIZEï¼?æ??们å??设å®?们æ?¯COWç?? -å??ä¿?æ?¤ï¼?Bç??å?¶ä»?æ??å?µä¹?é??ç?¨ï¼?ã?? - -:: - - [Time N] -------------------------------------------------------------------- - CPU-thread-0 {å°?è¯?å??å?°addrA} - CPU-thread-1 {å°?è¯?å??å?°addrB} - CPU-thread-2 {} - CPU-thread-3 {} - DEV-thread-0 {读å??addrA并填å??设å¤?TLB} - DEV-thread-2 {读å??addrB并填å??设å¤?TLB} - [Time N+1] ------------------------------------------------------------------ - CPU-thread-0 {COW_step0: {mmu_notifier_invalidate_range_start(addrA)}} - CPU-thread-1 {COW_step0: {mmu_notifier_invalidate_range_start(addrB)}} - CPU-thread-2 {} - CPU-thread-3 {} - DEV-thread-0 {} - DEV-thread-2 {} - [Time N+2] ------------------------------------------------------------------ - CPU-thread-0 {COW_step1: {æ?´æ?°é¡µè¡¨ä»¥æ??å??addrAç??æ?°é¡µ}} - CPU-thread-1 {COW_step1: {æ?´æ?°é¡µè¡¨ä»¥æ??å??addrBç??æ?°é¡µ}} - CPU-thread-2 {} - CPU-thread-3 {} - DEV-thread-0 {} - DEV-thread-2 {} - [Time N+3] ------------------------------------------------------------------ - CPU-thread-0 {preempted} - CPU-thread-1 {preempted} - CPU-thread-2 {å??å?¥addrAï¼?è¿?æ?¯å¯¹æ?°é¡µé?¢ç??å??å?¥} - CPU-thread-3 {} - DEV-thread-0 {} - DEV-thread-2 {} - [Time N+3] ------------------------------------------------------------------ - CPU-thread-0 {preempted} - CPU-thread-1 {preempted} - CPU-thread-2 {} - CPU-thread-3 {å??å?¥addrBï¼?è¿?æ?¯ä¸?个å??å?¥æ?°é¡µç??è¿?ç¨?} - DEV-thread-0 {} - DEV-thread-2 {} - [Time N+4] ------------------------------------------------------------------ - CPU-thread-0 {preempted} - CPU-thread-1 {COW_step3: {mmu_notifier_invalidate_range_end(addrB)}} - CPU-thread-2 {} - CPU-thread-3 {} - DEV-thread-0 {} - DEV-thread-2 {} - [Time N+5] ------------------------------------------------------------------ - CPU-thread-0 {preempted} - CPU-thread-1 {} - CPU-thread-2 {} - CPU-thread-3 {} - DEV-thread-0 {ä»?æ?§é¡µä¸è¯»å??addrA} - DEV-thread-2 {ä»?æ?°é¡µé?¢è¯»å??addrB} - -æ??以å?¨è¿?é??ï¼?å? 为å?¨N+2ç??æ?¶å??ï¼?æ¸?空页表项没æ??å??é??ç?¥ä¸?èµ·ä½?åº?äº?级TLBï¼?设å¤?å?¨ç??å?°addrAç??æ?°å?¼ä¹?å?? -å°±ç??å?°äº?addrBç??æ?°å?¼ã??è¿?å°±ç ´å??äº?设å¤?ç??æ?»å??å?åº?ã?? - -å½?æ?¹å??ä¸?个pteç??å??ä¿?æ?¤æ??æ??å??ä¸?个æ?°ç??å?·æ??ç?¸å??å??容ç??å??ä¿?æ?¤é¡µï¼?KSMï¼?æ?¶ï¼?å°?mmu_notifier_invalidate_range -è°?ç?¨å»¶è¿?å?°é¡µè¡¨é??å¤?ç??mmu_notifier_invalidate_range_end()æ?¯å?¯ä»¥ç??ã??å?³ä½¿å??页表æ?´æ?°ç??线ç¨? -å?¨é??æ?¾é¡µè¡¨é??å??ä½?å?¨è°?ç?¨mmu_notifier_invalidate_range_end()å??被æ?¢å? ï¼?ä¹?æ?¯å¦?æ¤ã?? --- a/Documentation/translations/zh_CN/vm/numa.rst +++ /dev/null @@ -1,101 +0,0 @@ -:Original: Documentation/vm/numa.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -å§?äº?1999å¹´11æ??ï¼?ä½?è??ï¼? <kanoj@xxxxxxx> - -========================== -ä½?为é??ç»?ä¸?å??å?访é?®(NUMA)ï¼? -========================== - -è¿?个é?®é¢?å?¯ä»¥ä»?å? 个è§?è§?æ?¥å??ç?ï¼?硬件è§?ç?¹å??Linux软件è§?è§?ã?? - -ä»?硬件è§?度ç??ï¼?NUMAç³»ç»?æ?¯ä¸?个ç?±å¤?个ç»?件æ??è£?é??ç»?æ??ç??计ç®?æ?ºå¹³å?°ï¼?æ¯?个ç»?件å?¯è?½å??å?«0个æ??æ?´å¤?ç??CPUã?? -æ?¬å?°å??å?å??/æ??IOæ?»çº¿ã??为äº?ç®?æ´?èµ·è§?ï¼?并å°?è¿?äº?ç?©ç??ç»?件/è£?é??ç??硬件è§?è§?ä¸?软件æ?½è±¡å?ºå??å¼?æ?¥ï¼?æ??们å?¨ -æ?¬æ??ä¸ç§°è¿?äº?ç»?件/è£?é??为â??å??å??â??ã?? - -æ¯?个â??å??å??â??é?½å?¯ä»¥ç??ä½?æ?¯ç³»ç»?ç??ä¸?个SMP[对称å¤?å¤?ç??å?¨]å?é??â??â??尽管ç?¬ç«?ç??SMPç³»ç»?æ??é??ç??ä¸?äº?ç»?件å?¯è?½ -ä¸?ä¼?å?¨ä»»ä½?ç»?å®?ç??å??å??ä¸?å¡«å??ã??NUMAç³»ç»?ç??å??å??é??è¿?æ??ç§?ç³»ç»?äº?è¿?è¿?æ?¥å?¨ä¸?èµ·â??â??ä¾?å¦?ï¼?交å??å¼?å?³æ??ç?¹å¯¹ç?¹ -é?¾æ?¥æ?¯NUMAç³»ç»?äº?è¿?ç??常è§?ç±»å??ã??è¿?两ç§?ç±»å??ç??äº?è¿?é?½å?¯ä»¥è??å??èµ·æ?¥ï¼?以å??建NUMAå¹³å?°ï¼?å?¶ä¸ç??å??å??ä¸?å?¶ -ä»?å??å??æ??å¤?个è·?离ã?? - -对äº?Linuxï¼?æ??å?´è¶£ç??NUMAå¹³å?°ä¸»è¦?æ?¯æ??è°?ç??ç¼?å?ç?¸å¹²NUMA--ç®?称ccNUMAç³»ç»?ç³»ç»?ã??å?¨ccNUMAç³»ç»?ä¸ï¼? -æ??æ??ç??å??å?é?½æ?¯å?¯è§?ç??ï¼?并ä¸?å?¯ä»¥ä»?è¿?æ?¥å?°ä»»ä½?å??å??ç??ä»»ä½?CPUä¸è®¿é?®ï¼?ç¼?å?ä¸?è?´æ?§æ?¯ç?±å¤?ç??å?¨ç¼?å?å??/æ?? -ç³»ç»?äº?è¿?å?¨ç¡¬ä»¶ä¸å¤?ç??ã?? - -å??å?访é?®æ?¶é?´å??æ??æ??ç??å??å?带宽å??å?³äº?å??å?«CPUç??å??å??æ??è¿?è¡?å??å?访é?®ç??IOæ?»çº¿è·?离å??å?«ç?®æ ?å??å?ç??å??å?? -æ??å¤?è¿?ã??ä¾?å¦?ï¼?è¿?æ?¥å?°å??ä¸?å??å??ç??CPU对å??å?ç??访é?®å°?æ¯?访é?®å?¶ä»?è¿?ç¨?å??å??ç??å??å?ç»?å??æ?´å¿«ç??访é?®æ?¶é?´å?? -æ?´é«?ç??带宽ã?? NUMAå¹³å?°å?¯ä»¥å?¨ä»»ä½?ç»?å®?å??å??ä¸?访é?®å¤?ç§?è¿?ç¨?è·?离ç??ï¼?å?¶ä»?ï¼?å??å??ã?? - -å¹³å?°ä¾?åº?å??建ç«?NUMAç³»ç»?并ä¸?å?ªæ?¯ä¸ºäº?让软件å¼?å??人å??ç??ç??æ´»å??å¾?æ??趣ã??ç?¸å??ï¼?è¿?ç§?æ?¶æ??æ?¯æ??ä¾?å?¯æ?©å±? -å??å?带宽ç??ä¸?ç§?æ??段ã??ç?¶è??ï¼?为äº?å®?ç?°å?¯æ?©å±?ç??å??å?带宽ï¼?ç³»ç»?å??åº?ç?¨è½¯ä»¶å¿?é¡»å®?æ??大é?¨å??ç??å??å?å¼?ç?¨ -[cache misses]å?°â??æ?¬å?°â??å??å?â??â??å??ä¸?å??å??ç??å??å?ï¼?å¦?æ??æ??ç??è¯?â??â??æ??è??å?°æ??è¿?ç??æ??å??å?ç??å??å??ã?? - -è¿?å°±è?ªç?¶è??ç?¶æ??äº?Linux软件对NUMAç³»ç»?ç??è§?è§?: - -Linuxå°?ç³»ç»?ç??硬件èµ?æº?å??å??为å¤?个软件æ?½è±¡ï¼?称为â??è??ç?¹â??ã??Linuxå°?è??ç?¹æ? å°?å?°ç¡¬ä»¶å¹³å?°ç??ç?©ç??å??å?? -ä¸?ï¼?对ä¸?äº?æ?¶æ??ç??ç»?è??è¿?è¡?äº?æ?½è±¡ã??ä¸?ç?©ç??å??å??ä¸?æ ·ï¼?软件è??ç?¹å?¯è?½å??å?«0æ??æ?´å¤?ç??CPUã??å??å?å??/æ??IO -æ?»çº¿ã??å??æ ·ï¼?对â??è¾?è¿?â??è??ç?¹ç??å??å?访é?®â??â??æ? å°?å?°è¾?è¿?å??å??ç??è??ç?¹â??â??é??常ä¼?æ¯?对è¾?è¿?å??å??ç??访é?®ç»?å??æ?´å¿« -ç??访é?®æ?¶é?´å??æ?´é«?ç??æ??æ??带宽ã?? - -对äº?ä¸?äº?æ?¶æ??ï¼?å¦?x86ï¼?Linuxå°?â??é??è??â??ä»»ä½?代表没æ??å??å?è¿?æ?¥ç??ç?©ç??å??å??ç??è??ç?¹ï¼?并å°?è¿?æ?¥å?°è¯¥å??å?? -ç??ä»»ä½?CPUé??æ?°å??é??å?°ä»£è¡¨æ??å??å?ç??å??å??ç??è??ç?¹ä¸?ã??å? æ¤ï¼?å?¨è¿?äº?æ?¶æ??ä¸?ï¼?æ??们ä¸?è?½å??设Linuxå°?æ??æ?? -ç??CPUä¸?ä¸?个ç»?å®?ç??è??ç?¹ç?¸å?³è??ï¼?ä¼?ç??å?°ç?¸å??ç??æ?¬å?°å??å?访é?®æ?¶é?´å??带宽ã?? - -æ¤å¤?ï¼?对äº?æ??äº?æ?¶æ??ï¼?å??æ ·ä»¥x86为ä¾?ï¼?Linuxæ?¯æ??对é¢?å¤?è??ç?¹ç??仿ç??ã??对äº?NUMA仿ç??ï¼?Linuxä¼?å°?ç?° -æ??ç??è??ç?¹æ??è??é??NUMAå¹³å?°ç??ç³»ç»?å??å?å??å?²æ??å¤?个è??ç?¹ã??æ¯?个模æ??ç??è??ç?¹å°?管ç??åº?å±?å??å??ç?©ç??å??å?ç??ä¸?é?¨ -å??ã??NUMA仿ç??对äº?å?¨é??NUMAå¹³å?°ä¸?æµ?è¯?NUMAå??æ ¸å??åº?ç?¨å??è?½æ?¯é??常æ??ç?¨ç??ï¼?å½?ä¸?cpusetsä¸?起使ç?¨æ?¶ï¼? -å?¯ä»¥ä½?为ä¸?ç§?å??å?èµ?æº?管ç??æ?ºå?¶ã??[è§? Documentation/admin-guide/cgroup-v1/cpusets.rst] - -对äº?æ¯?个æ??å??å?ç??è??ç?¹ï¼?Linuxæ??建äº?ä¸?个ç?¬ç«?ç??å??å?管ç??å?ç³»ç»?ï¼?æ??è?ªå·±ç??空é?²é¡µå??表ã??使ç?¨ä¸é¡µå??表ã?? -使ç?¨ç»?计å??é??æ?¥è°?解访é?®ã??æ¤å¤?ï¼?Linux为æ¯?个å??å?å?º[DMAã??DMA32ã??NORMALã??HIGH_MEMORYã??MOVABLE -ä¸ç??ä¸?个æ??å¤?个]æ??建äº?ä¸?个æ??åº?ç??â??å?ºå??表â??ã??zonelistæ??å®?äº?å½?ä¸?个é??å®?ç??å?º/è??ç?¹ä¸?è?½æ»¡è¶³å??é??请æ±? -æ?¶è¦?访é?®ç??å?º/è??ç?¹ã??å½?ä¸?个å?ºæ²¡æ??å?¯ç?¨ç??å??å?æ?¥æ»¡è¶³è¯·æ±?æ?¶ï¼?è¿?ç§?æ??å?µè¢«ç§°ä¸ºâ??overflow 溢å?ºâ??æ?? -â??fallback å??é??â??ã?? - -ç?±äº?ä¸?äº?è??ç?¹å??å?«å¤?个å??å?«ä¸?å??ç±»å??å??å?ç??å?ºï¼?Linuxå¿?é¡»å?³å®?æ?¯å?¦å¯¹å?ºå??表è¿?è¡?æ??åº?ï¼?使å??é??å??é??å?°ä¸?å?? -è??ç?¹ä¸?ç??ç?¸å??å?ºç±»å??ï¼?æ??å??ä¸?è??ç?¹ä¸?ç??ä¸?å??å?ºç±»å??ã??è¿?æ?¯ä¸?个é??è¦?ç??è??è??å? ç´ ï¼?å? 为æ??äº?å?ºï¼?å¦?DMAæ??DMA32ï¼? -代表äº?ç?¸å¯¹ç¨?缺ç??èµ?æº?ã??Linuxé??æ?©äº?ä¸?个é»?认ç??Node ordered zonelistã??è¿?æ??å?³ç??å?¨ä½¿ç?¨æ??NUMAè·? -离æ??åº?ç??è¿?ç¨?è??ç?¹ä¹?å??ï¼?å®?ä¼?å°?è¯?å??é??å?°å??ä¸?è??ç?¹ç??å?¶ä»?å??å?ºã?? - -é»?认æ??å?µä¸?ï¼?Linuxä¼?å°?è¯?ä»?æ?§è¡?请æ±?ç??CPU被å??é??å?°ç??è??ç?¹ä¸æ»¡è¶³å??å?å??é??请æ±?ã??å?·ä½?æ?¥è¯´ï¼?Linuxå°?è¯? -å?¾ä»?请æ±?æ?¥æº?ç??è??ç?¹ç??é??å½?å??å?ºå??表ä¸ç??第ä¸?个è??ç?¹è¿?è¡?å??é??ã??è¿?被称为â??æ?¬å?°å??é??â??ã??å¦?æ??â??æ?¬å?°â??è??ç?¹ä¸?è?½ -满足请æ±?ï¼?å??æ ¸å°?æ£?æ?¥æ??é??å??å?ºå??表ä¸å?¶ä»?è??ç?¹ç??å?ºå??ï¼?寻æ?¾å??表ä¸ç¬¬ä¸?个è?½æ»¡è¶³è¯·æ±?ç??å?ºå??ã?? - -æ?¬å?°å??é??å°?å?¾å??äº?ä¿?æ??对å??é??ç??å??å?ç??å??ç»è®¿é?® â??æ?¬å?°â??ç??åº?å±?ç?©ç??èµ?æº?å??ç³»ç»?äº?è¿?â??â??å?ªè¦?å??æ ¸ä»£è¡¨å?¶å??é?? -ä¸?äº?å??å?ç??ä»»å?¡å??æ?¥ä¸?ä»?该å??å?è¿?移ã??Linuxè°?度å?¨ç?¥é??å¹³å?°ç??NUMAæ??æ??ç»?æ??â??â??ä½?ç?°å?¨â??è°?度å??â??æ?°æ?®ç»?æ?? -ä¸[è§? Documentation/scheduler/sched-domains.rst]â??â??并ä¸?è°?度å?¨è¯?å?¾å°½é??å??å°?ä»»å?¡è¿?移å?°é?¥ -è¿?ç??è°?度å??ä¸ã??ç?¶è??ï¼?è°?度å?¨å¹¶æ²¡æ??ç?´æ?¥è??è??å?°ä»»å?¡ç??NUMA足迹ã??å? æ¤ï¼?å?¨å??å??ä¸?平衡ç??æ??å?µä¸?ï¼?ä»»å?¡å?¯ -以å?¨è??ç?¹ä¹?é?´è¿?移ï¼?è¿?离å?¶å??å§?è??ç?¹å??å??æ ¸æ?°æ?®ç»?æ??ã?? - -ç³»ç»?管ç??å??å??åº?ç?¨ç¨?åº?设计è??å?¯ä»¥ä½¿ç?¨å??ç§?CPU亲å??å?½ä»¤è¡?æ?¥å?£ï¼?å¦?taskset(1)å??numactl(1)ï¼?以å??ç¨? -åº?æ?¥å?£ï¼?å¦?sched_setaffinity(2)ï¼?æ?¥é??å?¶ä»»å?¡ç??è¿?移ï¼?以æ?¹å??NUMAå®?ä½?ã??æ¤å¤?ï¼?人们å?¯ä»¥ä½¿ç?¨ -Linux NUMAå??å?ç?ç?¥ä¿®æ?¹å??æ ¸ç??é»?认æ?¬å?°å??é??è¡?为ã?? [è§? -:ref:`Documentation/admin-guide/mm/numa_memory_policy.rst <numa_memory_policy>`]. - -ç³»ç»?管ç??å??å?¯ä»¥ä½¿ç?¨æ?§å?¶ç»?å??CPUsetsé??å?¶é??ç?¹æ??ç?¨æ?·å?¨è°?度æ??NUMAå?½ä»¤å??å??è?½ä¸å?¯ä»¥æ??å®?ç??CPUå??è??ç?¹ -ç??å??å?ã?? [è§? Documentation/admin-guide/cgroup-v1/cpusets.rst] - -å?¨ä¸?é??è??æ? å??å?è??ç?¹ç??æ?¶æ??ä¸?ï¼?Linuxä¼?å?¨å??å?ºå??表ä¸å?ªå??æ?¬æ??å??å?ç??å?ºå??[è??ç?¹]ã??è¿?æ??å?³ç??对äº?ä¸?个æ? -å??å?ç??è??ç?¹ï¼?â??æ?¬å?°å??å?è??ç?¹â??â??â??CPUè??ç?¹ç??å??å?ºå??表ä¸ç??第ä¸?个å?ºå??ç??è??ç?¹â??â??å°?ä¸?æ?¯è??ç?¹æ?¬èº«ã??ç?¸å??ï¼?å®? -å°?æ?¯å??æ ¸å?¨å»ºç«?å??å?ºå??表æ?¶é??æ?©ç??离å®?æ??è¿?ç??æ??å??å?ç??è??ç?¹ã??æ??以ï¼?é»?认æ??å?µä¸?ï¼?æ?¬å?°å??é??å°?ç?±å??æ ¸æ??ä¾? -æ??è¿?ç??å?¯ç?¨å??å?æ?¥å®?æ??ã??è¿?æ?¯å??ä¸?æ?ºå?¶ç??ç»?æ??ï¼?该æ?ºå?¶å??许è¿?ç§?å??é??å?¨ä¸?个å??å?«å??å?ç??è??ç?¹æº¢å?ºæ?¶å??é??å?° -å?¶ä»?é??è¿?ç??è??ç?¹ã?? - -ä¸?äº?å??æ ¸å??é??ä¸?å¸?æ??æ??ä¸?è?½å®¹å¿?è¿?ç§?å??é??å??é??è¡?为ã??ç?¸å??ï¼?ä»?们æ?³ç¡®ä¿?ä»?们ä»?æ??å®?ç??è??ç?¹è?·å¾?å??å?ï¼?æ??è?? -å¾?å?°é??ç?¥è¯´è¯¥è??ç?¹æ²¡æ??空é?²å??å?ã??ä¾?å¦?ï¼?å½?ä¸?个å?ç³»ç»?å??é??æ¯?个CPUç??å??å?èµ?æº?æ?¶ï¼?é??常æ?¯è¿?ç§?æ??å?µã?? - -ä¸?个å?¸å??ç??å??é??模å¼?æ?¯ä½¿ç?¨å??æ ¸ç??numa_node_id()æ??CPU_to_node()å?½æ?°è?·å¾?â??å½?å??CPUâ??æ??å?¨è??ç?¹ç?? -è??ç?¹IDï¼?ç?¶å??å?ªä»?è¿?å??ç??è??ç?¹ID请æ±?å??å?ã??å½?è¿?æ ·ç??å??é??失败æ?¶ï¼?请æ±?ç??å?ç³»ç»?å?¯ä»¥æ?¢å¤?å?°å®?è?ªå·±ç??å??é?? -è·¯å¾?ã??æ?¿å??å??æ ¸å??å?å??é??å?¨å°±æ?¯è¿?æ ·ç??ä¸?个ä¾?å?ã??æ??è??ï¼?å?ç³»ç»?å?¯ä»¥é??æ?©å?¨å??é??失败æ?¶ç¦?ç?¨æ??ä¸?å?¯ç?¨è?ªå·±ã?? -å??æ ¸å??æ??å?ç³»ç»?å°±æ?¯è¿?æ ·ç??ä¸?个ä¾?å?ã?? - -å¦?æ??æ?¶æ??æ?¯æ??â??â??ä¸?é??è??æ? å??å?è??ç?¹ï¼?é?£ä¹?è¿?æ?¥å?°æ? å??å?è??ç?¹ç??CPUå°?æ?»æ?¯äº§ç??å??é??è·¯å¾?ç??å¼?é??ï¼?æ??è??ä¸?äº? -å?ç³»ç»?å¦?æ??è¯?å?¾å®?å?¨ä»?æ? å??å?ç??è??ç?¹å??é??å??å?ï¼?å°?æ? æ³?å??å§?å??ã??为äº?é??æ??å?°æ?¯æ??è¿?ç§?æ?¶æ??ï¼?å??æ ¸å?ç³»ç»?å?¯ -以使ç?¨numa_mem_id()æ??cpu_to_mem()å?½æ?°æ?¥å®?ä½?è°?ç?¨æ??æ??å®?CPUç??â??æ?¬å?°å??å?è??ç?¹â??ã??å??æ ·ï¼?è¿?æ?¯å?? -ä¸?个è??ç?¹ï¼?é»?认ç??æ?¬å?°é¡µå??é??å°?ä»?è¿?个è??ç?¹å¼?å§?å°?è¯?ã?? --- a/Documentation/translations/zh_CN/vm/overcommit-accounting.rst +++ /dev/null @@ -1,86 +0,0 @@ -:Original: Documentation/vm/overcommit-accounting.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - - -============== -è¶?é??使ç?¨å®¡è®¡ -============== - -Linuxå??æ ¸æ?¯æ??ä¸?å??è¶?é??使ç?¨å¤?ç??模å¼? - -0 - å?¯å??å¼?è¶?é??使ç?¨å¤?ç??ã??æ??ç»?æ??æ?¾ç??å?°å??空é?´è¶?é??使ç?¨ã??ç?¨äº?ä¸?个å?¸å??ç??ç³»ç»?ã?? - å®?ç¡®ä¿?严é??ç??ç?¯ç??å??é??失败ï¼?å??æ?¶å??许è¶?é??使ç?¨ä»¥å??å°?swapç??使ç?¨ã??å?¨è¿?ç§?模å¼?ä¸?ï¼? - å??许rootå??é??ç¨?å¤?ç??å??å?ã??è¿?æ?¯é»?认ç??ã?? -1 - æ?»æ?¯è¶?é??使ç?¨ã??é??ç?¨äº?ä¸?äº?ç§?å¦åº?ç?¨ã??ç»?å?¸ç??ä¾?å?æ?¯ä½¿ç?¨ç¨?ç??æ?°ç»?ç??代ç ?ï¼?å?ªæ?¯ä¾?èµ? - å? ä¹?å®?å?¨ç?±é?¶é¡µç»?æ??ç??è??æ??å??å? - -2 - ä¸?è¶?é??使ç?¨ã??ç³»ç»?æ??交ç??æ?»å?°å??空é?´ä¸?å??许è¶?è¿?swap+ä¸?个å?¯é??ç½®ç??ç?©ç??RAMç??æ?°é?? - ï¼?é»?认为50%ï¼?ã??æ ¹æ?®ä½ 使ç?¨ç??æ?°é??ï¼?å?¨å¤§å¤?æ?°æ??å?µä¸?ï¼?è¿?æ??å?³ç??ä¸?个è¿?ç¨?å?¨è®¿é?®é¡µé?¢æ?¶ - ä¸?ä¼?被æ??æ»ï¼?ä½?ä¼?å?¨å??å?å??é??ä¸?æ?¶å?°ç?¸åº?ç??é??误ã?? - - 对äº?é?£äº?æ?³ä¿?è¯?ä»?们ç??å??å?å??é??å?¨æ?ªæ?¥å?¯ç?¨è??å??ä¸?é??è¦?å??å§?å??æ¯?ä¸?个页é?¢ç??åº?ç?¨ç¨?åº?æ?¥è¯´ - æ?¯å¾?æ??ç?¨ç??ã?? - -è¶?é??使ç?¨ç?ç?¥æ?¯é??è¿?sysctl `vm.overcommit_memory` 设置ç??ã?? - -å?¯ä»¥é??è¿? `vm.overcommit_ratio` ï¼?ç?¾å??æ¯?ï¼?æ?? `vm.overcommit_kbytes` ï¼?ç»?对å?¼ï¼? -æ?¥è®¾ç½®è¶?é??æ?°é??ã??è¿?äº?å?ªæ??å?¨ `vm.overcommit_memory` 被设置为2æ?¶æ??æ??æ??æ??ã?? - -å?¨ ``/proc/meminfo`` ä¸å?¯ä»¥å??å?«ä»¥CommitLimitå??Committed_ASç??å½¢å¼?æ?¥ç??å½?å?? -ç??è¶?é??使ç?¨å??æ??交é??ã?? - -é?·é?± -==== - -Cè¯è¨?ç??å ?æ ?å¢?é?¿æ?¯ä¸?个é??å?«ç??mremapã??å¦?æ??ä½ æ?³å¾?å?°ç»?对ç??ä¿?è¯?ï¼?并å?¨æ?¥è¿?è¾¹ç¼?ç??å?°æ?¹è¿?è¡?ï¼? -ä½ **å¿?é¡»** ä¸ºä½ è®¤ä¸ºä½ é??è¦?ç??æ??大尺寸ç??å ?æ ?è¿?è¡?mmapã??对äº?å?¸å??ç??å ?æ ?使ç?¨æ?¥è¯´ï¼?è¿?并 -ä¸?é??è¦?ï¼?ä½?å¦?æ??ä½ ç??ç??é??常å?³å¿?ç??è¯?ï¼?è¿?å°±æ?¯ä¸?个å?¼å¾?å?³æ³¨ç??æ¡?ä¾?ã?? - - -å?¨æ¨¡å¼?2ä¸ï¼?MAP_NORESERVEæ ?å¿?被忽ç?¥ã?? - - -å®?æ?¯å¦?ä½?å·¥ä½?ç?? -============== - -è¶?é??使ç?¨æ?¯å?ºäº?以ä¸?è§?å?? - -对äº?æ??件æ? å°? - | SHARED or READ-only - 0 cost (该æ??件æ?¯æ? å°?è??ä¸?æ?¯äº¤æ?¢) - | PRIVATE WRITABLE - æ¯?个å®?ä¾?ç??æ? å°?大å°? - -对äº?å?¿å??æ??è?? ``/dev/zero`` æ? å°? - | SHARED - æ? å°?ç??大å°? - | PRIVATE READ-only - 0 cost (ä½?ä½?ç?¨ä¸?大) - | PRIVATE WRITABLE - æ¯?个å®?ä¾?ç??æ? å°?大å°? - -é¢?å¤?ç??计æ?° - | é??è¿?mmapå?¶ä½?å?¯å??å?¯æ?¬ç??页é?¢ - | ä»?å??ä¸?æ± ä¸æ??å??ç??shmfså??å? - -ç?¶æ?? -==== - -* æ??ä»¬æ ¸ç®?mmapå??å?æ? å°? -* æ??ä»¬æ ¸ç®?mprotectå?¨æ??交ä¸ç??å??å?? -* æ??ä»¬æ ¸ç®?mremapç??大å°?å??å?? -* æ??们ç??审计 brk -* 审计munmap -* æ??们å?¨/procä¸æ?¥å??commit ç?¶æ?? -* æ ¸å¯¹å¹¶æ£?æ?¥å??å??ç??æ??å?µ -* 审æ?¥å ?æ ?å¤?ç??/æ?§è¡?ä¸ç??æ??建 -* å??è¿°SHMfsç??æ??å?µ -* å®?ç?°å®?é??é??å?¶ç??æ?§è¡? - -å¾?ç» -==== -* ptrace 页计æ?°ï¼?è¿?å¾?é?¾ï¼?ã?? --- a/Documentation/translations/zh_CN/vm/page_frags.rst +++ /dev/null @@ -1,38 +0,0 @@ -:Original: Documentation/vm/page_frag.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -======== -页é?¢ç??段 -======== - -ä¸?个页é?¢ç??段æ?¯ä¸?个任æ??é?¿åº¦ç??ä»»æ??å??移ç??å??å?å?ºå??ï¼?å®?ä½?äº?ä¸?个0æ??æ?´é«?é?¶ç??å¤?å??页é?¢ä¸ã?? -该页ä¸ç??å¤?个ç¢?ç??å?¨è¯¥é¡µç??å¼?ç?¨è®¡æ?°å?¨ä¸è¢«å??ç?¬è®¡ç®?ã?? - -page_fragå?½æ?°ï¼?page_frag_allocå??page_frag_freeï¼?为页é?¢ç??段æ??ä¾?äº?ä¸?个ç®?å?? -ç??å??é??æ¡?æ?¶ã??è¿?被ç½?ç»?å ?æ ?å??ç½?ç»?设å¤?驱å?¨ä½¿ç?¨ï¼?以æ??ä¾?ä¸?个å??å?ç??æ?¯æ??å?ºå??ï¼?ä½?为 -sk_buff->head使ç?¨ï¼?æ??è??ç?¨äº?skb_shared_infoç?? â??fragsâ?? é?¨å??ã?? - -为äº?使ç?¨é¡µé?¢ç??段APIï¼?é??è¦?ä¸?个æ?¯æ??页é?¢ç??段ç??ç¼?å?²å?ºã??è¿?为ç¢?ç??å??é??æ??ä¾?äº?ä¸?个ä¸å¿?ç?¹ï¼? -并å??许å¤?个è°?ç?¨ä½¿ç?¨ä¸?个ç¼?å?ç??页é?¢ã??è¿?æ ·å??ç??好å¤?æ?¯å?¯ä»¥é?¿å??对get_pageç??å¤?次è°?ç?¨ï¼? -è¿?å?¨å??é??æ?¶å¼?é??å?¯è?½ä¼?å¾?大ã??ç?¶è??ï¼?ç?±äº?è¿?ç§?ç¼?å?ç??æ?§è´¨ï¼?è¦?æ±?ä»»ä½?对ç¼?å?ç??è°?ç?¨é?½è¦?å??å?°æ¯? -个CPUç??é??å?¶ï¼?æ??è??æ¯?个CPUç??é??å?¶ï¼?并å?¨æ?§è¡?ç¢?ç??å??é??æ?¶å¼ºå?¶ç¦?æ¢ä¸æ?ã?? - -ç½?ç»?å ?æ ?å?¨æ¯?个CPU使ç?¨ä¸¤ä¸ªç?¬ç«?ç??ç¼?å?æ?¥å¤?ç??ç¢?ç??å??é??ã??netdev_alloc_cache被使ç?¨ -netdev_alloc_fragå??__netdev_alloc_skbè°?ç?¨ç??è°?ç?¨è??使ç?¨ã??napi_alloc_cache -被è°?ç?¨__napi_alloc_fragå??__napi_alloc_skbç??è°?ç?¨è??使ç?¨ã??è¿?两个è°?ç?¨ç??主è¦?å?ºå?«æ?¯ -å®?们å?¯è?½è¢«è°?ç?¨ç??ç?¯å¢?ã??â??netdevâ?? å??ç¼?ç??å?½æ?°å?¯ä»¥å?¨ä»»ä½?ä¸?ä¸?æ??ä¸ä½¿ç?¨ï¼?å? 为è¿?äº?å?½æ?° -å°?ç¦?ç?¨ä¸æ?ï¼?è?? â??napiâ?? å??ç¼?ç??å?½æ?°å?ªå?¯ä»¥å?¨softirqä¸?ä¸?æ??ä¸ä½¿ç?¨ã?? - -许å¤?ç½?ç»?设å¤?驱å?¨ç¨?åº?使ç?¨ç±»ä¼¼ç??æ?¹æ³?æ?¥å??é??页é?¢ç??段ï¼?ä½?页é?¢ç??段æ?¯å?¨ç?¯æ??æ??述符级å?«ä¸? -ç¼?å?ç??ã??为äº?å®?ç?°è¿?äº?æ??å?µï¼?æ??å¿?è¦?æ??ä¾?ä¸?ç§?æ??解页é?¢ç¼?å?ç??é??ç?¨æ?¹æ³?ã??å?ºäº?è¿?个å??å? ï¼? -__page_frag_cache_drain被å®?ç?°äº?ã??å®?å??许é??è¿?ä¸?次è°?ç?¨ä»?ä¸?个页é?¢é??æ?¾å¤?个å¼?ç?¨ã?? -è¿?æ ·å??ç??好å¤?æ?¯ï¼?å®?å??许æ¸?ç??被添å? å?°ä¸?个页é?¢ç??å¤?个å¼?ç?¨ï¼?以é?¿å??æ¯?次å??é??é?½è°?ç?¨ -get_pageã?? - -Alexander Duyckï¼?2016å¹´11æ??29æ?¥ã?? --- a/Documentation/translations/zh_CN/vm/page_owner.rst +++ /dev/null @@ -1,116 +0,0 @@ -:Original: Documentation/vm/page_owner.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -================================ -page owner: è·?踪è°?å??é??ç??æ¯?个页é?¢ -================================ - -æ¦?è¿° -==== - -page owneræ?¯ç?¨æ?¥è¿½è¸ªè°?å??é??ç??æ¯?ä¸?个页é?¢ã??å®?å?¯ä»¥ç?¨æ?¥è°?è¯?å??å?æ³?æ¼?æ??æ?¾å?°å??å?å? ç?¨è??ã?? -å½?å??é??å??ç??æ?¶ï¼?æ??å?³å??é??ç??ä¿¡æ?¯ï¼?å¦?è°?ç?¨å ?æ ?å??页é?¢ç??顺åº?被å?å?¨å?°æ¯?个页é?¢ç??ç?¹å®?å?å?¨ä¸ã?? -å½?æ??们é??è¦?äº?解æ??æ??页é?¢ç??ç?¶æ??æ?¶ï¼?æ??们å?¯ä»¥è?·å¾?并å??æ??è¿?äº?ä¿¡æ?¯ã?? - -尽管æ??们已ç»?æ??äº?追踪页é?¢å??é??/é??æ?¾ç??tracepointï¼?ä½?ç?¨å®?æ?¥å??æ??è°?å??é??ç??æ¯?个页é?¢æ?¯ -ç?¸å½?å¤?æ??ç??ã??æ??们é??è¦?æ?©å¤§è·?踪ç¼?å?²å?ºï¼?以é?²æ¢å?¨ç?¨æ?·ç©ºé?´ç¨?åº?å?¯å?¨å??å?ºç?°é??å? ã??è??ä¸?ï¼?å?¯ -å?¨ç??ç¨?åº?ä¼?ä¸?æ?å?°å°?è·?踪ç¼?å?²å?ºè½¬å?ºï¼?ä¾?以å??å??æ??ï¼?è¿?å°?ä¼?æ?¹å??ç³»ç»?ç??è¡?为ï¼?ä¼?产ç??æ?´å¤?ç?? -å?¯è?½æ?§ï¼?è??ä¸?æ?¯ä»?ä»?ä¿?ç??å?¨å??å?ä¸ï¼?æ??以ä¸?å?©äº?è°?è¯?ã?? - -页é?¢æ??æ??è??ä¹?å?¯ä»¥ç?¨äº?å??ç§?ç?®ç??ã??ä¾?å¦?ï¼?å?¯ä»¥é??è¿?æ¯?个页é?¢ç??gfpæ ?å¿?ä¿¡æ?¯è?·å¾?精确ç??ç¢?ç?? -ç»?计ã??å¦?æ??å?¯ç?¨äº?page ownerï¼?å®?就已ç»?å®?ç?°å¹¶æ¿?æ´»äº?ã??æ??们é??常欢è¿?å?¶ä»?ç?¨é??ã?? - -page ownerå?¨é»?认æ??å?µä¸?æ?¯ç¦?ç?¨ç??ã??æ??以ï¼?å¦?æ??ä½ æ?³ä½¿ç?¨å®?ï¼?ä½ é??è¦?å?¨ä½ ç??å?¯å?¨cmdline -ä¸å? å?¥"page_owner=on"ã??å¦?æ??å??æ ¸æ?¯ç?¨page owneræ??建ç??ï¼?并ä¸?ç?±äº?没æ??å?¯ç?¨å?¯å?¨ -é??项è??å?¨è¿?è¡?æ?¶ç¦?ç?¨page ownerï¼?é?£ä¹?è¿?è¡?æ?¶ç??å¼?é??æ?¯å¾?å°?ç??ã??å¦?æ??å?¨è¿?è¡?æ?¶ç¦?ç?¨ï¼?å®?ä¸? -é??è¦?å??å?æ?¥å?å?¨æ??æ??è??ä¿¡æ?¯ï¼?æ??以没æ??è¿?è¡?æ?¶å??å?å¼?é??ã??è??ä¸?ï¼?页é?¢æ??æ??è??å?¨é¡µé?¢å??é??å?¨ç?? -ç?è·¯å¾?ä¸å?ªæ??å?¥äº?两个ä¸?å?¯è?½ç??å??æ?¯ï¼?å¦?æ??ä¸?å?¯ç?¨ï¼?é?£ä¹?å??é??å°±ä¼?å??没æ??页é?¢æ??æ??è??ç??å??æ ¸ -ä¸?æ ·è¿?è¡?ã??è¿?两个ä¸?å?¯è?½ç??å??æ?¯åº?该ä¸?ä¼?å½±å??å?°å??é??ç??æ?§è?½ï¼?ç?¹å?«æ?¯å?¨é??æ??é?®è·³è½¬æ ?ç¾ä¿®è¡¥ -å??è?½å?¯ç?¨ç??æ??å?µä¸?ã??以ä¸?æ?¯ç?±äº?è¿?个å??è?½è??导è?´ç??å??æ ¸ä»£ç ?大å°?ç??å??å??ã?? - -- 没æ??page owner:: - - text data bss dec hex filename - 48392 2333 644 51369 c8a9 mm/page_alloc.o - -- æ??page owner:: - - text data bss dec hex filename - 48800 2445 644 51889 cab1 mm/page_alloc.o - 6662 108 29 6799 1a8f mm/page_owner.o - 1025 8 8 1041 411 mm/page_ext.o - -è?½ç?¶æ?»å?±å¢?å? äº?8KBç??代ç ?ï¼?ä½?page_alloc.oå¢?å? äº?520å?è??ï¼?å?¶ä¸ä¸?å?°ä¸?å??æ?¯å?¨hotpath -ä¸ã??æ??建带æ??page ownerç??å??æ ¸ï¼?并å?¨é??è¦?æ?¶æ??å¼?å®?ï¼?å°?æ?¯è°?è¯?å??æ ¸å??å?é?®é¢?ç??æ??ä½³é??æ?©ã?? - -æ??ä¸?个é?®é¢?æ?¯ç?±å®?ç?°ç»?è??å¼?èµ·ç??ã??页æ??æ??è??å°?ä¿¡æ?¯å?å?¨å?°struct pageæ?©å±?ç??å??å?ä¸ã??è¿? -个å??å?ç??å??å§?å??æ?¶é?´æ¯?ç¨?ç??å??å?ç³»ç»?ä¸ç??页é?¢å??é??å?¨å?¯å?¨ç??æ?¶é?´è¦?æ??ä¸?äº?ï¼?æ??以ï¼?å?¨å??å§?å?? -ä¹?å??ï¼?许å¤?页é?¢å?¯ä»¥è¢«å??é??ï¼?ä½?å®?们没æ??æ??æ??è??ä¿¡æ?¯ã??为äº?解å?³è¿?个é?®é¢?ï¼?è¿?äº?æ?©æ??å??é??ç?? -页é?¢å?¨å??å§?å??é?¶æ®µè¢«è°?æ?¥å¹¶æ ?记为å??é??ã??è?½ç?¶è¿?并ä¸?æ??å?³ç??å®?们æ??æ£ç¡®ç??æ??æ??è??ä¿¡æ?¯ï¼?ä½?è?³ -å°?ï¼?æ??们å?¯ä»¥æ?´å??ç¡®å?°å?¤æ?该页æ?¯å?¦è¢«å??é??ã??å?¨2GBå??å?ç??x86-64è??æ??æ?ºä¸?ï¼?æ??13343 -个æ?©æ??å??é??ç??页é?¢è¢«æ??æ??å??æ ?è®°ï¼?尽管å®?们大é?¨å??æ?¯ç?±ç»?æ??页æ?©å±?å??è?½å??é??ç??ã??æ?»ä¹?ï¼?å?¨è¿? -ä¹?å??ï¼?没æ??ä»»ä½?页é?¢å¤?äº?æ?ªè¿½è¸ªç?¶æ??ã?? - -使ç?¨æ?¹æ³? -======== - -1) æ??建ç?¨æ?·ç©ºé?´ç??帮å?©:: - - cd tools/vm - make page_owner_sort - -2) å?¯ç?¨page owner: æ·»å? "page_owner=on" å?° boot cmdline. - -3) å??ä½ æ?³è°?è¯?ç??å·¥ä½?ã?? - -4) å??æ??æ?¥è?ªé¡µé?¢æ??æ??è??ç??ä¿¡æ?¯:: - - cat /sys/kernel/debug/page_owner > page_owner_full.txt - ./page_owner_sort page_owner_full.txt sorted_page_owner.txt - - ``page_owner_full.txt`` ç??ä¸?è?¬è¾?å?ºæ??å?µå¦?ä¸?(è¾?å?ºä¿¡æ?¯æ? ç¿»è¯?ä»·å?¼):: - - Page allocated via order XXX, ... - PFN XXX ... - // Detailed stack - - Page allocated via order XXX, ... - PFN XXX ... - // Detailed stack - - ``page_owner_sort`` å·¥å?·å¿½ç?¥äº? ``PFN`` è¡?ï¼?å°?å?©ä½?ç??è¡?æ?¾å?¨bufä¸ï¼?使ç?¨regexpæ?? - å??页åº?å?¼ï¼?计ç®?bufç??次æ?°å??页æ?°ï¼?æ??å??æ ¹æ?®å??æ?°è¿?è¡?æ??åº?ã?? - - å?¨ ``sorted_page_owner.txt`` ä¸å?¯ä»¥ç??å?°å?³äº?è°?å??é??äº?æ¯?个页é?¢ç??ç»?æ??ã??ä¸?è?¬è¾?å?º:: - - XXX times, XXX pages: - Page allocated via order XXX, ... - // Detailed stack - - é»?认æ??å?µä¸?ï¼? ``page_owner_sort`` æ?¯æ ¹æ?®bufç??æ?¶é?´æ?¥æ??åº?ç??ã??å¦?æ??ä½ æ?³ - æ??bufç??页æ?°æ??åº?ï¼?请使ç?¨-må??æ?°ã??详ç»?ç??å??æ?°æ?¯: - - å?ºæ?¬å?½æ?°: - - Sort: - -a æ??å??å?å??é??æ?¶é?´æ??åº? - -m æ??æ?»å??å?æ??åº? - -p æ??pidæ??åº?ã?? - -P æ??tgidæ??åº?ã?? - -r æ??å??å?é??æ?¾æ?¶é?´æ??åº?ã?? - -s æ??å ?æ ?è·?踪æ??åº?ã?? - -t æ??æ?¶é?´æ??åº?ï¼?é»?认ï¼?ã?? - - å?¶å®?å?½æ?°: - - Cull: - -c é??è¿?æ¯?è¾?å ?æ ?è·?踪è??ä¸?æ?¯æ?»å??æ?¥è¿?è¡?å??é?¤ã?? - - Filter: - -f è¿?滤æ??å??å?已被é??æ?¾ç??å??ç??ä¿¡æ?¯ã?? --- a/Documentation/translations/zh_CN/vm/page_table_check.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -:Original: Documentation/vm/page_table_check.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -======== -页表æ£?æ?¥ -======== - -æ¦?è¿° -==== - -页表æ£?æ?¥å??许é??è¿?ç¡®ä¿?é?²æ¢æ??äº?ç±»å??ç??å??å?æ??å??æ?¥å¼ºå??å??æ ¸ã?? - -å½?æ?°ç??页é?¢å?¯ä»¥ä»?ç?¨æ?·ç©ºé?´è®¿é?®æ?¶ï¼?页表æ£?æ?¥é??è¿?å°?å®?们ç??页表项ï¼?PTEs PMDç?ï¼?æ·»å? å?°é¡µè¡¨ä¸æ?¥æ?§è¡?é¢?å¤? -ç??éª?è¯?ã?? - -å?¨æ£?æµ?å?°æ??å??ç??æ??å?µä¸?ï¼?å??æ ¸ä¼?被崩æº?ã??页表æ£?æ?¥æ??ä¸?个å°?ç??æ?§è?½å??å??å?å¼?é??ã??å? æ¤ï¼?å®?å?¨é»?认æ??å?µä¸?æ?¯ç¦?ç?¨ -ç??ï¼?ä½?æ?¯å?¨é¢?å¤?ç??å? å?ºè¶?è¿?æ?§è?½æ??æ?¬ç??ç³»ç»?ä¸?ï¼?å?¯ä»¥é??æ?©å?¯ç?¨ã??å?¦å¤?ï¼?ç?±äº?页表æ£?æ?¥æ?¯å??æ¥ç??ï¼?å®?å?¯ä»¥å¸®å?©è°? -è¯?å??æ? å°?å??å?æ??å??é?®é¢?ï¼?å?¨é??误ç??æ? å°?å??ç??æ?¶å´©æº?å??æ ¸ï¼?è??ä¸?æ?¯å?¨å??å?æ??å??é??误å??ç??å??å??æ ¸å´©æº?ã?? - -å??é??æ? å°?æ£?æµ?é?»è¾? -================ - -+-------------------+-------------------+-------------------+------------------+ -| Current Mapping | New mapping | Permissions | Rule | -+===================+===================+===================+==================+ -| Anonymous | Anonymous | Read | Allow | -+-------------------+-------------------+-------------------+------------------+ -| Anonymous | Anonymous | Read / Write | Prohibit | -+-------------------+-------------------+-------------------+------------------+ -| Anonymous | Named | Any | Prohibit | -+-------------------+-------------------+-------------------+------------------+ -| Named | Anonymous | Any | Prohibit | -+-------------------+-------------------+-------------------+------------------+ -| Named | Named | Any | Allow | -+-------------------+-------------------+-------------------+------------------+ - -å?¯ç?¨é¡µè¡¨æ£?æ?¥ -============ - -ç?¨ä»¥ä¸?æ?¹æ³?æ??建å??æ ¸: - -- PAGE_TABLE_CHECK=y - 注æ??ï¼?å®?å?ªè?½å?¨ARCH_SUPPORTS_PAGE_TABLE_CHECKå?¯ç?¨ç??å¹³å?°ä¸?å?¯ç?¨ã?? - -- 使ç?¨ "page_table_check=on" å??æ ¸å??æ?°å?¯å?¨ã?? - -å?¯ä»¥é??æ?©ç?¨PAGE_TABLE_CHECK_ENFORCEDæ?¥æ??建å??æ ¸ï¼?以便å?¨æ²¡æ??é¢?å¤?ç??å??æ ¸å??æ?°ç??æ??å?µä¸?è?·å¾?页表 -æ?¯æ??ã?? --- a/Documentation/translations/zh_CN/vm/remap_file_pages.rst +++ /dev/null @@ -1,32 +0,0 @@ -:Original: Documentation/vm/remap_file_pages.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -============================== -remap_file_pages()ç³»ç»?è°?ç?¨ -============================== - -remap_file_pages()ç³»ç»?è°?ç?¨è¢«ç?¨æ?¥å??建ä¸?个é??线æ?§æ? å°?ï¼?ä¹?å°±æ?¯è¯´ï¼?å?¨è¿?个æ? å°?ä¸ï¼? -æ??件ç??页é?¢è¢«æ? åº?æ? å°?å?°å??å?ä¸ã??使ç?¨remap_file_pages()æ¯?é??å¤?è°?ç?¨mmap(2)ç??好 -å¤?æ?¯ï¼?å??è??ä¸?é??è¦?å??æ ¸å??建é¢?å¤?ç??VMAï¼?è??æ??å??å?å?ºï¼?æ?°æ?®ç»?æ??ã?? - -æ?¯æ??é??线æ?§æ? å°?é??è¦?å?¨å??æ ¸è??æ??å??å?å?ç³»ç»?ä¸ç¼?å??大é??ç??non-trivialç??代ç ?ï¼?å??æ?¬ç? -è·¯å¾?ã??å?¦å¤?ï¼?为äº?使é??线æ?§æ? å°?å·¥ä½?ï¼?å??æ ¸é??è¦?ä¸?ç§?æ?¹æ³?æ?¥å?ºå??æ£å¸¸ç??页表项å??带æ??æ??件 -å??移ç??项ï¼?pte_fileï¼?ã??å??æ ¸ä¸ºè¾¾å?°è¿?个ç?®ç??å?¨PTEä¸ä¿?ç??äº?æ ?å¿?ã??PTEæ ?å¿?æ?¯ç¨?缺èµ? -æº?ï¼?ç?¹å?«æ?¯å?¨æ??äº?CPUæ?¶æ??ä¸?ã??å¦?æ??è?½è?¾å?ºè¿?个æ ?å¿?ç?¨äº?å?¶ä»?ç?¨é??å°±æ?´å¥½äº?ã?? - -幸è¿?ç??æ?¯ï¼?å?¨ç??æ´»ä¸å¹¶æ²¡æ??å¾?å¤?remap_file_pages()ç??ç?¨æ?·ã??å?ªç?¥é??æ??ä¸?个ä¼?ä¸?ç??RDBMS -å®?ç?°å?¨32ä½?ç³»ç»?ä¸?使ç?¨è¿?个系ç»?è°?ç?¨æ?¥æ? å°?æ¯?32ä½?è??æ??å?°å??空é?´çº¿æ?§å°ºå¯¸æ?´å¤§ç??æ??件ã?? -ç?±äº?64ä½?ç³»ç»?ç??广æ³?使ç?¨ï¼?è¿?ç§?使ç?¨æ??å?µå·²ç»?ä¸?é??è¦?äº?ã?? - -syscall被åº?å¼?äº?ï¼?ç?°å?¨ç?¨ä¸?个模æ??æ?¥ä»£æ?¿å®?ã??仿ç??ä¼?å??建æ?°ç??VMAï¼?è??ä¸?æ?¯é??线æ?§æ? å°?ã?? -对äº?remap_file_pages()ç??å°?æ?°ç?¨æ?·æ?¥è¯´ï¼?å®?ç??å·¥ä½?é??度ä¼?å??æ?¢ï¼?ä½?ABI被ä¿?ç??äº?ã?? - -仿ç??ç??ä¸?个å?¯ä½?ç?¨ï¼?é?¤äº?æ?§è?½ä¹?å¤?ï¼?æ?¯ï¼?ç?±äº?é¢?å¤?ç??VMAï¼?ç?¨æ?·å?¯ä»¥æ?´å®¹æ??è¾¾å?° -vm.max_map_countç??é??å?¶ã??å?³äº?é??å?¶ç??æ?´å¤?ç»?è??ï¼?请å??è§?DEFAULT_MAX_MAP_COUNT -ç??注é??ã?? --- a/Documentation/translations/zh_CN/vm/split_page_table_lock.rst +++ /dev/null @@ -1,96 +0,0 @@ -:Original: Documentation/vm/split_page_table_lock.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -================================= -å??页表é??ï¼?split page table lockï¼? -================================= - -æ??å??ï¼?mm->page_table_lock spinlockä¿?æ?¤äº?mm_structç??æ??æ??页表ã??ä½?æ?¯è¿?ç§?æ?¹ -æ³?导è?´äº?å¤?线ç¨?åº?ç?¨ç¨?åº?ç??缺页å¼?常å?¯æ?©å±?æ?§å·®ï¼?å? 为对é??ç??äº?夺å¾?æ¿?ç??ã??为äº?æ??é«?å?¯æ?© -å±?æ?§ï¼?æ??们å¼?å?¥äº?å??页表é??ã?? - -æ??äº?å??页表é??ï¼?æ??们就æ??äº?å??ç?¬ç??æ¯?å¼ è¡¨é??æ?¥é¡ºåº?å??对表ç??访é?®ã??ç?®å??ï¼?æ??们对PTEå?? -PMD表使ç?¨å??页é??ã??对é«?å±?表ç??访é?®ç?±mm->page_table_lockä¿?æ?¤ã?? - -æ??ä¸?äº?è¾?å?©å·¥å?·æ?¥é??å®?/解é??ä¸?个表å??å?¶ä»?访é?®å?¨å?½æ?°: - - - pte_offset_map_lock() - æ? å°?pte并è?·å??PTE表é??ï¼?è¿?å??æ??å??é??ç??æ??é??ï¼? - - pte_unmap_unlock() - 解é??å??解æ? å°?PTE表ï¼? - - pte_alloc_map_lock() - å¦?æ??é??è¦?ç??è¯?ï¼?å??é??PTE表并è?·å??é??ï¼?å¦?æ??å??é??失败ï¼?è¿?å??å·²è?·å??ç??é??ç??æ??é?? - æ??NULLï¼? - - pte_lockptr() - è¿?å??æ??å??PTE表é??ç??æ??é??ï¼? - - pmd_lock() - å??å¾?PMD表é??ï¼?è¿?å??æ??å??é??ç??æ??é??ã?? - - pmd_lockptr() - è¿?å??æ??å??PMD表é??ç??æ??é??ï¼? - -å¦?æ??CONFIG_SPLIT_PTLOCK_CPUSï¼?é??常为4ï¼?å°?äº?æ??ç?äº?NR_CPUSï¼?å??å?¨ç¼?è¯? -æ?¶å?¯ç?¨PTE表ç??å??页表é??ã??å¦?æ??å??页é??被ç¦?ç?¨ï¼?æ??æ??ç??表é?½ç?±mm->page_table_lock -æ?¥ä¿?æ?¤ã?? - -å¦?æ??PMD表å?¯ç?¨äº?å??页é??ï¼?并ä¸?æ?¶æ??æ?¯æ??å®?ï¼?é?£ä¹?PMD表ç??å??页é??å°±ä¼?被å?¯ç?¨ï¼?è§? -ä¸?æ??ï¼?ã?? - -Hugetlb å??å??页表é?? -================== - -Hugetlbå?¯ä»¥æ?¯æ??å¤?ç§?页é?¢å¤§å°?ã??æ??们å?ªå¯¹PMD级å?«ä½¿ç?¨å??页é??ï¼?ä½?ä¸?对PUD使ç?¨ã?? - -Hugetlbç?¹å®?ç??è¾?å?©å?½æ?°: - - - huge_pte_lock() - 对PMD_SIZE页é?¢é??å??pmdå??å?²é??ï¼?å?¦å??mm->page_table_lockï¼? - - huge_pte_lockptr() - è¿?å??æ??å??表é??ç??æ??é??ã?? - -æ?¶æ??对å??页表é??ç??æ?¯æ?? -==================== - -没æ??å¿?è¦?ç?¹å?«å?¯ç?¨PTEå??页表é??ï¼?æ??æ??é??è¦?ç??ä¸?西é?½ç?±pgtable_pte_page_ctor() -å??pgtable_pte_page_dtor()å®?æ??ï¼?å®?们å¿?é¡»å?¨PTE表å??é??/é??æ?¾æ?¶è¢«è°?ç?¨ã?? - -ç¡®ä¿?æ?¶æ??ä¸?使ç?¨slabå??é??å?¨æ?¥å??é??页表ï¼?slab使ç?¨page->slab_cacheæ?¥å??é??å?¶é¡µ -é?¢ã??è¿?个å?ºå??ä¸?page->ptlå?±äº«å?å?¨ã?? - -PMDå??页é??å?ªæ??å?¨ä½ æ??两个以ä¸?ç??页表级å?«æ?¶æ??æ??æ??ä¹?ã?? - -å?¯ç?¨PMDå??页é??é??è¦?å?¨PMD表å??é??æ?¶è°?ç?¨pgtable_pmd_page_ctor()ï¼?å?¨é??æ?¾æ?¶è°? -ç?¨pgtable_pmd_page_dtor()ã?? - -å??é??é??常å??ç??å?¨pmd_alloc_one()ä¸ï¼?é??æ?¾å??ç??å?¨pmd_free()å??pmd_free_tlb() -ä¸ï¼?ä½?è¦?ç¡®ä¿?è¦?ç??æ??æ??ç??PMD表å??é??/é??æ?¾è·¯å¾?ï¼?å?³X86_PAEå?¨pgd_alloc()ä¸é¢?å?? -å??é??ä¸?äº?PMDã?? - -ä¸?å??就绪å??ï¼?ä½ å?¯ä»¥è®¾ç½®CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCKã?? - -注æ??ï¼?pgtable_pte_page_ctor()å??pgtable_pmd_page_ctor()å?¯è?½å¤±è´¥--å¿? -é¡»æ£ç¡®å¤?ç??ã?? - -page->ptl -========= - -page->ptlç?¨äº?访é?®å??å?²é¡µè¡¨é??ï¼?å?¶ä¸'page'æ?¯å??å?«è¯¥è¡¨ç??页é?¢struct pageã??å®? -ä¸?page->privateï¼?以å??unionä¸ç??å?¶ä»?å? 个å?段ï¼?å?±äº«å?å?¨ã?? - -为äº?é?¿å??å¢?å? struct pageç??大å°?并è?·å¾?æ??ä½³æ?§è?½ï¼?æ??们使ç?¨äº?ä¸?个æ??å·§: - - - å¦?æ??spinlock_té??å??äº?longï¼?æ??们使ç?¨page->pträ½?为spinlockï¼?è¿?æ ·æ??们 - å°±å?¯ä»¥é?¿å??é?´æ?¥è®¿é?®å¹¶è??ç??ä¸?个ç¼?å?è¡?ã?? - - å¦?æ??spinlock_tç??大å°?大äº?longç??大å°?ï¼?æ??们使ç?¨page->ptlä½?为spinlock_t - ç??æ??é??并å?¨æ??å??é??å®?ã??è¿?å??许å?¨å?¯ç?¨DEBUG_SPINLOCKæ??DEBUG_LOCK_ALLOCç?? - æ??å?µä¸?使ç?¨å??页é??ï¼?ä½?ç?±äº?é?´æ?¥è®¿é?®è??å¤?è?±äº?ä¸?个ç¼?å?è¡?ã?? - -PTE表ç??spinlock_tå??é??å?¨pgtable_pte_page_ctor()ä¸ï¼?PMD表ç??spinlock_t -å??é??å?¨pgtable_pmd_page_ctor()ä¸ã?? - -请ä¸?è¦?ç?´æ?¥è®¿é?®page->ptl - -使ç?¨é??å½?ç??è¾?å?©å?½æ?°ã?? --- a/Documentation/translations/zh_CN/vm/z3fold.rst +++ /dev/null @@ -1,31 +0,0 @@ -:Original: Documentation/vm/z3fold.rst - -:ç¿»è¯?: - - å?¸å»¶è?¾ Yanteng Si <siyanteng@xxxxxxxxxxx> - -:æ ¡è¯?: - - -====== -z3fold -====== - -z3foldæ?¯ä¸?个ä¸?é?¨ç?¨äº?å?å?¨å??缩页ç??å??é??å?¨ã??å®?被设计为æ¯?个ç?©ç??页æ??å¤?å?¯ä»¥å?å?¨ä¸?个å??缩页ã?? -å®?æ?¯zbudç??è¡?ç??ç?©ï¼?å??许æ?´é«?ç??å??缩ç??ï¼?ä¿?æ??å?¶å??è¾?ç??ç®?å??æ?§å??ç¡®å®?æ?§ã?? - -z3foldå??zbudç??主è¦?å?ºå?«æ?¯: - -* ä¸?zbudä¸?å??ç??æ?¯ï¼?z3foldå??许æ??大ç??PAGE_SIZEå??é??ã?? -* z3foldå?¨å?¶é¡µé?¢ä¸æ??å¤?å?¯ä»¥å®¹çº³3个å??缩页é?¢ -* z3foldæ?¬èº«æ²¡æ??è¾?å?ºä»»ä½?APIï¼?å? æ¤æ??ç®?é??è¿?zpoolç??APIæ?¥ä½¿ç?¨ - -为äº?ä¿?æ??ç¡®å®?æ?§å??ç®?å??æ?§ï¼?z3foldï¼?å°±å??zbudä¸?æ ·ï¼?æ?»æ?¯å?¨æ¯?页å?å?¨ä¸?个æ?´æ?°ç??å??缩页ï¼?ä½?æ?¯ -å®?æ??å¤?å?¯ä»¥å?å?¨3页ï¼?ä¸?å??zbudæ??å¤?å?¯ä»¥å?å?¨2页ã??å? æ¤å??缩ç??è¾¾å?°2.7å??å·¦å?³ï¼?è??zbudç??å??缩 -ç??æ?¯1.7å??å·¦å?³ã?? - -ä¸?å??zbudï¼?ä½?ä¹?å??zsmallocï¼?ï¼?z3fold_alloc()é?£æ ·ä¸?è¿?å??ä¸?个å?¯é??å¤?å¼?ç?¨ç??æ??é??ã??ç?¸å??ï¼?å®? -è¿?å??ä¸?个æ? 符å?·é?¿å?¥æ??ï¼?å®?ç¼?ç ?äº?被å??é??对象ç??å®?é??ä½?ç½®ã?? - -ä¿?æ??æ??æ??ç??å??缩ç??æ?¥è¿?äº?zsmallocï¼?z3foldä¸?ä¾?èµ?äº?MMUç??å?¯ç?¨ï¼?并æ??ä¾?æ?´å?¯é¢?æµ?ç??å??æ?¶è¡? -为ï¼?è¿?使å¾?å®?æ?´é??å??äº?å°?å??å??å??åº?è¿?é??ç??ç³»ç»?ã?? --- a/Documentation/translations/zh_CN/vm/zsmalloc.rst +++ /dev/null @@ -1,78 +0,0 @@ -: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 --- a/Documentation/translations/zh_TW/index.rst~docs-rename-documentation-vm-to-documentation-mm +++ a/Documentation/translations/zh_TW/index.rst @@ -128,7 +128,7 @@ TODOList: * security/index * sound/index * crypto/index -* vm/index +* mm/index * bpf/index * usb/index * PCI/index --- a/Documentation/vm/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -page-types -slabinfo --- a/Documentation/vm/memory-model.rst +++ /dev/null @@ -1,177 +0,0 @@ -.. SPDX-License-Identifier: GPL-2.0 - -.. _physical_memory_model: - -===================== -Physical Memory Model -===================== - -Physical memory in a system may be addressed in different ways. The -simplest case is when the physical memory starts at address 0 and -spans a contiguous range up to the maximal address. It could be, -however, that this range contains small holes that are not accessible -for the CPU. Then there could be several contiguous ranges at -completely distinct addresses. And, don't forget about NUMA, where -different memory banks are attached to different CPUs. - -Linux abstracts this diversity using one of the two memory models: -FLATMEM and SPARSEMEM. Each architecture defines what -memory models it supports, what the default memory model is and -whether it is possible to manually override that default. - -All the memory models track the status of physical page frames using -struct page arranged in one or more arrays. - -Regardless of the selected memory model, there exists one-to-one -mapping between the physical page frame number (PFN) and the -corresponding `struct page`. - -Each memory model defines :c:func:`pfn_to_page` and :c:func:`page_to_pfn` -helpers that allow the conversion from PFN to `struct page` and vice -versa. - -FLATMEM -======= - -The simplest memory model is FLATMEM. This model is suitable for -non-NUMA systems with contiguous, or mostly contiguous, physical -memory. - -In the FLATMEM memory model, there is a global `mem_map` array that -maps the entire physical memory. For most architectures, the holes -have entries in the `mem_map` array. The `struct page` objects -corresponding to the holes are never fully initialized. - -To allocate the `mem_map` array, architecture specific setup code should -call :c:func:`free_area_init` function. Yet, the mappings array is not -usable until the call to :c:func:`memblock_free_all` that hands all the -memory to the page allocator. - -An architecture may free parts of the `mem_map` array that do not cover the -actual physical pages. In such case, the architecture specific -:c:func:`pfn_valid` implementation should take the holes in the -`mem_map` into account. - -With FLATMEM, the conversion between a PFN and the `struct page` is -straightforward: `PFN - ARCH_PFN_OFFSET` is an index to the -`mem_map` array. - -The `ARCH_PFN_OFFSET` defines the first page frame number for -systems with physical memory starting at address different from 0. - -SPARSEMEM -========= - -SPARSEMEM is the most versatile memory model available in Linux and it -is the only memory model that supports several advanced features such -as hot-plug and hot-remove of the physical memory, alternative memory -maps for non-volatile memory devices and deferred initialization of -the memory map for larger systems. - -The SPARSEMEM model presents the physical memory as a collection of -sections. A section is represented with struct mem_section -that contains `section_mem_map` that is, logically, a pointer to an -array of struct pages. However, it is stored with some other magic -that aids the sections management. The section size and maximal number -of section is specified using `SECTION_SIZE_BITS` and -`MAX_PHYSMEM_BITS` constants defined by each architecture that -supports SPARSEMEM. While `MAX_PHYSMEM_BITS` is an actual width of a -physical address that an architecture supports, the -`SECTION_SIZE_BITS` is an arbitrary value. - -The maximal number of sections is denoted `NR_MEM_SECTIONS` and -defined as - -.. math:: - - NR\_MEM\_SECTIONS = 2 ^ {(MAX\_PHYSMEM\_BITS - SECTION\_SIZE\_BITS)} - -The `mem_section` objects are arranged in a two-dimensional array -called `mem_sections`. The size and placement of this array depend -on `CONFIG_SPARSEMEM_EXTREME` and the maximal possible number of -sections: - -* When `CONFIG_SPARSEMEM_EXTREME` is disabled, the `mem_sections` - array is static and has `NR_MEM_SECTIONS` rows. Each row holds a - single `mem_section` object. -* When `CONFIG_SPARSEMEM_EXTREME` is enabled, the `mem_sections` - array is dynamically allocated. Each row contains PAGE_SIZE worth of - `mem_section` objects and the number of rows is calculated to fit - all the memory sections. - -The architecture setup code should call sparse_init() to -initialize the memory sections and the memory maps. - -With SPARSEMEM there are two possible ways to convert a PFN to the -corresponding `struct page` - a "classic sparse" and "sparse -vmemmap". The selection is made at build time and it is determined by -the value of `CONFIG_SPARSEMEM_VMEMMAP`. - -The classic sparse encodes the section number of a page in page->flags -and uses high bits of a PFN to access the section that maps that page -frame. Inside a section, the PFN is the index to the array of pages. - -The sparse vmemmap uses a virtually mapped memory map to optimize -pfn_to_page and page_to_pfn operations. There is a global `struct -page *vmemmap` pointer that points to a virtually contiguous array of -`struct page` objects. A PFN is an index to that array and the -offset of the `struct page` from `vmemmap` is the PFN of that -page. - -To use vmemmap, an architecture has to reserve a range of virtual -addresses that will map the physical pages containing the memory -map and make sure that `vmemmap` points to that range. In addition, -the architecture should implement :c:func:`vmemmap_populate` method -that will allocate the physical memory and create page tables for the -virtual memory map. If an architecture does not have any special -requirements for the vmemmap mappings, it can use default -:c:func:`vmemmap_populate_basepages` provided by the generic memory -management. - -The virtually mapped memory map allows storing `struct page` objects -for persistent memory devices in pre-allocated storage on those -devices. This storage is represented with struct vmem_altmap -that is eventually passed to vmemmap_populate() through a long chain -of function calls. The vmemmap_populate() implementation may use the -`vmem_altmap` along with :c:func:`vmemmap_alloc_block_buf` helper to -allocate memory map on the persistent memory device. - -ZONE_DEVICE -=========== -The `ZONE_DEVICE` facility builds upon `SPARSEMEM_VMEMMAP` to offer -`struct page` `mem_map` services for device driver identified physical -address ranges. The "device" aspect of `ZONE_DEVICE` relates to the fact -that the page objects for these address ranges are never marked online, -and that a reference must be taken against the device, not just the page -to keep the memory pinned for active use. `ZONE_DEVICE`, via -:c:func:`devm_memremap_pages`, performs just enough memory hotplug to -turn on :c:func:`pfn_to_page`, :c:func:`page_to_pfn`, and -:c:func:`get_user_pages` service for the given range of pfns. Since the -page reference count never drops below 1 the page is never tracked as -free memory and the page's `struct list_head lru` space is repurposed -for back referencing to the host device / driver that mapped the memory. - -While `SPARSEMEM` presents memory as a collection of sections, -optionally collected into memory blocks, `ZONE_DEVICE` users have a need -for smaller granularity of populating the `mem_map`. Given that -`ZONE_DEVICE` memory is never marked online it is subsequently never -subject to its memory ranges being exposed through the sysfs memory -hotplug api on memory block boundaries. The implementation relies on -this lack of user-api constraint to allow sub-section sized memory -ranges to be specified to :c:func:`arch_add_memory`, the top-half of -memory hotplug. Sub-section support allows for 2MB as the cross-arch -common alignment granularity for :c:func:`devm_memremap_pages`. - -The users of `ZONE_DEVICE` are: - -* pmem: Map platform persistent memory to be used as a direct-I/O target - via DAX mappings. - -* hmm: Extend `ZONE_DEVICE` with `->page_fault()` and `->page_free()` - event callbacks to allow a device-driver to coordinate memory management - events related to device-memory, typically GPU memory. See - Documentation/vm/hmm.rst. - -* p2pdma: Create `struct page` objects to allow peer devices in a - PCI/-E topology to coordinate direct-DMA operations between themselves, - i.e. bypass host memory. --- a/include/linux/hmm.h~docs-rename-documentation-vm-to-documentation-mm +++ a/include/linux/hmm.h @@ -4,7 +4,7 @@ * * Authors: Jérôme Glisse <jglisse@xxxxxxxxxx> * - * See Documentation/vm/hmm.rst for reasons and overview of what HMM is. + * See Documentation/mm/hmm.rst for reasons and overview of what HMM is. */ #ifndef LINUX_HMM_H #define LINUX_HMM_H @@ -100,7 +100,7 @@ struct hmm_range { }; /* - * Please see Documentation/vm/hmm.rst for how to use the range API. + * Please see Documentation/mm/hmm.rst for how to use the range API. */ int hmm_range_fault(struct hmm_range *range); --- a/include/linux/memremap.h~docs-rename-documentation-vm-to-documentation-mm +++ a/include/linux/memremap.h @@ -39,7 +39,7 @@ struct vmem_altmap { * must be treated as an opaque object, rather than a "normal" struct page. * * A more complete discussion of unaddressable memory may be found in - * include/linux/hmm.h and Documentation/vm/hmm.rst. + * include/linux/hmm.h and Documentation/mm/hmm.rst. * * MEMORY_DEVICE_COHERENT: * Device memory that is cache coherent from device and CPU point of view. This --- a/include/linux/mmu_notifier.h~docs-rename-documentation-vm-to-documentation-mm +++ a/include/linux/mmu_notifier.h @@ -198,7 +198,7 @@ struct mmu_notifier_ops { * invalidate_range_start()/end() notifiers, as * invalidate_range() already catches the points in time when an * external TLB range needs to be flushed. For more in depth - * discussion on this see Documentation/vm/mmu_notifier.rst + * discussion on this see Documentation/mm/mmu_notifier.rst * * Note that this function might be called with just a sub-range * of what was passed to invalidate_range_start()/end(), if --- a/include/linux/sched/mm.h~docs-rename-documentation-vm-to-documentation-mm +++ a/include/linux/sched/mm.h @@ -29,7 +29,7 @@ extern struct mm_struct *mm_alloc(void); * * Use mmdrop() to release the reference acquired by mmgrab(). * - * See also <Documentation/vm/active_mm.rst> for an in-depth explanation + * See also <Documentation/mm/active_mm.rst> for an in-depth explanation * of &mm_struct.mm_count vs &mm_struct.mm_users. */ static inline void mmgrab(struct mm_struct *mm) @@ -92,7 +92,7 @@ static inline void mmdrop_sched(struct m * * Use mmput() to release the reference acquired by mmget(). * - * See also <Documentation/vm/active_mm.rst> for an in-depth explanation + * See also <Documentation/mm/active_mm.rst> for an in-depth explanation * of &mm_struct.mm_count vs &mm_struct.mm_users. */ static inline void mmget(struct mm_struct *mm) --- a/include/linux/swap.h~docs-rename-documentation-vm-to-documentation-mm +++ a/include/linux/swap.h @@ -74,7 +74,7 @@ static inline int current_is_kswapd(void /* * Unaddressable device memory support. See include/linux/hmm.h and - * Documentation/vm/hmm.rst. Short description is we need struct pages for + * Documentation/mm/hmm.rst. Short description is we need struct pages for * device memory that is unaddressable (inaccessible) by CPU, so that we can * migrate part of a process memory to device memory. * --- a/MAINTAINERS~docs-rename-documentation-vm-to-documentation-mm +++ a/MAINTAINERS @@ -5509,7 +5509,7 @@ L: linux-mm@xxxxxxxxx S: Maintained F: Documentation/ABI/testing/sysfs-kernel-mm-damon F: Documentation/admin-guide/mm/damon/ -F: Documentation/vm/damon/ +F: Documentation/mm/damon/ F: include/linux/damon.h F: include/trace/events/damon.h F: mm/damon/ @@ -9016,7 +9016,7 @@ HMM - Heterogeneous Memory Management M: Jérôme Glisse <jglisse@xxxxxxxxxx> L: linux-mm@xxxxxxxxx S: Maintained -F: Documentation/vm/hmm.rst +F: Documentation/mm/hmm.rst F: include/linux/hmm* F: lib/test_hmm* F: mm/hmm* @@ -9114,8 +9114,8 @@ L: linux-mm@xxxxxxxxx S: Maintained F: Documentation/ABI/testing/sysfs-kernel-mm-hugepages F: Documentation/admin-guide/mm/hugetlbpage.rst -F: Documentation/vm/hugetlbfs_reserv.rst -F: Documentation/vm/vmemmap_dedup.rst +F: Documentation/mm/hugetlbfs_reserv.rst +F: Documentation/mm/vmemmap_dedup.rst F: fs/hugetlbfs/ F: include/linux/hugetlb.h F: mm/hugetlb.c @@ -15048,7 +15048,7 @@ M: Pasha Tatashin <pasha.tatashin@soleen M: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> L: linux-mm@xxxxxxxxx S: Maintained -F: Documentation/vm/page_table_check.rst +F: Documentation/mm/page_table_check.rst F: include/linux/page_table_check.h F: mm/page_table_check.c @@ -22130,7 +22130,7 @@ M: Nitin Gupta <ngupta@xxxxxxxxxx> R: Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> L: linux-mm@xxxxxxxxx S: Maintained -F: Documentation/vm/zsmalloc.rst +F: Documentation/mm/zsmalloc.rst F: include/linux/zsmalloc.h F: mm/zsmalloc.c --- a/mm/debug_vm_pgtable.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/debug_vm_pgtable.c @@ -35,7 +35,7 @@ #include <asm/tlbflush.h> /* - * Please refer Documentation/vm/arch_pgtable_helpers.rst for the semantics + * Please refer Documentation/mm/arch_pgtable_helpers.rst for the semantics * expectations that are being validated here. All future changes in here * or the documentation need to be in sync. */ --- a/mm/frontswap.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/frontswap.c @@ -4,7 +4,7 @@ * * This code provides the generic "frontend" layer to call a matching * "backend" driver implementation of frontswap. See - * Documentation/vm/frontswap.rst for more information. + * Documentation/mm/frontswap.rst for more information. * * Copyright (C) 2009-2012 Oracle Corp. All rights reserved. * Author: Dan Magenheimer --- a/mm/huge_memory.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/huge_memory.c @@ -2101,7 +2101,7 @@ static void __split_huge_zero_page_pmd(s * replacing a zero pmd write protected page with a zero pte write * protected page. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ pmdp_huge_clear_flush(vma, haddr, pmd); --- a/mm/hugetlb.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/hugetlb.c @@ -4884,7 +4884,7 @@ again: * table protection not changing it to point * to a new page. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ huge_ptep_set_wrprotect(src, addr, src_pte); entry = huge_pte_wrprotect(entry); @@ -6419,7 +6419,7 @@ unsigned long hugetlb_change_protection( * No need to call mmu_notifier_invalidate_range() we are downgrading * page table protection not changing it to point to a new page. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ i_mmap_unlock_write(vma->vm_file->f_mapping); mmu_notifier_invalidate_range_end(&range); @@ -7138,7 +7138,7 @@ void hugetlb_unshare_all_pmds(struct vm_ i_mmap_unlock_write(vma->vm_file->f_mapping); /* * No need to call mmu_notifier_invalidate_range(), see - * Documentation/vm/mmu_notifier.rst. + * Documentation/mm/mmu_notifier.rst. */ mmu_notifier_invalidate_range_end(&range); } --- a/mm/hugetlb_vmemmap.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/hugetlb_vmemmap.c @@ -6,7 +6,7 @@ * * Author: Muchun Song <songmuchun@xxxxxxxxxxxxx> * - * See Documentation/vm/vmemmap_dedup.rst + * See Documentation/mm/vmemmap_dedup.rst */ #define pr_fmt(fmt) "HugeTLB: " fmt --- a/mm/Kconfig~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/Kconfig @@ -663,7 +663,7 @@ config KSM the many instances by a single page with that content, so saving memory until one or another app needs to modify the content. Recommended for use with KVM, or with other duplicative applications. - See Documentation/vm/ksm.rst for more information: KSM is inactive + See Documentation/mm/ksm.rst for more information: KSM is inactive until a program has madvised that an area is MADV_MERGEABLE, and root has set /sys/kernel/mm/ksm/run to 1 (if CONFIG_SYSFS is set). --- a/mm/ksm.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/ksm.c @@ -1085,7 +1085,7 @@ static int write_protect_page(struct vm_ * No need to notify as we are downgrading page table to read * only not changing it to point to a new page. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ entry = ptep_clear_flush(vma, pvmw.address, pvmw.pte); /* @@ -1188,7 +1188,7 @@ static int replace_page(struct vm_area_s * No need to notify as we are replacing a read only page with another * read only page with the same content. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ ptep_clear_flush(vma, addr, ptep); set_pte_at_notify(mm, addr, ptep, newpte); --- a/mm/mmap.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/mmap.c @@ -2874,7 +2874,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsign unsigned long ret = -EINVAL; struct file *file; - pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n", + pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/mm/remap_file_pages.rst.\n", current->comm, current->pid); if (prot) --- a/mm/rmap.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/rmap.c @@ -999,7 +999,7 @@ static int page_vma_mkclean_one(struct p * downgrading page table protection not changing it to point * to a new page. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ if (ret) cleaned++; @@ -1762,7 +1762,7 @@ static bool try_to_unmap_one(struct foli * to point at a new folio while a device is * still using this folio. * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ dec_mm_counter(mm, mm_counter_file(&folio->page)); } @@ -1772,7 +1772,7 @@ discard: * done above for all cases requiring it to happen under page * table lock before mmu_notifier_invalidate_range_end() * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ page_remove_rmap(subpage, vma, folio_test_hugetlb(folio)); if (vma->vm_flags & VM_LOCKED) @@ -2093,7 +2093,7 @@ static bool try_to_migrate_one(struct fo * done above for all cases requiring it to happen under page * table lock before mmu_notifier_invalidate_range_end() * - * See Documentation/vm/mmu_notifier.rst + * See Documentation/mm/mmu_notifier.rst */ page_remove_rmap(subpage, vma, folio_test_hugetlb(folio)); if (vma->vm_flags & VM_LOCKED) --- a/mm/sparse-vmemmap.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/sparse-vmemmap.c @@ -760,7 +760,7 @@ static int __meminit vmemmap_populate_co /* * Reuse the previous page for the rest of tail pages - * See layout diagram in Documentation/vm/vmemmap_dedup.rst + * See layout diagram in Documentation/mm/vmemmap_dedup.rst */ next += PAGE_SIZE; rc = vmemmap_populate_range(next, last, node, NULL, --- a/mm/util.c~docs-rename-documentation-vm-to-documentation-mm +++ a/mm/util.c @@ -973,7 +973,7 @@ EXPORT_SYMBOL_GPL(vm_memory_committed); * succeed and -ENOMEM implies there is not. * * We currently support three overcommit policies, which are set via the - * vm.overcommit_memory sysctl. See Documentation/vm/overcommit-accounting.rst + * vm.overcommit_memory sysctl. See Documentation/mm/overcommit-accounting.rst * * Strict overcommit modes added 2002 Feb 26 by Alan Cox. * Additional code 2002 Jul 20 by Robert Love. --- a/tools/vm/page_owner_sort.c~docs-rename-documentation-vm-to-documentation-mm +++ a/tools/vm/page_owner_sort.c @@ -8,7 +8,7 @@ * Or sort by total memory: * ./page_owner_sort -m page_owner_full.txt sorted_page_owner.txt * - * See Documentation/vm/page_owner.rst + * See Documentation/mm/page_owner.rst */ #include <stdio.h> _ Patches currently in -mm which might be from rppt@xxxxxxxxxxxxx are docs-rename-documentation-vm-to-documentation-mm.patch