sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/translations/zh_CN/mm/highmemmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/zh_TW/mm/highmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/it_IT/mm/highmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ja_JP/mm/highmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ko_KR/mm/highmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/pt_BR/mm/highmemmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/sp_SP/mm/highmemmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hHigh Memory Handlingh]hHigh Memory Handling}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh8/var/lib/git/docbuild/linux/Documentation/mm/highmem.rsthKubh paragraph)}(h+By: Peter Zijlstra h](hBy: Peter Zijlstra <}(hhhhhNhNubh reference)}(ha.p.zijlstra@chello.nlh]ha.p.zijlstra@chello.nl}(hhhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:a.p.zijlstra@chello.nluh1hhhubh>}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh]h)}(hhh]h)}(hhh]hWhat Is High Memory?}(hjhhhNhNubah}(h]id1ah ]h"]h$]h&]refidwhat-is-high-memoryuh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hTemporary Virtual Mappings}(hj%hhhNhNubah}(h]id2ah ]h"]h$]h&]refidtemporary-virtual-mappingsuh1hhj"ubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hCost of Temporary Mappings}(hjGhhhNhNubah}(h]id3ah ]h"]h$]h&]refidcost-of-temporary-mappingsuh1hhjDubah}(h]h ]h"]h$]h&]uh1hhjAubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hi386 PAE}(hjihhhNhNubah}(h]id4ah ]h"]h$]h&]refidi386-paeuh1hhjfubah}(h]h ]h"]h$]h&]uh1hhjcubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]h Functions}(hjhhhNhNubah}(h]id5ah ]h"]h$]h&]refid functionsuh1hhjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hWhat Is High Memory?h]hWhat Is High Memory?}(hjhhhNhNubah}(h]h ]h"]h$]h&]refidj uh1hhjhhhhhK ubh)}(hXgHigh memory (highmem) is used when the size of physical memory approaches or exceeds the maximum size of virtual memory. At that point it becomes impossible for the kernel to keep all of the available physical memory mapped at all times. This means the kernel needs to start using temporary mappings of the pieces of physical memory that it wants to access.h]hXgHigh memory (highmem) is used when the size of physical memory approaches or exceeds the maximum size of virtual memory. At that point it becomes impossible for the kernel to keep all of the available physical memory mapped at all times. This means the kernel needs to start using temporary mappings of the pieces of physical memory that it wants to access.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjhhubh)}(hThe part of (physical) memory not covered by a permanent mapping is what we refer to as 'highmem'. There are various architecture dependent constraints on where exactly that border lies.h]hThe part of (physical) memory not covered by a permanent mapping is what we refer to as ‘highmem’. There are various architecture dependent constraints on where exactly that border lies.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXIn the i386 arch, for example, we choose to map the kernel into every process's VM space so that we don't have to pay the full TLB invalidation costs for kernel entry/exit. This means the available virtual memory space (4GiB on i386) has to be divided between user and kernel space.h]hXIn the i386 arch, for example, we choose to map the kernel into every process’s VM space so that we don’t have to pay the full TLB invalidation costs for kernel entry/exit. This means the available virtual memory space (4GiB on i386) has to be divided between user and kernel space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hzThe traditional split for architectures using this approach is 3:1, 3GiB for userspace and the top 1GiB for kernel space::h]hyThe traditional split for architectures using this approach is 3:1, 3GiB for userspace and the top 1GiB for kernel space:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hm+--------+ 0xffffffff | Kernel | +--------+ 0xc0000000 | | | User | | | +--------+ 0x00000000h]hm+--------+ 0xffffffff | Kernel | +--------+ 0xc0000000 | | | User | | | +--------+ 0x00000000}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhKhjhhubh)}(hXThis means that the kernel can at most map 1GiB of physical memory at any one time, but because we need virtual address space for other things - including temporary maps to access the rest of the physical memory - the actual direct map will typically be less (usually around ~896MiB).h]hXThis means that the kernel can at most map 1GiB of physical memory at any one time, but because we need virtual address space for other things - including temporary maps to access the rest of the physical memory - the actual direct map will typically be less (usually around ~896MiB).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjhhubh)}(hOther architectures that have mm context tagged TLBs can have separate kernel and user maps. Some hardware (like some ARMs), however, have limited virtual space when they use mm context tags.h]hOther architectures that have mm context tagged TLBs can have separate kernel and user maps. Some hardware (like some ARMs), however, have limited virtual space when they use mm context tags.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjhhubeh}(h]jah ]h"]what is high memory?ah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hTemporary Virtual Mappingsh]hTemporary Virtual Mappings}(hj9hhhNhNubah}(h]h ]h"]h$]h&]jj.uh1hhj6hhhhhK1ubh)}(h}The kernel contains several ways of creating temporary mappings. The following list shows them in order of preference of use.h]h}The kernel contains several ways of creating temporary mappings. The following list shows them in order of preference of use.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hj6hhubh)}(hhh](h)}(hXk kmap_local_page(), kmap_local_folio() - These functions are used to create short term mappings. They can be invoked from any context (including interrupts) but the mappings can only be used in the context which acquired them. The only differences between them consist in the first taking a pointer to a struct page and the second taking a pointer to struct folio and the byte offset within the folio which identifies the page. These functions should always be used, whereas kmap_atomic() and kmap() have been deprecated. These mappings are thread-local and CPU-local, meaning that the mapping can only be accessed from within this thread and the thread is bound to the CPU while the mapping is active. Although preemption is never disabled by this function, the CPU can not be unplugged from the system via CPU-hotplug until the mapping is disposed. It's valid to take pagefaults in a local kmap region, unless the context in which the local mapping is acquired does not allow it for other reasons. As said, pagefaults and preemption are never disabled. There is no need to disable preemption because, when context switches to a different task, the maps of the outgoing task are saved and those of the incoming one are restored. kmap_local_page(), as well as kmap_local_folio() always returns valid virtual kernel addresses and it is assumed that kunmap_local() will never fail. On CONFIG_HIGHMEM=n kernels and for low memory pages they return the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. Therefore, users may call a plain page_address() for pages which are known to not come from ZONE_HIGHMEM. However, it is always safe to use kmap_local_{page,folio}() / kunmap_local(). While they are significantly faster than kmap(), for the highmem case they come with restrictions about the pointers validity. Contrary to kmap() mappings, the local mappings are only valid in the context of the caller and cannot be handed to other contexts. This implies that users must be absolutely sure to keep the use of the return address local to the thread which mapped it. Most code can be designed to use thread local mappings. User should therefore try to design their code to avoid the use of kmap() by mapping pages in the same thread the address will be used and prefer kmap_local_page() or kmap_local_folio(). Nesting kmap_local_page() and kmap_atomic() mappings is allowed to a certain extent (up to KMAP_TYPE_NR) but their invocations have to be strictly ordered because the map implementation is stack based. See kmap_local_page() kdocs (included in the "Functions" section) for details on how to manage nested mappings. h](h)}(hXkmap_local_page(), kmap_local_folio() - These functions are used to create short term mappings. They can be invoked from any context (including interrupts) but the mappings can only be used in the context which acquired them. The only differences between them consist in the first taking a pointer to a struct page and the second taking a pointer to struct folio and the byte offset within the folio which identifies the page.h]hXkmap_local_page(), kmap_local_folio() - These functions are used to create short term mappings. They can be invoked from any context (including interrupts) but the mappings can only be used in the context which acquired them. The only differences between them consist in the first taking a pointer to a struct page and the second taking a pointer to struct folio and the byte offset within the folio which identifies the page.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjXubh)}(h]These functions should always be used, whereas kmap_atomic() and kmap() have been deprecated.h]h]These functions should always be used, whereas kmap_atomic() and kmap() have been deprecated.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjXubh)}(hXHThese mappings are thread-local and CPU-local, meaning that the mapping can only be accessed from within this thread and the thread is bound to the CPU while the mapping is active. Although preemption is never disabled by this function, the CPU can not be unplugged from the system via CPU-hotplug until the mapping is disposed.h]hXHThese mappings are thread-local and CPU-local, meaning that the mapping can only be accessed from within this thread and the thread is bound to the CPU while the mapping is active. Although preemption is never disabled by this function, the CPU can not be unplugged from the system via CPU-hotplug until the mapping is disposed.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjXubh)}(hIt's valid to take pagefaults in a local kmap region, unless the context in which the local mapping is acquired does not allow it for other reasons.h]hIt’s valid to take pagefaults in a local kmap region, unless the context in which the local mapping is acquired does not allow it for other reasons.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjXubh)}(hAs said, pagefaults and preemption are never disabled. There is no need to disable preemption because, when context switches to a different task, the maps of the outgoing task are saved and those of the incoming one are restored.h]hAs said, pagefaults and preemption are never disabled. There is no need to disable preemption because, when context switches to a different task, the maps of the outgoing task are saved and those of the incoming one are restored.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjXubh)}(hkmap_local_page(), as well as kmap_local_folio() always returns valid virtual kernel addresses and it is assumed that kunmap_local() will never fail.h]hkmap_local_page(), as well as kmap_local_folio() always returns valid virtual kernel addresses and it is assumed that kunmap_local() will never fail.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhjXubh)}(hXSOn CONFIG_HIGHMEM=n kernels and for low memory pages they return the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. Therefore, users may call a plain page_address() for pages which are known to not come from ZONE_HIGHMEM. However, it is always safe to use kmap_local_{page,folio}() / kunmap_local().h]hXSOn CONFIG_HIGHMEM=n kernels and for low memory pages they return the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. Therefore, users may call a plain page_address() for pages which are known to not come from ZONE_HIGHMEM. However, it is always safe to use kmap_local_{page,folio}() / kunmap_local().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjXubh)}(hX}While they are significantly faster than kmap(), for the highmem case they come with restrictions about the pointers validity. Contrary to kmap() mappings, the local mappings are only valid in the context of the caller and cannot be handed to other contexts. This implies that users must be absolutely sure to keep the use of the return address local to the thread which mapped it.h]hX}While they are significantly faster than kmap(), for the highmem case they come with restrictions about the pointers validity. Contrary to kmap() mappings, the local mappings are only valid in the context of the caller and cannot be handed to other contexts. This implies that users must be absolutely sure to keep the use of the return address local to the thread which mapped it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjXubh)}(hMost code can be designed to use thread local mappings. User should therefore try to design their code to avoid the use of kmap() by mapping pages in the same thread the address will be used and prefer kmap_local_page() or kmap_local_folio().h]hMost code can be designed to use thread local mappings. User should therefore try to design their code to avoid the use of kmap() by mapping pages in the same thread the address will be used and prefer kmap_local_page() or kmap_local_folio().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjXubh)}(hX9Nesting kmap_local_page() and kmap_atomic() mappings is allowed to a certain extent (up to KMAP_TYPE_NR) but their invocations have to be strictly ordered because the map implementation is stack based. See kmap_local_page() kdocs (included in the "Functions" section) for details on how to manage nested mappings.h]hX=Nesting kmap_local_page() and kmap_atomic() mappings is allowed to a certain extent (up to KMAP_TYPE_NR) but their invocations have to be strictly ordered because the map implementation is stack based. See kmap_local_page() kdocs (included in the “Functions” section) for details on how to manage nested mappings.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjXubeh}(h]h ]h"]h$]h&]uh1hhjUhhhhhNubh)}(hXkmap_atomic(). This function has been deprecated; use kmap_local_page(). NOTE: Conversions to kmap_local_page() must take care to follow the mapping restrictions imposed on kmap_local_page(). Furthermore, the code between calls to kmap_atomic() and kunmap_atomic() may implicitly depend on the side effects of atomic mappings, i.e. disabling page faults or preemption, or both. In that case, explicit calls to pagefault_disable() or preempt_disable() or both must be made in conjunction with the use of kmap_local_page(). [Legacy documentation] This permits a very short duration mapping of a single page. Since the mapping is restricted to the CPU that issued it, it performs well, but the issuing task is therefore required to stay on that CPU until it has finished, lest some other task displace its mappings. kmap_atomic() may also be used by interrupt contexts, since it does not sleep and the callers too may not sleep until after kunmap_atomic() is called. Each call of kmap_atomic() in the kernel creates a non-preemptible section and disable pagefaults. This could be a source of unwanted latency. Therefore users should prefer kmap_local_page() instead of kmap_atomic(). It is assumed that k[un]map_atomic() won't fail. h](h)}(hHkmap_atomic(). This function has been deprecated; use kmap_local_page().h]hHkmap_atomic(). This function has been deprecated; use kmap_local_page().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjubh)}(hXNOTE: Conversions to kmap_local_page() must take care to follow the mapping restrictions imposed on kmap_local_page(). Furthermore, the code between calls to kmap_atomic() and kunmap_atomic() may implicitly depend on the side effects of atomic mappings, i.e. disabling page faults or preemption, or both. In that case, explicit calls to pagefault_disable() or preempt_disable() or both must be made in conjunction with the use of kmap_local_page().h]hXNOTE: Conversions to kmap_local_page() must take care to follow the mapping restrictions imposed on kmap_local_page(). Furthermore, the code between calls to kmap_atomic() and kunmap_atomic() may implicitly depend on the side effects of atomic mappings, i.e. disabling page faults or preemption, or both. In that case, explicit calls to pagefault_disable() or preempt_disable() or both must be made in conjunction with the use of kmap_local_page().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjubh)}(h[Legacy documentation]h]h[Legacy documentation]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjubh)}(hX This permits a very short duration mapping of a single page. Since the mapping is restricted to the CPU that issued it, it performs well, but the issuing task is therefore required to stay on that CPU until it has finished, lest some other task displace its mappings.h]hX This permits a very short duration mapping of a single page. Since the mapping is restricted to the CPU that issued it, it performs well, but the issuing task is therefore required to stay on that CPU until it has finished, lest some other task displace its mappings.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthjubh)}(hkmap_atomic() may also be used by interrupt contexts, since it does not sleep and the callers too may not sleep until after kunmap_atomic() is called.h]hkmap_atomic() may also be used by interrupt contexts, since it does not sleep and the callers too may not sleep until after kunmap_atomic() is called.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhjubh)}(hEach call of kmap_atomic() in the kernel creates a non-preemptible section and disable pagefaults. This could be a source of unwanted latency. Therefore users should prefer kmap_local_page() instead of kmap_atomic().h]hEach call of kmap_atomic() in the kernel creates a non-preemptible section and disable pagefaults. This could be a source of unwanted latency. Therefore users should prefer kmap_local_page() instead of kmap_atomic().}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjubh)}(h0It is assumed that k[un]map_atomic() won't fail.h]h2It is assumed that k[un]map_atomic() won’t fail.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1hhjUhhhhhNubh)}(hXPkmap(). This function has been deprecated; use kmap_local_page(). NOTE: Conversions to kmap_local_page() must take care to follow the mapping restrictions imposed on kmap_local_page(). In particular, it is necessary to make sure that the kernel virtual memory pointer is only valid in the thread that obtained it. [Legacy documentation] This should be used to make short duration mapping of a single page with no restrictions on preemption or migration. It comes with an overhead as mapping space is restricted and protected by a global lock for synchronization. When mapping is no longer needed, the address that the page was mapped to must be released with kunmap(). Mapping changes must be propagated across all the CPUs. kmap() also requires global TLB invalidation when the kmap's pool wraps and it might block when the mapping space is fully utilized until a slot becomes available. Therefore, kmap() is only callable from preemptible context. All the above work is necessary if a mapping must last for a relatively long time but the bulk of high-memory mappings in the kernel are short-lived and only used in one place. This means that the cost of kmap() is mostly wasted in such cases. kmap() was not intended for long term mappings but it has morphed in that direction and its use is strongly discouraged in newer code and the set of the preceding functions should be preferred. On 64-bit systems, calls to kmap_local_page(), kmap_atomic() and kmap() have no real work to do because a 64-bit address space is more than sufficient to address all the physical memory whose pages are permanently mapped. h](h)}(hAkmap(). This function has been deprecated; use kmap_local_page().h]hAkmap(). This function has been deprecated; use kmap_local_page().}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(hNOTE: Conversions to kmap_local_page() must take care to follow the mapping restrictions imposed on kmap_local_page(). In particular, it is necessary to make sure that the kernel virtual memory pointer is only valid in the thread that obtained it.h]hNOTE: Conversions to kmap_local_page() must take care to follow the mapping restrictions imposed on kmap_local_page(). In particular, it is necessary to make sure that the kernel virtual memory pointer is only valid in the thread that obtained it.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(h[Legacy documentation]h]h[Legacy documentation]}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(hXKThis should be used to make short duration mapping of a single page with no restrictions on preemption or migration. It comes with an overhead as mapping space is restricted and protected by a global lock for synchronization. When mapping is no longer needed, the address that the page was mapped to must be released with kunmap().h]hXKThis should be used to make short duration mapping of a single page with no restrictions on preemption or migration. It comes with an overhead as mapping space is restricted and protected by a global lock for synchronization. When mapping is no longer needed, the address that the page was mapped to must be released with kunmap().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(hXMapping changes must be propagated across all the CPUs. kmap() also requires global TLB invalidation when the kmap's pool wraps and it might block when the mapping space is fully utilized until a slot becomes available. Therefore, kmap() is only callable from preemptible context.h]hXMapping changes must be propagated across all the CPUs. kmap() also requires global TLB invalidation when the kmap’s pool wraps and it might block when the mapping space is fully utilized until a slot becomes available. Therefore, kmap() is only callable from preemptible context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(hXAll the above work is necessary if a mapping must last for a relatively long time but the bulk of high-memory mappings in the kernel are short-lived and only used in one place. This means that the cost of kmap() is mostly wasted in such cases. kmap() was not intended for long term mappings but it has morphed in that direction and its use is strongly discouraged in newer code and the set of the preceding functions should be preferred.h]hXAll the above work is necessary if a mapping must last for a relatively long time but the bulk of high-memory mappings in the kernel are short-lived and only used in one place. This means that the cost of kmap() is mostly wasted in such cases. kmap() was not intended for long term mappings but it has morphed in that direction and its use is strongly discouraged in newer code and the set of the preceding functions should be preferred.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubh)}(hOn 64-bit systems, calls to kmap_local_page(), kmap_atomic() and kmap() have no real work to do because a 64-bit address space is more than sufficient to address all the physical memory whose pages are permanently mapped.h]hOn 64-bit systems, calls to kmap_local_page(), kmap_atomic() and kmap() have no real work to do because a 64-bit address space is more than sufficient to address all the physical memory whose pages are permanently mapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubeh}(h]h ]h"]h$]h&]uh1hhjUhhhhhNubh)}(hvmap(). This can be used to make a long duration mapping of multiple physical pages into a contiguous virtual space. It needs global synchronization to unmap. h]h)}(hvmap(). This can be used to make a long duration mapping of multiple physical pages into a contiguous virtual space. It needs global synchronization to unmap.h]hvmap(). This can be used to make a long duration mapping of multiple physical pages into a contiguous virtual space. It needs global synchronization to unmap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjUhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1hhhhK6hj6hhubeh}(h]j4ah ]h"]temporary virtual mappingsah$]h&]uh1hhhhhhhhK1ubh)}(hhh](h)}(hCost of Temporary Mappingsh]hCost of Temporary Mappings}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjPuh1hhjhhhhhKubh)}(hThe cost of creating temporary mappings can be quite high. The arch has to manipulate the kernel's page tables, the data TLB and/or the MMU's registers.h]hThe cost of creating temporary mappings can be quite high. The arch has to manipulate the kernel’s page tables, the data TLB and/or the MMU’s registers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXIf CONFIG_HIGHMEM is not set, then the kernel will try and create a mapping simply with a bit of arithmetic that will convert the page struct address into a pointer to the page contents rather than juggling mappings about. In such a case, the unmap operation may be a null operation.h]hXIf CONFIG_HIGHMEM is not set, then the kernel will try and create a mapping simply with a bit of arithmetic that will convert the page struct address into a pointer to the page contents rather than juggling mappings about. In such a case, the unmap operation may be a null operation.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hIf CONFIG_MMU is not set, then there can be no temporary mappings and no highmem. In such a case, the arithmetic approach will also be used.h]hIf CONFIG_MMU is not set, then there can be no temporary mappings and no highmem. In such a case, the arithmetic approach will also be used.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]jVah ]h"]cost of temporary mappingsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hi386 PAEh]hi386 PAE}(hj2hhhNhNubah}(h]h ]h"]h$]h&]jjruh1hhj/hhhhhKubh)}(hThe i386 arch, under some circumstances, will permit you to stick up to 64GiB of RAM into your 32-bit machine. This has a number of consequences:h]hThe i386 arch, under some circumstances, will permit you to stick up to 64GiB of RAM into your 32-bit machine. This has a number of consequences:}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/hhubh)}(hhh](h)}(hLinux needs a page-frame structure for each page in the system and the pageframes need to live in the permanent mapping, which means: h]h)}(hLinux needs a page-frame structure for each page in the system and the pageframes need to live in the permanent mapping, which means:h]hLinux needs a page-frame structure for each page in the system and the pageframes need to live in the permanent mapping, which means:}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjQubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhNubh)}(hyou can have 896M/sizeof(struct page) page-frames at most; with struct page being 32-bytes that would end up being something in the order of 112G worth of pages; the kernel, however, needs to store more than just page-frames in that memory... h]h)}(hyou can have 896M/sizeof(struct page) page-frames at most; with struct page being 32-bytes that would end up being something in the order of 112G worth of pages; the kernel, however, needs to store more than just page-frames in that memory...h]hyou can have 896M/sizeof(struct page) page-frames at most; with struct page being 32-bytes that would end up being something in the order of 112G worth of pages; the kernel, however, needs to store more than just page-frames in that memory...}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjiubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhNubh)}(hPAE makes your page tables larger - which slows the system down as more data has to be accessed to traverse in TLB fills and the like. One advantage is that PAE has more PTE bits and can provide advanced features like NX and PAT. h]h)}(hPAE makes your page tables larger - which slows the system down as more data has to be accessed to traverse in TLB fills and the like. One advantage is that PAE has more PTE bits and can provide advanced features like NX and PAT.h]hPAE makes your page tables larger - which slows the system down as more data has to be accessed to traverse in TLB fills and the like. One advantage is that PAE has more PTE bits and can provide advanced features like NX and PAT.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjNhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1hhhhKhj/hhubh)}(hThe general recommendation is that you don't use more than 8GiB on a 32-bit machine - although more might work for you and your workload, you're pretty much on your own - don't expect kernel developers to really care much if things come apart.h]hThe general recommendation is that you don’t use more than 8GiB on a 32-bit machine - although more might work for you and your workload, you’re pretty much on your own - don’t expect kernel developers to really care much if things come apart.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/hhubeh}(h]jxah ]h"]i386 paeah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Functionsh]h Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhjhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlekmap (C function)c.kmaphNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(hvoid * kmap (struct page *page)h]hdesc_signature_line)}(hvoid *kmap(struct page *page)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubhdesc_sig_punctuation)}(hjh]h*}(hj hhhNhNubah}(h]h ]pah"]h$]h&]uh1j hjhhhjhKubh desc_name)}(hkmaph]h desc_sig_name)}(hkmaph]hkmap}(hj"hhhNhNubah}(h]h ]nah"]h$]h&]uh1j hjubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1jhjhhhjhKubhdesc_parameterlist)}(h(struct page *page)h]hdesc_parameter)}(hstruct page *pageh](hdesc_sig_keyword)}(hstructh]hstruct}(hjGhhhNhNubah}(h]h ]kah"]h$]h&]uh1jEhjAubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubh)}(hhh]j!)}(hpageh]hpage}(hjghhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjdubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjimodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}j~j$sbc.kmapasbuh1hhjAubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjAubj!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj;ubah}(h]h ]h"]h$]h&]jjuh1j9hjhhhjhKubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(hMap a page for long term usageh]hMap a page for long term usage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](j|functioneh"]h$]h&]domainj|objtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhNhNubh container)}(hX**Parameters** ``struct page *page`` Pointer to the page to be mapped **Return** The virtual address of the mapping **Description** Can only be invoked from preemptible task context because on 32bit systems with CONFIG_HIGHMEM enabled this function might sleep. For systems with CONFIG_HIGHMEM=n and for pages in the low memory area this returns the virtual address of the direct kernel mapping. The returned virtual address is globally visible and valid up to the point where it is unmapped via kunmap(). The pointer can be handed to other contexts. For highmem pages on 32bit systems this can be slow as the mapping space is limited and protected by a global lock. In case that there is no mapping slot available the function blocks until a slot is released via kunmap().h](h)}(h**Parameters**h]hstrong)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubhdefinition_list)}(hhh]hdefinition_list_item)}(h7``struct page *page`` Pointer to the page to be mapped h](hterm)}(h``struct page *page``h]hliteral)}(hj0h]hstruct page *page}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj.ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj(ubh definition)}(hhh]h)}(h Pointer to the page to be mappedh]h Pointer to the page to be mapped}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGhKhjJubah}(h]h ]h"]h$]h&]uh1jHhj(ubeh}(h]h ]h"]h$]h&]uh1j&hjGhKhj#ubah}(h]h ]h"]h$]h&]uh1j!hjubh)}(h **Return**h]j )}(hjoh]hReturn}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjmubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h"The virtual address of the mappingh]h"The virtual address of the mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hCan only be invoked from preemptible task context because on 32bit systems with CONFIG_HIGHMEM enabled this function might sleep.h]hCan only be invoked from preemptible task context because on 32bit systems with CONFIG_HIGHMEM enabled this function might sleep.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hFor systems with CONFIG_HIGHMEM=n and for pages in the low memory area this returns the virtual address of the direct kernel mapping.h]hFor systems with CONFIG_HIGHMEM=n and for pages in the low memory area this returns the virtual address of the direct kernel mapping.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hThe returned virtual address is globally visible and valid up to the point where it is unmapped via kunmap(). The pointer can be handed to other contexts.h]hThe returned virtual address is globally visible and valid up to the point where it is unmapped via kunmap(). The pointer can be handed to other contexts.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hFor highmem pages on 32bit systems this can be slow as the mapping space is limited and protected by a global lock. In case that there is no mapping slot available the function blocks until a slot is released via kunmap().h]hFor highmem pages on 32bit systems this can be slow as the mapping space is limited and protected by a global lock. In case that there is no mapping slot available the function blocks until a slot is released via kunmap().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap (C function)c.kunmaphNtauh1jhjhhhNhNubj)}(hhh](j)}(h%void kunmap (const struct page *page)h]j)}(h$void kunmap(const struct page *page)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK(ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK(ubj)}(hkunmaph]j!)}(hkunmaph]hkunmap}(hj)hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj%ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjhhhjhK(ubj:)}(h(const struct page *page)h]j@)}(hconst struct page *pageh](jF)}(hconsth]hconst}(hjEhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjAubj)}(h h]h }(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjF)}(hjIh]hstruct}(hjahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjAubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubh)}(hhh]j!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj|ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~j+sbc.kunmapasbuh1hhjAubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjAubj!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj=ubah}(h]h ]h"]h$]h&]jjuh1j9hjhhhjhK(ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK(ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK(hjhhubj)}(hhh]h)}(h*Unmap the virtual address mapped by kmap()h]h*Unmap the virtual address mapped by kmap()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK(hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK(ubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` Pointer to the page which was mapped by kmap() **Description** Counterpart to kmap(). A NOOP for CONFIG_HIGHMEM=n and for mappings of pages in the low memory area.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK,hjubj")}(hhh]j')}(hK``const struct page *page`` Pointer to the page which was mapped by kmap() h](j-)}(h``const struct page *page``h]j3)}(hj%h]hconst struct page *page}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj#ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK)hjubjI)}(hhh]h)}(h.Pointer to the page which was mapped by kmap()h]h.Pointer to the page which was mapped by kmap()}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hK)hj;ubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hj:hK)hjubah}(h]h ]h"]h$]h&]uh1j!hjubh)}(h**Description**h]j )}(hj`h]h Description}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj^ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK+hjubh)}(hdCounterpart to kmap(). A NOOP for CONFIG_HIGHMEM=n and for mappings of pages in the low memory area.h]hdCounterpart to kmap(). A NOOP for CONFIG_HIGHMEM=n and for mappings of pages in the low memory area.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK*hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_to_page (C function)c.kmap_to_pagehNtauh1jhjhhhNhNubj)}(hhh](j)}(h'struct page * kmap_to_page (void *addr)h]j)}(h%struct page *kmap_to_page(void *addr)h](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK1ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK1ubh)}(hhh]j!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~ kmap_to_pagesbc.kmap_to_pageasbuh1hhjhhhjhK1ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK1ubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhK1ubj)}(h kmap_to_pageh]j!)}(hjh]h kmap_to_page}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjhhhjhK1ubj:)}(h (void *addr)h]j@)}(h void *addrh](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj- hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hjh]h*}(hj; hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj!)}(haddrh]haddr}(hjH hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj ubah}(h]h ]h"]h$]h&]jjuh1j9hjhhhjhK1ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK1ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK1hjhhubj)}(hhh]h)}(h"Get the page for a kmap'ed addressh]h$Get the page for a kmap’ed address}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK1hjo hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK1ubeh}(h]h ](j|functioneh"]h$]h&]jj|jj jj jjjuh1jhhhjhNhNubj)}(hj**Parameters** ``void *addr`` The address to look up **Return** The page which is mapped to **addr**.h](h)}(h**Parameters**h]j )}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK5hj ubj")}(hhh]j')}(h&``void *addr`` The address to look up h](j-)}(h``void *addr``h]j3)}(hj h]h void *addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK2hj ubjI)}(hhh]h)}(hThe address to look uph]hThe address to look up}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK2hj ubah}(h]h ]h"]h$]h&]uh1jHhj ubeh}(h]h ]h"]h$]h&]uh1j&hj hK2hj ubah}(h]h ]h"]h$]h&]uh1j!hj ubh)}(h **Return**h]j )}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK4hj ubh)}(h%The page which is mapped to **addr**.h](hThe page which is mapped to }(hj hhhNhNubj )}(h**addr**h]haddr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK4hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_flush_unused (C function)c.kmap_flush_unusedhNtauh1jhjhhhNhNubj)}(hhh](j)}(hvoid kmap_flush_unused (void)h]j)}(hvoid kmap_flush_unused(void)h](j)}(hvoidh]hvoid}(hjE hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK9ubj)}(h h]h }(hjT hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA hhhjS hK9ubj)}(hkmap_flush_unusedh]j!)}(hkmap_flush_unusedh]hkmap_flush_unused}(hjf hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjb ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjA hhhjS hK9ubj:)}(h(void)h]j@)}(hvoidh]j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ ubah}(h]h ]h"]h$]h&]noemphjjuh1j?hjz ubah}(h]h ]h"]h$]h&]jjuh1j9hjA hhhjS hK9ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj= hhhjS hK9ubah}(h]j8 ah ](jjeh"]h$]h&]jj)jhuh1jhjS hK9hj: hhubj)}(hhh]h)}(h@Flush all unused kmap mappings in order to remove stray mappingsh]h@Flush all unused kmap mappings in order to remove stray mappings}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK9hj hhubah}(h]h ]h"]h$]h&]uh1jhj: hhhjS hK9ubeh}(h]h ](j|functioneh"]h$]h&]jj|jj jj jjjuh1jhhhjhNhNubj)}(h'**Parameters** ``void`` no argumentsh](h)}(h**Parameters**h]j )}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK=hj ubj")}(hhh]j')}(h``void`` no argumentsh](j-)}(h``void``h]j3)}(hj h]hvoid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK?hj ubjI)}(hhh]h)}(h no argumentsh]h no arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj ubah}(h]h ]h"]h$]h&]uh1jHhj ubeh}(h]h ]h"]h$]h&]uh1j&hj hK?hj ubah}(h]h ]h"]h$]h&]uh1j!hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_local_page (C function)c.kmap_local_pagehNtauh1jhjhhhNhNubj)}(hhh](j)}(h0void * kmap_local_page (const struct page *page)h]j)}(h.void *kmap_local_page(const struct page *page)h](j)}(hvoidh]hvoid}(hjG hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK?ubj)}(h h]h }(hjV hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC hhhjU hK?ubj )}(hjh]h*}(hjd hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjC hhhjU hK?ubj)}(hkmap_local_pageh]j!)}(hkmap_local_pageh]hkmap_local_page}(hju hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjq ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjC hhhjU hK?ubj:)}(h(const struct page *page)h]j@)}(hconst struct page *pageh](jF)}(hjGh]hconst}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF)}(hjIh]hstruct}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j!)}(hpageh]hpage}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj modnameN classnameNjj)}j]j)}j~jw sbc.kmap_local_pageasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj!)}(hpageh]hpage}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj ubah}(h]h ]h"]h$]h&]jjuh1j9hjC hhhjU hK?ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj? hhhjU hK?ubah}(h]j: ah ](jjeh"]h$]h&]jj)jhuh1jhjU hK?hj< hhubj)}(hhh]h)}(hMap a page for temporary usageh]hMap a page for temporary usage}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK?hj, hhubah}(h]h ]h"]h$]h&]uh1jhj< hhhjU hK?ubeh}(h]h ](j|functioneh"]h$]h&]jj|jjG jjG jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct page *page`` Pointer to the page to be mapped **Return** The virtual address of the mapping **Description** Can be invoked from any context, including interrupts. Requires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation: addr1 = kmap_local_page(page1); addr2 = kmap_local_page(page2); ... kunmap_local(addr2); kunmap_local(addr1); Unmapping addr1 before addr2 is invalid and causes malfunction. Contrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts. On CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. While kmap_local_page() is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity. On HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_page() can rely on this side effect.h](h)}(h**Parameters**h]j )}(hjQ h]h Parameters}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjO ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKChjK ubj")}(hhh]j')}(h=``const struct page *page`` Pointer to the page to be mapped h](j-)}(h``const struct page *page``h]j3)}(hjp h]hconst struct page *page}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjn ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK@hjj ubjI)}(hhh]h)}(h Pointer to the page to be mappedh]h Pointer to the page to be mapped}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK@hj ubah}(h]h ]h"]h$]h&]uh1jHhjj ubeh}(h]h ]h"]h$]h&]uh1j&hj hK@hjg ubah}(h]h ]h"]h$]h&]uh1j!hjK ubh)}(h **Return**h]j )}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKBhjK ubh)}(h"The virtual address of the mappingh]h"The virtual address of the mapping}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKBhjK ubh)}(h**Description**h]j )}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKDhjK ubh)}(h6Can be invoked from any context, including interrupts.h]h6Can be invoked from any context, including interrupts.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKChjK ubh)}(hRequires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation:h]hRequires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKEhjK ubh)}(hmaddr1 = kmap_local_page(page1); addr2 = kmap_local_page(page2); ... kunmap_local(addr2); kunmap_local(addr1);h]hmaddr1 = kmap_local_page(page1); addr2 = kmap_local_page(page2); ... kunmap_local(addr2); kunmap_local(addr1);}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKIhjK ubh)}(h?Unmapping addr1 before addr2 is invalid and causes malfunction.h]h?Unmapping addr1 before addr2 is invalid and causes malfunction.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKOhjK ubh)}(hzContrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts.h]hzContrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts.}(hj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKQhjK ubh)}(hOn CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped.h]hOn CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped.}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKThjK ubh)}(hWhile kmap_local_page() is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity.h]hWhile kmap_local_page() is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity.}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKXhjK ubh)}(hOn HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_page() can rely on this side effect.h]hOn HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_page() can rely on this side effect.}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK[hjK ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_local_folio (C function)c.kmap_local_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hBvoid * kmap_local_folio (const struct folio *folio, size_t offset)h]j)}(h@void *kmap_local_folio(const struct folio *folio, size_t offset)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj| hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKcubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj| hhhj hKcubj )}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj| hhhj hKcubj)}(hkmap_local_folioh]j!)}(hkmap_local_folioh]hkmap_local_folio}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj| hhhj hKcubj:)}(h*(const struct folio *folio, size_t offset)h](j@)}(hconst struct folio *folioh](jF)}(hjGh]hconst}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF)}(hjIh]hstruct}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j!)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~j sbc.kmap_local_folioasbuh1hhj ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj!)}(hfolioh]hfolio}(hj>hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj ubj@)}(h size_t offseth](h)}(hhh]j!)}(hsize_th]hsize_t}(hjZhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjWubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj\modnameN classnameNjj)}j]jc.kmap_local_folioasbuh1hhjSubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubj!)}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj ube h}(h]h ]h"]h$]h&]jjuh1j9hj| hhhj hKcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjx hhhj hKcubah}(h]js ah ](jjeh"]h$]h&]jj)jhuh1jhj hKchju hhubj)}(hhh]h)}(h,Map a page in this folio for temporary usageh]h,Map a page in this folio for temporary usage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKchjhhubah}(h]h ]h"]h$]h&]uh1jhju hhhj hKcubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio containing the page. ``size_t offset`` The byte offset within the folio which identifies the page. **Description** Requires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation:: addr1 = kmap_local_folio(folio1, offset1); addr2 = kmap_local_folio(folio2, offset2); ... kunmap_local(addr2); kunmap_local(addr1); Unmapping addr1 before addr2 is invalid and causes malfunction. Contrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts. On CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. While it is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity. On HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_folio() can rely on this side effect. **Context** Can be invoked from any context. **Return** The virtual address of **offset**.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjubj")}(hhh](j')}(h=``const struct folio *folio`` The folio containing the page. h](j-)}(h``const struct folio *folio``h]j3)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKdhjubjI)}(hhh]h)}(hThe folio containing the page.h]hThe folio containing the page.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKdhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhKdhjubj')}(hN``size_t offset`` The byte offset within the folio which identifies the page. h](j-)}(h``size_t offset``h]j3)}(hj*h]h size_t offset}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj(ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKehj$ubjI)}(hhh]h)}(h;The byte offset within the folio which identifies the page.h]h;The byte offset within the folio which identifies the page.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hKehj@ubah}(h]h ]h"]h$]h&]uh1jHhj$ubeh}(h]h ]h"]h$]h&]uh1j&hj?hKehjubeh}(h]h ]h"]h$]h&]uh1j!hjubh)}(h**Description**h]j )}(hjeh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j hjcubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjubh)}(hRequires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation::h]hRequires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation:}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKfhjubj)}(haddr1 = kmap_local_folio(folio1, offset1); addr2 = kmap_local_folio(folio2, offset2); ... kunmap_local(addr2); kunmap_local(addr1);h]haddr1 = kmap_local_folio(folio1, offset1); addr2 = kmap_local_folio(folio2, offset2); ... kunmap_local(addr2); kunmap_local(addr1);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKjhjubh)}(h?Unmapping addr1 before addr2 is invalid and causes malfunction.h]h?Unmapping addr1 before addr2 is invalid and causes malfunction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKphjubh)}(hzContrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts.h]hzContrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKrhjubh)}(hOn CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped.h]hOn CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKuhjubh)}(hxWhile it is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity.h]hxWhile it is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKyhjubh)}(hOn HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_folio() can rely on this side effect.h]hOn HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_folio() can rely on this side effect.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK|hjubh)}(h **Context**h]j )}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h Can be invoked from any context.h]h Can be invoked from any context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h **Return**h]j )}(hj h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h"The virtual address of **offset**.h](hThe virtual address of }(hj#hhhNhNubj )}(h **offset**h]hoffset}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_atomic (C function) c.kmap_atomichNtauh1jhjhhhNhNubj)}(hhh](j)}(h,void * kmap_atomic (const struct page *page)h]j)}(h*void *kmap_atomic(const struct page *page)h](j)}(hvoidh]hvoid}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhjrhKubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj`hhhjrhKubj)}(h kmap_atomich]j!)}(h kmap_atomich]h kmap_atomic}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj`hhhjrhKubj:)}(h(const struct page *page)h]j@)}(hconst struct page *pageh](jF)}(hjGh]hconst}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~jsb c.kmap_atomicasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(hpageh]hpage}(hj"hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubah}(h]h ]h"]h$]h&]jjuh1j9hj`hhhjrhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj\hhhjrhKubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1jhjrhKhjYhhubj)}(hhh]h)}(h7Atomically map a page for temporary usage - Deprecated!h]h7Atomically map a page for temporary usage - Deprecated!}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjIhhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjrhKubeh}(h]h ](j|functioneh"]h$]h&]jj|jjdjjdjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct page *page`` Pointer to the page to be mapped **Return** The virtual address of the mapping **Description** In fact a wrapper around kmap_local_page() which also disables pagefaults and, depending on PREEMPT_RT configuration, also CPU migration and preemption. Therefore users should not count on the latter two side effects. Mappings should always be released by kunmap_atomic(). Do not use in new code. Use kmap_local_page() instead. It is used in atomic context when code wants to access the contents of a page that might be allocated from high memory (see __GFP_HIGHMEM), for example a page in the pagecache. The API has two functions, and they can be used in a manner similar to the following:: // Find the page of interest. struct page *page = find_get_page(mapping, offset); // Gain access to the contents of that page. void *vaddr = kmap_atomic(page); // Do something to the contents of that page. memset(vaddr, 0, PAGE_SIZE); // Unmap that page. kunmap_atomic(vaddr); Note that the kunmap_atomic() call takes the result of the kmap_atomic() call, not the argument. If you need to map two pages because you want to copy from one page to another you need to keep the kmap_atomic calls strictly nested, like: vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2); memcpy(vaddr1, vaddr2, PAGE_SIZE); kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);h](h)}(h**Parameters**h]j )}(hjnh]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubj")}(hhh]j')}(h=``const struct page *page`` Pointer to the page to be mapped h](j-)}(h``const struct page *page``h]j3)}(hjh]hconst struct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubjI)}(hhh]h)}(h Pointer to the page to be mappedh]h Pointer to the page to be mapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhKhjubah}(h]h ]h"]h$]h&]uh1j!hjhubh)}(h **Return**h]j )}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h"The virtual address of the mappingh]h"The virtual address of the mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(hIn fact a wrapper around kmap_local_page() which also disables pagefaults and, depending on PREEMPT_RT configuration, also CPU migration and preemption. Therefore users should not count on the latter two side effects.h]hIn fact a wrapper around kmap_local_page() which also disables pagefaults and, depending on PREEMPT_RT configuration, also CPU migration and preemption. Therefore users should not count on the latter two side effects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h6Mappings should always be released by kunmap_atomic().h]h6Mappings should always be released by kunmap_atomic().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h6Do not use in new code. Use kmap_local_page() instead.h]h6Do not use in new code. Use kmap_local_page() instead.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(hXIt is used in atomic context when code wants to access the contents of a page that might be allocated from high memory (see __GFP_HIGHMEM), for example a page in the pagecache. The API has two functions, and they can be used in a manner similar to the following::h]hXIt is used in atomic context when code wants to access the contents of a page that might be allocated from high memory (see __GFP_HIGHMEM), for example a page in the pagecache. The API has two functions, and they can be used in a manner similar to the following:}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubj)}(hX// Find the page of interest. struct page *page = find_get_page(mapping, offset); // Gain access to the contents of that page. void *vaddr = kmap_atomic(page); // Do something to the contents of that page. memset(vaddr, 0, PAGE_SIZE); // Unmap that page. kunmap_atomic(vaddr);h]hX// Find the page of interest. struct page *page = find_get_page(mapping, offset); // Gain access to the contents of that page. void *vaddr = kmap_atomic(page); // Do something to the contents of that page. memset(vaddr, 0, PAGE_SIZE); // Unmap that page. kunmap_atomic(vaddr);}hjAsbah}(h]h ]h"]h$]h&]jjuh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h`Note that the kunmap_atomic() call takes the result of the kmap_atomic() call, not the argument.h]h`Note that the kunmap_atomic() call takes the result of the kmap_atomic() call, not the argument.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(hIf you need to map two pages because you want to copy from one page to another you need to keep the kmap_atomic calls strictly nested, like:h]hIf you need to map two pages because you want to copy from one page to another you need to keep the kmap_atomic calls strictly nested, like:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h9vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2);h]h9vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2);}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h"memcpy(vaddr1, vaddr2, PAGE_SIZE);h]h"memcpy(vaddr1, vaddr2, PAGE_SIZE);}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubh)}(h-kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);h]h-kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jclear_user_page (C function)c.clear_user_pagehNtauh1jhjhhhNhNubj)}(hhh](j)}(hIvoid clear_user_page (void *addr, unsigned long vaddr, struct page *page)h]j)}(hHvoid clear_user_page(void *addr, unsigned long vaddr, struct page *page)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hclear_user_pageh]j!)}(hclear_user_pageh]hclear_user_page}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjhhhjhKubj:)}(h4(void *addr, unsigned long vaddr, struct page *page)h](j@)}(h void *addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(haddrh]haddr}(hj!hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hlongh]hlong}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj!)}(hvaddrh]hvaddr}(hjrhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hstruct page *pageh](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~jsbc.clear_user_pageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubeh}(h]h ]h"]h$]h&]jjuh1j9hjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h'clear a page to be mapped to user spaceh]h'clear a page to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](j|functioneh"]h$]h&]jj|jj&jj&jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void *addr`` the address of the page ``unsigned long vaddr`` the address of the user mapping ``struct page *page`` the page **Description** We condition the definition of clear_user_page() on the architecture not having a custom clear_user_highpage(). That's because if there is some special flushing needed for clear_user_highpage() then it is likely that clear_user_page() also needs some magic. And, since our only caller is the generic clear_user_highpage(), not defining is not much of a loss.h](h)}(h**Parameters**h]j )}(hj0h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj*ubj")}(hhh](j')}(h'``void *addr`` the address of the page h](j-)}(h``void *addr``h]j3)}(hjOh]h void *addr}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjMubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjIubjI)}(hhh]h)}(hthe address of the pageh]hthe address of the page}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhKhjeubah}(h]h ]h"]h$]h&]uh1jHhjIubeh}(h]h ]h"]h$]h&]uh1j&hjdhKhjFubj')}(h8``unsigned long vaddr`` the address of the user mapping h](j-)}(h``unsigned long vaddr``h]j3)}(hjh]hunsigned long vaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubjI)}(hhh]h)}(hthe address of the user mappingh]hthe address of the user mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhKhjFubj')}(h``struct page *page`` the page h](j-)}(h``struct page *page``h]j3)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubjI)}(hhh]h)}(hthe pageh]hthe page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhKhjFubeh}(h]h ]h"]h$]h&]uh1j!hj*ubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj*ubh)}(hXfWe condition the definition of clear_user_page() on the architecture not having a custom clear_user_highpage(). That's because if there is some special flushing needed for clear_user_highpage() then it is likely that clear_user_page() also needs some magic. And, since our only caller is the generic clear_user_highpage(), not defining is not much of a loss.h]hXhWe condition the definition of clear_user_page() on the architecture not having a custom clear_user_highpage(). That’s because if there is some special flushing needed for clear_user_highpage() then it is likely that clear_user_page() also needs some magic. And, since our only caller is the generic clear_user_highpage(), not defining is not much of a loss.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jclear_user_pages (C function)c.clear_user_pageshNtauh1jhjhhhNhNubj)}(hhh](j)}(h_void clear_user_pages (void *addr, unsigned long vaddr, struct page *page, unsigned int npages)h]j)}(h^void clear_user_pages(void *addr, unsigned long vaddr, struct page *page, unsigned int npages)h](j)}(hvoidh]hvoid}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhjOhKubj)}(hclear_user_pagesh]j!)}(hclear_user_pagesh]hclear_user_pages}(hjbhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj^ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj=hhhjOhKubj:)}(hI(void *addr, unsigned long vaddr, struct page *page, unsigned int npages)h](j@)}(h void *addrh](j)}(hvoidh]hvoid}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjzubj!)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjzubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjvubj@)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj!)}(hvaddrh]hvaddr}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjvubj@)}(hstruct page *pageh](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j!)}(hpageh]hpage}(hj/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj1modnameN classnameNjj)}j]j)}j~jdsbc.clear_user_pagesasbuh1hhj ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj!)}(hpageh]hpage}(hjjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjvubj@)}(hunsigned int npagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj!)}(hnpagesh]hnpages}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjvubeh}(h]h ]h"]h$]h&]jjuh1j9hj=hhhjOhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj9hhhjOhKubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhjOhKhj6hhubj)}(hhh]h)}(h-clear a page range to be mapped to user spaceh]h-clear a page range to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhj6hhhjOhKubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void *addr`` start address ``unsigned long vaddr`` start address of the user mapping ``struct page *page`` start page ``unsigned int npages`` number of pages **Description** Assumes that the region (**addr**, +**npages**) has been validated already so this does no exception handling. If the architecture provides a clear_user_page(), use that; otherwise, we can safely use clear_pages().h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj")}(hhh](j')}(h``void *addr`` start address h](j-)}(h``void *addr``h]j3)}(hj&h]h void *addr}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj$ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj ubjI)}(hhh]h)}(h start addressh]h start address}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hKhj<ubah}(h]h ]h"]h$]h&]uh1jHhj ubeh}(h]h ]h"]h$]h&]uh1j&hj;hKhjubj')}(h:``unsigned long vaddr`` start address of the user mapping h](j-)}(h``unsigned long vaddr``h]j3)}(hj_h]hunsigned long vaddr}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj]ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjYubjI)}(hhh]h)}(h!start address of the user mappingh]h!start address of the user mapping}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthKhjuubah}(h]h ]h"]h$]h&]uh1jHhjYubeh}(h]h ]h"]h$]h&]uh1j&hjthKhjubj')}(h!``struct page *page`` start page h](j-)}(h``struct page *page``h]j3)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubjI)}(hhh]h)}(h start pageh]h start page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhKhjubj')}(h(``unsigned int npages`` number of pages h](j-)}(h``unsigned int npages``h]j3)}(hjh]hunsigned int npages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubjI)}(hhh]h)}(hnumber of pagesh]hnumber of pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhKhjubeh}(h]h ]h"]h$]h&]uh1j!hjubh)}(h**Description**h]j )}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hnAssumes that the region (**addr**, +**npages**) has been validated already so this does no exception handling.h](hAssumes that the region (}(hj"hhhNhNubj )}(h**addr**h]haddr}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubhM, +**npages**) has been validated already so this does no exception handling.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hgIf the architecture provides a clear_user_page(), use that; otherwise, we can safely use clear_pages().h]hgIf the architecture provides a clear_user_page(), use that; otherwise, we can safely use clear_pages().}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j clear_user_highpage (C function)c.clear_user_highpagehNtauh1jhjhhhNhNubj)}(hhh](j)}(hAvoid clear_user_highpage (struct page *page, unsigned long vaddr)h]j)}(h@void clear_user_highpage(struct page *page, unsigned long vaddr)h](j)}(hvoidh]hvoid}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnhhhjhKubj)}(hclear_user_highpageh]j!)}(hclear_user_highpageh]hclear_user_highpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjnhhhjhKubj:)}(h((struct page *page, unsigned long vaddr)h](j@)}(hstruct page *pageh](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~jsbc.clear_user_highpageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj!)}(hvaddrh]hvaddr}(hjYhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubeh}(h]h ]h"]h$]h&]jjuh1j9hjnhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjjhhhjhKubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjghhubj)}(hhh]h)}(h'clear a page to be mapped to user spaceh]h'clear a page to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjhKubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct page *page`` start page ``unsigned long vaddr`` start address of the user mapping **Description** With !CONFIG_HIGHMEM this (and the copy_user_highpage() below) will be plain clear_user_page() (and copy_user_page()).h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj")}(hhh](j')}(h!``struct page *page`` start page h](j-)}(h``struct page *page``h]j3)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubjI)}(hhh]h)}(h start pageh]h start page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhMhjubj')}(h:``unsigned long vaddr`` start address of the user mapping h](j-)}(h``unsigned long vaddr``h]j3)}(hjh]hunsigned long vaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubjI)}(hhh]h)}(h!start address of the user mappingh]h!start address of the user mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhMhjubeh}(h]h ]h"]h$]h&]uh1j!hjubh)}(h**Description**h]j )}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubh)}(hvWith !CONFIG_HIGHMEM this (and the copy_user_highpage() below) will be plain clear_user_page() (and copy_user_page()).h]hvWith !CONFIG_HIGHMEM this (and the copy_user_highpage() below) will be plain clear_user_page() (and copy_user_page()).}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!clear_user_highpages (C function)c.clear_user_highpageshNtauh1jhjhhhNhNubj)}(hhh](j)}(hWvoid clear_user_highpages (struct page *page, unsigned long vaddr, unsigned int npages)h]j)}(hVvoid clear_user_highpages(struct page *page, unsigned long vaddr, unsigned int npages)h](j)}(hvoidh]hvoid}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMubj)}(hclear_user_highpagesh]j!)}(hclear_user_highpagesh]hclear_user_highpages}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjyhhhjhMubj:)}(h=(struct page *page, unsigned long vaddr, unsigned int npages)h](j@)}(hstruct page *pageh](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j)}j~jsbc.clear_user_highpagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hlongh]hlong}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj!)}(hvaddrh]hvaddr}(hjdhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hunsigned int npagesh](j)}(hunsignedh]hunsigned}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj!)}(hnpagesh]hnpages}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjyubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubeh}(h]h ]h"]h$]h&]jjuh1j9hjyhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhMubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjrhhubj)}(hhh]h)}(h-clear a page range to be mapped to user spaceh]h-clear a page range to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct page *page`` start page ``unsigned long vaddr`` start address of the user mapping ``unsigned int npages`` number of pages **Description** Assumes that all the pages in the region (**page**, +**npages**) are valid so this does no exception handling.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj")}(hhh](j')}(h!``struct page *page`` start page h](j-)}(h``struct page *page``h]j3)}(hj h]hstruct page *page}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubjI)}(hhh]h)}(h start pageh]h start page}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj6ubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hj5hMhjubj')}(h:``unsigned long vaddr`` start address of the user mapping h](j-)}(h``unsigned long vaddr``h]j3)}(hjYh]hunsigned long vaddr}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjWubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjSubjI)}(hhh]h)}(h!start address of the user mappingh]h!start address of the user mapping}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMhjoubah}(h]h ]h"]h$]h&]uh1jHhjSubeh}(h]h ]h"]h$]h&]uh1j&hjnhMhjubj')}(h(``unsigned int npages`` number of pages h](j-)}(h``unsigned int npages``h]j3)}(hjh]hunsigned int npages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubjI)}(hhh]h)}(hnumber of pagesh]hnumber of pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhMhjubeh}(h]h ]h"]h$]h&]uh1j!hjubh)}(h**Description**h]j )}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubh)}(hnAssumes that all the pages in the region (**page**, +**npages**) are valid so this does no exception handling.h](h*Assumes that all the pages in the region (}(hjhhhNhNubj )}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh<, +**npages**) are valid so this does no exception handling.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+vma_alloc_zeroed_movable_folio (C function) c.vma_alloc_zeroed_movable_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(h_struct folio * vma_alloc_zeroed_movable_folio (struct vm_area_struct *vma, unsigned long vaddr)h]j)}(h]struct folio *vma_alloc_zeroed_movable_folio(struct vm_area_struct *vma, unsigned long vaddr)h](jF)}(hjIh]hstruct}(hj$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM4ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj1hM4ubh)}(hhh]j!)}(hfolioh]hfolio}(hjChhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj@ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjEmodnameN classnameNjj)}j]j)}j~vma_alloc_zeroed_movable_foliosb c.vma_alloc_zeroed_movable_folioasbuh1hhj hhhj1hM4ubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj1hM4ubj )}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj hhhj1hM4ubj)}(hvma_alloc_zeroed_movable_folioh]j!)}(hjah]hvma_alloc_zeroed_movable_folio}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj hhhj1hM4ubj:)}(h1(struct vm_area_struct *vma, unsigned long vaddr)h](j@)}(hstruct vm_area_struct *vmah](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j!)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjmodnameN classnameNjj)}j]j_ c.vma_alloc_zeroed_movable_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj!)}(hvaddrh]hvaddr}(hjFhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubeh}(h]h ]h"]h$]h&]jjuh1j9hj hhhj1hM4ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj1hM4ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj1hM4hjhhubj)}(hhh]h)}(h!Allocate a zeroed page for a VMA.h]h!Allocate a zeroed page for a VMA.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM4hjmhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj1hM4ubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` The VMA the page is to be allocated for. ``unsigned long vaddr`` The virtual address the page will be inserted into. **Description** This function will allocate a page suitable for inserting into this VMA at this virtual address. It may be allocated from highmem or the movable zone. An architecture may provide its own implementation. **Return** A folio containing one allocated and zeroed page or NULL if we are out of memory.h](h)}(h**Parameters**h]j )}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM8hjubj")}(hhh](j')}(hH``struct vm_area_struct *vma`` The VMA the page is to be allocated for. h](j-)}(h``struct vm_area_struct *vma``h]j3)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM5hjubjI)}(hhh]h)}(h(The VMA the page is to be allocated for.h]h(The VMA the page is to be allocated for.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM5hjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhM5hjubj')}(hL``unsigned long vaddr`` The virtual address the page will be inserted into. h](j-)}(h``unsigned long vaddr``h]j3)}(hjh]hunsigned long vaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM6hjubjI)}(hhh]h)}(h3The virtual address the page will be inserted into.h]h3The virtual address the page will be inserted into.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM6hjubah}(h]h ]h"]h$]h&]uh1jHhjubeh}(h]h ]h"]h$]h&]uh1j&hjhM6hjubeh}(h]h ]h"]h$]h&]uh1j!hjubh)}(h**Description**h]j )}(hj%h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj#ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM8hjubh)}(hThis function will allocate a page suitable for inserting into this VMA at this virtual address. It may be allocated from highmem or the movable zone. An architecture may provide its own implementation.h]hThis function will allocate a page suitable for inserting into this VMA at this virtual address. It may be allocated from highmem or the movable zone. An architecture may provide its own implementation.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM7hjubh)}(h **Return**h]j )}(hjLh]hReturn}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjJubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM;hjubh)}(hQA folio containing one allocated and zeroed page or NULL if we are out of memory.h]hQA folio containing one allocated and zeroed page or NULL if we are out of memory.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM<hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jmemcpy_from_folio (C function)c.memcpy_from_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hQvoid memcpy_from_folio (char *to, struct folio *folio, size_t offset, size_t len)h]j)}(hPvoid memcpy_from_folio(char *to, struct folio *folio, size_t offset, size_t len)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM9ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM9ubj)}(hmemcpy_from_folioh]j!)}(hmemcpy_from_folioh]hmemcpy_from_folio}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjhhhjhM9ubj:)}(h:(char *to, struct folio *folio, size_t offset, size_t len)h](j@)}(hchar *toh](j)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubj!)}(htoh]hto}(hjhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j!)}(hfolioh]hfolio}(hj. hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj+ ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj0 modnameN classnameNjj)}j]j)}j~jsbc.memcpy_from_folioasbuh1hhj ubj)}(h h]h }(hjN hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hjh]h*}(hj\ hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj!)}(hfolioh]hfolio}(hji hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(h size_t offseth](h)}(hhh]j!)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj modnameN classnameNjj)}j]jJ c.memcpy_from_folioasbuh1hhj~ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ ubj!)}(hoffseth]hoffset}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj~ ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubj@)}(h size_t lenh](h)}(hhh]j!)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj modnameN classnameNjj)}j]jJ c.memcpy_from_folioasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj!)}(hlenh]hlen}(hj hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjubeh}(h]h ]h"]h$]h&]jjuh1j9hjhhhjhM9ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM9ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM9hjhhubj)}(hhh]h)}(h#Copy a range of bytes from a folio.h]h#Copy a range of bytes from a folio.}(hj#!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM9hj !hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM9ubeh}(h]h ](j|functioneh"]h$]h&]jj|jj;!jj;!jjjuh1jhhhjhNhNubj)}(h**Parameters** ``char *to`` The memory to copy to. ``struct folio *folio`` The folio to read from. ``size_t offset`` The first byte in the folio to read. ``size_t len`` The number of bytes to copy.h](h)}(h**Parameters**h]j )}(hjE!h]h Parameters}(hjG!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjC!ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM=hj?!ubj")}(hhh](j')}(h$``char *to`` The memory to copy to. h](j-)}(h ``char *to``h]j3)}(hjd!h]hchar *to}(hjf!hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjb!ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM:hj^!ubjI)}(hhh]h)}(hThe memory to copy to.h]hThe memory to copy to.}(hj}!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjy!hM:hjz!ubah}(h]h ]h"]h$]h&]uh1jHhj^!ubeh}(h]h ]h"]h$]h&]uh1j&hjy!hM:hj[!ubj')}(h0``struct folio *folio`` The folio to read from. h](j-)}(h``struct folio *folio``h]j3)}(hj!h]hstruct folio *folio}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj!ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM;hj!ubjI)}(hhh]h)}(hThe folio to read from.h]hThe folio to read from.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hM;hj!ubah}(h]h ]h"]h$]h&]uh1jHhj!ubeh}(h]h ]h"]h$]h&]uh1j&hj!hM;hj[!ubj')}(h7``size_t offset`` The first byte in the folio to read. h](j-)}(h``size_t offset``h]j3)}(hj!h]h size_t offset}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj!ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM<hj!ubjI)}(hhh]h)}(h$The first byte in the folio to read.h]h$The first byte in the folio to read.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hM<hj!ubah}(h]h ]h"]h$]h&]uh1jHhj!ubeh}(h]h ]h"]h$]h&]uh1j&hj!hM<hj[!ubj')}(h+``size_t len`` The number of bytes to copy.h](j-)}(h``size_t len``h]j3)}(hj"h]h size_t len}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj "ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM>hj "ubjI)}(hhh]h)}(hThe number of bytes to copy.h]hThe number of bytes to copy.}(hj("hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM=hj%"ubah}(h]h ]h"]h$]h&]uh1jHhj "ubeh}(h]h ]h"]h$]h&]uh1j&hj$"hM>hj[!ubeh}(h]h ]h"]h$]h&]uh1j!hj?!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jmemcpy_to_folio (C function)c.memcpy_to_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hWvoid memcpy_to_folio (struct folio *folio, size_t offset, const char *from, size_t len)h]j)}(hVvoid memcpy_to_folio(struct folio *folio, size_t offset, const char *from, size_t len)h](j)}(hvoidh]hvoid}(hji"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje"hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMUubj)}(h h]h }(hjx"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje"hhhjw"hMUubj)}(hmemcpy_to_folioh]j!)}(hmemcpy_to_folioh]hmemcpy_to_folio}(hj"hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj"ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhje"hhhjw"hMUubj:)}(hB(struct folio *folio, size_t offset, const char *from, size_t len)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubh)}(hhh]j!)}(hfolioh]hfolio}(hj"hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj"ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj"modnameN classnameNjj)}j]j)}j~j"sbc.memcpy_to_folioasbuh1hhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj )}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj"ubj!)}(hfolioh]hfolio}(hj"hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj"ubj@)}(h size_t offseth](h)}(hhh]j!)}(hsize_th]hsize_t}(hj#hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj#ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj#modnameN classnameNjj)}j]j"c.memcpy_to_folioasbuh1hhj#ubj)}(h h]h }(hj9#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj!)}(hoffseth]hoffset}(hjG#hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj"ubj@)}(hconst char *fromh](jF)}(hjGh]hconst}(hj`#hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj\#ubj)}(h h]h }(hjm#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\#ubj)}(hcharh]hchar}(hj{#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\#ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\#ubj )}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj\#ubj!)}(hfromh]hfrom}(hj#hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj\#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj"ubj@)}(h size_t lenh](h)}(hhh]j!)}(hsize_th]hsize_t}(hj#hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj#ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj#modnameN classnameNjj)}j]j"c.memcpy_to_folioasbuh1hhj#ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj!)}(hlenh]hlen}(hj#hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj"ubeh}(h]h ]h"]h$]h&]jjuh1j9hje"hhhjw"hMUubeh}(h]h ]h"]h$]h&]jjjuh1jjjhja"hhhjw"hMUubah}(h]j\"ah ](jjeh"]h$]h&]jj)jhuh1jhjw"hMUhj^"hhubj)}(hhh]h)}(h!Copy a range of bytes to a folio.h]h!Copy a range of bytes to a folio.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMUhj$hhubah}(h]h ]h"]h$]h&]uh1jhj^"hhhjw"hMUubeh}(h]h ](j|functioneh"]h$]h&]jj|jj.$jj.$jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio to write to. ``size_t offset`` The first byte in the folio to store to. ``const char *from`` The memory to copy from. ``size_t len`` The number of bytes to copy.h](h)}(h**Parameters**h]j )}(hj8$h]h Parameters}(hj:$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6$ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMYhj2$ubj")}(hhh](j')}(h/``struct folio *folio`` The folio to write to. h](j-)}(h``struct folio *folio``h]j3)}(hjW$h]hstruct folio *folio}(hjY$hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjU$ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMVhjQ$ubjI)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hjp$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjl$hMVhjm$ubah}(h]h ]h"]h$]h&]uh1jHhjQ$ubeh}(h]h ]h"]h$]h&]uh1j&hjl$hMVhjN$ubj')}(h;``size_t offset`` The first byte in the folio to store to. h](j-)}(h``size_t offset``h]j3)}(hj$h]h size_t offset}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj$ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMWhj$ubjI)}(hhh]h)}(h(The first byte in the folio to store to.h]h(The first byte in the folio to store to.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMWhj$ubah}(h]h ]h"]h$]h&]uh1jHhj$ubeh}(h]h ]h"]h$]h&]uh1j&hj$hMWhjN$ubj')}(h.``const char *from`` The memory to copy from. h](j-)}(h``const char *from``h]j3)}(hj$h]hconst char *from}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj$ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMXhj$ubjI)}(hhh]h)}(hThe memory to copy from.h]hThe memory to copy from.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMXhj$ubah}(h]h ]h"]h$]h&]uh1jHhj$ubeh}(h]h ]h"]h$]h&]uh1j&hj$hMXhjN$ubj')}(h+``size_t len`` The number of bytes to copy.h](j-)}(h``size_t len``h]j3)}(hj%h]h size_t len}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj%ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMZhj$ubjI)}(hhh]h)}(hThe number of bytes to copy.h]hThe number of bytes to copy.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMYhj%ubah}(h]h ]h"]h$]h&]uh1jHhj$ubeh}(h]h ]h"]h$]h&]uh1j&hj%hMZhjN$ubeh}(h]h ]h"]h$]h&]uh1j!hj2$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_zero_tail (C function)c.folio_zero_tailhNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid * folio_zero_tail (struct folio *folio, size_t offset, void *kaddr)h]j)}(hFvoid *folio_zero_tail(struct folio *folio, size_t offset, void *kaddr)h](j)}(hvoidh]hvoid}(hj\%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX%hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMsubj)}(h h]h }(hjk%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX%hhhjj%hMsubj )}(hjh]h*}(hjy%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjX%hhhjj%hMsubj)}(hfolio_zero_tailh]j!)}(hfolio_zero_tailh]hfolio_zero_tail}(hj%hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj%ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjX%hhhjj%hMsubj:)}(h1(struct folio *folio, size_t offset, void *kaddr)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj%hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hhh]j!)}(hfolioh]hfolio}(hj%hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj%ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj%modnameN classnameNjj)}j]j)}j~j%sbc.folio_zero_tailasbuh1hhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj )}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj%ubj!)}(hfolioh]hfolio}(hj%hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj%ubj@)}(h size_t offseth](h)}(hhh]j!)}(hsize_th]hsize_t}(hj&hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj&ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj&modnameN classnameNjj)}j]j%c.folio_zero_tailasbuh1hhj&ubj)}(h h]h }(hj9&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj!)}(hoffseth]hoffset}(hjG&hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj%ubj@)}(h void *kaddrh](j)}(hvoidh]hvoid}(hj`&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\&ubj)}(h h]h }(hjn&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\&ubj )}(hjh]h*}(hj|&hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj\&ubj!)}(hkaddrh]hkaddr}(hj&hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj\&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj%ubeh}(h]h ]h"]h$]h&]jjuh1j9hjX%hhhjj%hMsubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjT%hhhjj%hMsubah}(h]jO%ah ](jjeh"]h$]h&]jj)jhuh1jhjj%hMshjQ%hhubj)}(hhh]h)}(hZero the tail of a folio.h]hZero the tail of a folio.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMshj&hhubah}(h]h ]h"]h$]h&]uh1jhjQ%hhhjj%hMsubeh}(h]h ](j|functioneh"]h$]h&]jj|jj&jj&jjjuh1jhhhjhNhNubj)}(hXX**Parameters** ``struct folio *folio`` The folio to zero. ``size_t offset`` The byte offset in the folio to start zeroing at. ``void *kaddr`` The address the folio is currently mapped to. **Description** If you have already used kmap_local_folio() to map a folio, written some data to it and now need to zero the end of the folio (and flush the dcache), you can use this function. If you do not have the folio kmapped (eg the folio has been partially populated by DMA), use folio_zero_range() or folio_zero_segment() instead. **Return** An address which can be passed to kunmap_local().h](h)}(h**Parameters**h]j )}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj&ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMwhj&ubj")}(hhh](j')}(h+``struct folio *folio`` The folio to zero. h](j-)}(h``struct folio *folio``h]j3)}(hj&h]hstruct folio *folio}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj&ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMthj&ubjI)}(hhh]h)}(hThe folio to zero.h]hThe folio to zero.}(hj 'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 'hMthj 'ubah}(h]h ]h"]h$]h&]uh1jHhj&ubeh}(h]h ]h"]h$]h&]uh1j&hj 'hMthj&ubj')}(hD``size_t offset`` The byte offset in the folio to start zeroing at. h](j-)}(h``size_t offset``h]j3)}(hj-'h]h size_t offset}(hj/'hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj+'ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMuhj''ubjI)}(hhh]h)}(h1The byte offset in the folio to start zeroing at.h]h1The byte offset in the folio to start zeroing at.}(hjF'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjB'hMuhjC'ubah}(h]h ]h"]h$]h&]uh1jHhj''ubeh}(h]h ]h"]h$]h&]uh1j&hjB'hMuhj&ubj')}(h>``void *kaddr`` The address the folio is currently mapped to. h](j-)}(h``void *kaddr``h]j3)}(hjf'h]h void *kaddr}(hjh'hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjd'ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMvhj`'ubjI)}(hhh]h)}(h-The address the folio is currently mapped to.h]h-The address the folio is currently mapped to.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{'hMvhj|'ubah}(h]h ]h"]h$]h&]uh1jHhj`'ubeh}(h]h ]h"]h$]h&]uh1j&hj{'hMvhj&ubeh}(h]h ]h"]h$]h&]uh1j!hj&ubh)}(h**Description**h]j )}(hj'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj'ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMxhj&ubh)}(hXBIf you have already used kmap_local_folio() to map a folio, written some data to it and now need to zero the end of the folio (and flush the dcache), you can use this function. If you do not have the folio kmapped (eg the folio has been partially populated by DMA), use folio_zero_range() or folio_zero_segment() instead.h]hXBIf you have already used kmap_local_folio() to map a folio, written some data to it and now need to zero the end of the folio (and flush the dcache), you can use this function. If you do not have the folio kmapped (eg the folio has been partially populated by DMA), use folio_zero_range() or folio_zero_segment() instead.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMwhj&ubh)}(h **Return**h]j )}(hj'h]hReturn}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj'ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM}hj&ubh)}(h1An address which can be passed to kunmap_local().h]h1An address which can be passed to kunmap_local().}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM~hj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_fill_tail (C function)c.folio_fill_tailhNtauh1jhjhhhNhNubj)}(hhh](j)}(hWvoid folio_fill_tail (struct folio *folio, size_t offset, const char *from, size_t len)h]j)}(hVvoid folio_fill_tail(struct folio *folio, size_t offset, const char *from, size_t len)h](j)}(hvoidh]hvoid}(hj (hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj (hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj (hhhj(hMubj)}(hfolio_fill_tailh]j!)}(hfolio_fill_tailh]hfolio_fill_tail}(hj.(hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj*(ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj (hhhj(hMubj:)}(hB(struct folio *folio, size_t offset, const char *from, size_t len)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hjJ(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjF(ubj)}(h h]h }(hjW(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF(ubh)}(hhh]j!)}(hfolioh]hfolio}(hjh(hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hje(ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjj(modnameN classnameNjj)}j]j)}j~j0(sbc.folio_fill_tailasbuh1hhjF(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF(ubj )}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjF(ubj!)}(hfolioh]hfolio}(hj(hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjF(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjB(ubj@)}(h size_t offseth](h)}(hhh]j!)}(hsize_th]hsize_t}(hj(hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj(ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj(modnameN classnameNjj)}j]j(c.folio_fill_tailasbuh1hhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj!)}(hoffseth]hoffset}(hj(hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjB(ubj@)}(hconst char *fromh](jF)}(hjGh]hconst}(hj)hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hcharh]hchar}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(h h]h }(hj-)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj )}(hjh]h*}(hj;)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj)ubj!)}(hfromh]hfrom}(hjH)hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjB(ubj@)}(h size_t lenh](h)}(hhh]j!)}(hsize_th]hsize_t}(hjd)hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hja)ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjf)modnameN classnameNjj)}j]j(c.folio_fill_tailasbuh1hhj])ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj])ubj!)}(hlenh]hlen}(hj)hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj])ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjB(ubeh}(h]h ]h"]h$]h&]jjuh1j9hj (hhhj(hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(hhhj(hMubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1jhj(hMhj(hhubj)}(hhh]h)}(h.Copy some data to a folio and pad with zeroes.h]h.Copy some data to a folio and pad with zeroes.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj)jj)jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The destination folio. ``size_t offset`` The offset into **folio** at which to start copying. ``const char *from`` The data to copy. ``size_t len`` How many bytes of data to copy. **Description** This function is most useful for filesystems which support inline data. When they want to copy data from the inode into the page cache, this function does everything for them. It supports large folios even on HIGHMEM configurations.h](h)}(h**Parameters**h]j )}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)ubj")}(hhh](j')}(h/``struct folio *folio`` The destination folio. h](j-)}(h``struct folio *folio``h]j3)}(hj)h]hstruct folio *folio}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj)ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)ubjI)}(hhh]h)}(hThe destination folio.h]hThe destination folio.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jHhj)ubeh}(h]h ]h"]h$]h&]uh1j&hj*hMhj)ubj')}(hG``size_t offset`` The offset into **folio** at which to start copying. h](j-)}(h``size_t offset``h]j3)}(hj4*h]h size_t offset}(hj6*hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj2*ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj.*ubjI)}(hhh]h)}(h4The offset into **folio** at which to start copying.h](hThe offset into }(hjM*hhhNhNubj )}(h **folio**h]hfolio}(hjU*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjM*ubh at which to start copying.}(hjM*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjI*hMhjJ*ubah}(h]h ]h"]h$]h&]uh1jHhj.*ubeh}(h]h ]h"]h$]h&]uh1j&hjI*hMhj)ubj')}(h'``const char *from`` The data to copy. h](j-)}(h``const char *from``h]j3)}(hj*h]hconst char *from}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj}*ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjy*ubjI)}(hhh]h)}(hThe data to copy.h]hThe data to copy.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jHhjy*ubeh}(h]h ]h"]h$]h&]uh1j&hj*hMhj)ubj')}(h/``size_t len`` How many bytes of data to copy. h](j-)}(h``size_t len``h]j3)}(hj*h]h size_t len}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj*ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj*ubjI)}(hhh]h)}(hHow many bytes of data to copy.h]hHow many bytes of data to copy.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jHhj*ubeh}(h]h ]h"]h$]h&]uh1j&hj*hMhj)ubeh}(h]h ]h"]h$]h&]uh1j!hj)ubh)}(h**Description**h]j )}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj*ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)ubh)}(hThis function is most useful for filesystems which support inline data. When they want to copy data from the inode into the page cache, this function does everything for them. It supports large folios even on HIGHMEM configurations.h]hThis function is most useful for filesystems which support inline data. When they want to copy data from the inode into the page cache, this function does everything for them. It supports large folios even on HIGHMEM configurations.}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#memcpy_from_file_folio (C function)c.memcpy_from_file_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hUsize_t memcpy_from_file_folio (char *to, struct folio *folio, loff_t pos, size_t len)h]j)}(hTsize_t memcpy_from_file_folio(char *to, struct folio *folio, loff_t pos, size_t len)h](h)}(hhh]j!)}(hsize_th]hsize_t}(hj;+hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj8+ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj=+modnameN classnameNjj)}j]j)}j~memcpy_from_file_foliosbc.memcpy_from_file_folioasbuh1hhj4+hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj]+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4+hhhj\+hMubj)}(hmemcpy_from_file_folioh]j!)}(hjY+h]hmemcpy_from_file_folio}(hjo+hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjk+ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj4+hhhj\+hMubj:)}(h7(char *to, struct folio *folio, loff_t pos, size_t len)h](j@)}(hchar *toh](j)}(hcharh]hchar}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj )}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubj!)}(htoh]hto}(hj+hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj+ubj@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj+hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j!)}(hfolioh]hfolio}(hj+hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj+ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj+modnameN classnameNjj)}j]jW+c.memcpy_from_file_folioasbuh1hhj+ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj )}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubj!)}(hfolioh]hfolio}(hj#,hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj+ubj@)}(h loff_t posh](h)}(hhh]j!)}(hloff_th]hloff_t}(hj?,hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj<,ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjA,modnameN classnameNjj)}j]jW+c.memcpy_from_file_folioasbuh1hhj8,ubj)}(h h]h }(hj],hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8,ubj!)}(hposh]hpos}(hjk,hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj8,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj+ubj@)}(h size_t lenh](h)}(hhh]j!)}(hsize_th]hsize_t}(hj,hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj,modnameN classnameNjj)}j]jW+c.memcpy_from_file_folioasbuh1hhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj!)}(hlenh]hlen}(hj,hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj+ubeh}(h]h ]h"]h$]h&]jjuh1j9hj4+hhhj\+hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj0+hhhj\+hMubah}(h]j++ah ](jjeh"]h$]h&]jj)jhuh1jhj\+hMhj-+hhubj)}(hhh]h)}(h"Copy some bytes from a file folio.h]h"Copy some bytes from a file folio.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,hhubah}(h]h ]h"]h$]h&]uh1jhj-+hhhj\+hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj,jj,jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``char *to`` The destination buffer. ``struct folio *folio`` The folio to copy from. ``loff_t pos`` The position in the file. ``size_t len`` The maximum number of bytes to copy. **Description** Copy up to **len** bytes from this folio. This may be limited by PAGE_SIZE if the folio comes from HIGHMEM, and by the size of the folio. **Return** The number of bytes copied from the folio.h](h)}(h**Parameters**h]j )}(hj,h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubj")}(hhh](j')}(h%``char *to`` The destination buffer. h](j-)}(h ``char *to``h]j3)}(hj-h]hchar *to}(hj -hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj-ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj-ubjI)}(hhh]h)}(hThe destination buffer.h]hThe destination buffer.}(hj7-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3-hMhj4-ubah}(h]h ]h"]h$]h&]uh1jHhj-ubeh}(h]h ]h"]h$]h&]uh1j&hj3-hMhj-ubj')}(h0``struct folio *folio`` The folio to copy from. h](j-)}(h``struct folio *folio``h]j3)}(hjW-h]hstruct folio *folio}(hjY-hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjU-ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjQ-ubjI)}(hhh]h)}(hThe folio to copy from.h]hThe folio to copy from.}(hjp-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjl-hMhjm-ubah}(h]h ]h"]h$]h&]uh1jHhjQ-ubeh}(h]h ]h"]h$]h&]uh1j&hjl-hMhj-ubj')}(h)``loff_t pos`` The position in the file. h](j-)}(h``loff_t pos``h]j3)}(hj-h]h loff_t pos}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj-ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj-ubjI)}(hhh]h)}(hThe position in the file.h]hThe position in the file.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jHhj-ubeh}(h]h ]h"]h$]h&]uh1j&hj-hMhj-ubj')}(h4``size_t len`` The maximum number of bytes to copy. h](j-)}(h``size_t len``h]j3)}(hj-h]h size_t len}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj-ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj-ubjI)}(hhh]h)}(h$The maximum number of bytes to copy.h]h$The maximum number of bytes to copy.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jHhj-ubeh}(h]h ]h"]h$]h&]uh1j&hj-hMhj-ubeh}(h]h ]h"]h$]h&]uh1j!hj,ubh)}(h**Description**h]j )}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(hCopy up to **len** bytes from this folio. This may be limited by PAGE_SIZE if the folio comes from HIGHMEM, and by the size of the folio.h](h Copy up to }(hj.hhhNhNubj )}(h**len**h]hlen}(hj".hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj.ubhx bytes from this folio. This may be limited by PAGE_SIZE if the folio comes from HIGHMEM, and by the size of the folio.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(h **Return**h]j )}(hj=.h]hReturn}(hj?.hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;.ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(h*The number of bytes copied from the folio.h]h*The number of bytes copied from the folio.}(hjS.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j folio_zero_segments (C function)c.folio_zero_segmentshNtauh1jhjhhhNhNubj)}(hhh](j)}(hhvoid folio_zero_segments (struct folio *folio, size_t start1, size_t xend1, size_t start2, size_t xend2)h]j)}(hgvoid folio_zero_segments(struct folio *folio, size_t start1, size_t xend1, size_t start2, size_t xend2)h](j)}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~.hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~.hhhj.hMubj)}(hfolio_zero_segmentsh]j!)}(hfolio_zero_segmentsh]hfolio_zero_segments}(hj.hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj.ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj~.hhhj.hMubj:)}(hO(struct folio *folio, size_t start1, size_t xend1, size_t start2, size_t xend2)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubh)}(hhh]j!)}(hfolioh]hfolio}(hj.hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj.modnameN classnameNjj)}j]j)}j~j.sbc.folio_zero_segmentsasbuh1hhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj )}(hjh]h*}(hj /hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj.ubj!)}(hfolioh]hfolio}(hj/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj.ubj@)}(h size_t start1h](h)}(hhh]j!)}(hsize_th]hsize_t}(hj4/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj1/ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj6/modnameN classnameNjj)}j]j.c.folio_zero_segmentsasbuh1hhj-/ubj)}(h h]h }(hjR/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-/ubj!)}(hstart1h]hstart1}(hj`/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj-/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj.ubj@)}(h size_t xend1h](h)}(hhh]j!)}(hsize_th]hsize_t}(hj|/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjy/ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj~/modnameN classnameNjj)}j]j.c.folio_zero_segmentsasbuh1hhju/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju/ubj!)}(hxend1h]hxend1}(hj/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hju/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj.ubj@)}(h size_t start2h](h)}(hhh]j!)}(hsize_th]hsize_t}(hj/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj/modnameN classnameNjj)}j]j.c.folio_zero_segmentsasbuh1hhj/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj!)}(hstart2h]hstart2}(hj/hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj.ubj@)}(h size_t xend2h](h)}(hhh]j!)}(hsize_th]hsize_t}(hj 0hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj 0ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj0modnameN classnameNjj)}j]j.c.folio_zero_segmentsasbuh1hhj0ubj)}(h h]h }(hj*0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj!)}(hxend2h]hxend2}(hj80hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj.ubeh}(h]h ]h"]h$]h&]jjuh1j9hj~.hhhj.hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjz.hhhj.hMubah}(h]ju.ah ](jjeh"]h$]h&]jj)jhuh1jhj.hMhjw.hhubj)}(hhh]h)}(h Zero two byte ranges in a folio.h]h Zero two byte ranges in a folio.}(hjb0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj_0hhubah}(h]h ]h"]h$]h&]uh1jhjw.hhhj.hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjz0jjz0jjjuh1jhhhjhNhNubj)}(hX7**Parameters** ``struct folio *folio`` The folio to write to. ``size_t start1`` The first byte to zero. ``size_t xend1`` One more than the last byte in the first range. ``size_t start2`` The first byte to zero in the second range. ``size_t xend2`` One more than the last byte in the second range.h](h)}(h**Parameters**h]j )}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj0ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj~0ubj")}(hhh](j')}(h/``struct folio *folio`` The folio to write to. h](j-)}(h``struct folio *folio``h]j3)}(hj0h]hstruct folio *folio}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj0ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj0ubjI)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jHhj0ubeh}(h]h ]h"]h$]h&]uh1j&hj0hMhj0ubj')}(h*``size_t start1`` The first byte to zero. h](j-)}(h``size_t start1``h]j3)}(hj0h]h size_t start1}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj0ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj0ubjI)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1jHhj0ubeh}(h]h ]h"]h$]h&]uh1j&hj0hMhj0ubj')}(hA``size_t xend1`` One more than the last byte in the first range. h](j-)}(h``size_t xend1``h]j3)}(hj1h]h size_t xend1}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj1ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj1ubjI)}(hhh]h)}(h/One more than the last byte in the first range.h]h/One more than the last byte in the first range.}(hj.1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*1hMhj+1ubah}(h]h ]h"]h$]h&]uh1jHhj1ubeh}(h]h ]h"]h$]h&]uh1j&hj*1hMhj0ubj')}(h>``size_t start2`` The first byte to zero in the second range. h](j-)}(h``size_t start2``h]j3)}(hjN1h]h size_t start2}(hjP1hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjL1ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjH1ubjI)}(hhh]h)}(h+The first byte to zero in the second range.h]h+The first byte to zero in the second range.}(hjg1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjc1hMhjd1ubah}(h]h ]h"]h$]h&]uh1jHhjH1ubeh}(h]h ]h"]h$]h&]uh1j&hjc1hMhj0ubj')}(hA``size_t xend2`` One more than the last byte in the second range.h](j-)}(h``size_t xend2``h]j3)}(hj1h]h size_t xend2}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj1ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj1ubjI)}(hhh]h)}(h0One more than the last byte in the second range.h]h0One more than the last byte in the second range.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj1ubah}(h]h ]h"]h$]h&]uh1jHhj1ubeh}(h]h ]h"]h$]h&]uh1j&hj1hMhj0ubeh}(h]h ]h"]h$]h&]uh1j!hj~0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_zero_segment (C function)c.folio_zero_segmenthNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid folio_zero_segment (struct folio *folio, size_t start, size_t xend)h]j)}(hGvoid folio_zero_segment(struct folio *folio, size_t start, size_t xend)h](j)}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhj1hMubj)}(hfolio_zero_segmenth]j!)}(hfolio_zero_segmenth]hfolio_zero_segment}(hj2hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj1ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj1hhhj1hMubj:)}(h0(struct folio *folio, size_t start, size_t xend)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj2hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj2ubj)}(h h]h }(hj+2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubh)}(hhh]j!)}(hfolioh]hfolio}(hj<2hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj92ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj>2modnameN classnameNjj)}j]j)}j~j2sbc.folio_zero_segmentasbuh1hhj2ubj)}(h h]h }(hj\2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj )}(hjh]h*}(hjj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj2ubj!)}(hfolioh]hfolio}(hjw2hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj2ubj@)}(h size_t starth](h)}(hhh]j!)}(hsize_th]hsize_t}(hj2hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj2ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj2modnameN classnameNjj)}j]jX2c.folio_zero_segmentasbuh1hhj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj!)}(hstarth]hstart}(hj2hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj2ubj@)}(h size_t xendh](h)}(hhh]j!)}(hsize_th]hsize_t}(hj2hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj2ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj2modnameN classnameNjj)}j]jX2c.folio_zero_segmentasbuh1hhj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj!)}(hxendh]hxend}(hj3hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj2ubeh}(h]h ]h"]h$]h&]jjuh1j9hj1hhhj1hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhj1hMubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj1hMhj1hhubj)}(hhh]h)}(hZero a byte range in a folio.h]hZero a byte range in a folio.}(hj13hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj.3hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjI3jjI3jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio to write to. ``size_t start`` The first byte to zero. ``size_t xend`` One more than the last byte to zero.h](h)}(h**Parameters**h]j )}(hjS3h]h Parameters}(hjU3hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjQ3ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjM3ubj")}(hhh](j')}(h/``struct folio *folio`` The folio to write to. h](j-)}(h``struct folio *folio``h]j3)}(hjr3h]hstruct folio *folio}(hjt3hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjp3ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjl3ubjI)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jHhjl3ubeh}(h]h ]h"]h$]h&]uh1j&hj3hMhji3ubj')}(h)``size_t start`` The first byte to zero. h](j-)}(h``size_t start``h]j3)}(hj3h]h size_t start}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj3ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3ubjI)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jHhj3ubeh}(h]h ]h"]h$]h&]uh1j&hj3hMhji3ubj')}(h4``size_t xend`` One more than the last byte to zero.h](j-)}(h``size_t xend``h]j3)}(hj3h]h size_t xend}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj3ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3ubjI)}(hhh]h)}(h$One more than the last byte to zero.h]h$One more than the last byte to zero.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3ubah}(h]h ]h"]h$]h&]uh1jHhj3ubeh}(h]h ]h"]h$]h&]uh1j&hj3hMhji3ubeh}(h]h ]h"]h$]h&]uh1j!hjM3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_zero_range (C function)c.folio_zero_rangehNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid folio_zero_range (struct folio *folio, size_t start, size_t length)h]j)}(hGvoid folio_zero_range(struct folio *folio, size_t start, size_t length)h](j)}(hvoidh]hvoid}(hj>4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:4hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjM4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:4hhhjL4hMubj)}(hfolio_zero_rangeh]j!)}(hfolio_zero_rangeh]hfolio_zero_range}(hj_4hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj[4ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj:4hhhjL4hMubj:)}(h2(struct folio *folio, size_t start, size_t length)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj{4hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjw4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubh)}(hhh]j!)}(hfolioh]hfolio}(hj4hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj4modnameN classnameNjj)}j]j)}j~ja4sbc.folio_zero_rangeasbuh1hhjw4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubj )}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjw4ubj!)}(hfolioh]hfolio}(hj4hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjw4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjs4ubj@)}(h size_t starth](h)}(hhh]j!)}(hsize_th]hsize_t}(hj4hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj4modnameN classnameNjj)}j]j4c.folio_zero_rangeasbuh1hhj4ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj!)}(hstarth]hstart}(hj5hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjs4ubj@)}(h size_t lengthh](h)}(hhh]j!)}(hsize_th]hsize_t}(hj85hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj55ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj:5modnameN classnameNjj)}j]j4c.folio_zero_rangeasbuh1hhj15ubj)}(h h]h }(hjV5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj15ubj!)}(hlengthh]hlength}(hjd5hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj15ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hjs4ubeh}(h]h ]h"]h$]h&]jjuh1j9hj:4hhhjL4hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj64hhhjL4hMubah}(h]j14ah ](jjeh"]h$]h&]jj)jhuh1jhjL4hMhj34hhubj)}(hhh]h)}(hZero a byte range in a folio.h]hZero a byte range in a folio.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj5hhubah}(h]h ]h"]h$]h&]uh1jhj34hhhjL4hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj5jj5jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio to write to. ``size_t start`` The first byte to zero. ``size_t length`` The number of bytes to zero.h](h)}(h**Parameters**h]j )}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj5ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj5ubj")}(hhh](j')}(h/``struct folio *folio`` The folio to write to. h](j-)}(h``struct folio *folio``h]j3)}(hj5h]hstruct folio *folio}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj5ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj5ubjI)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jHhj5ubeh}(h]h ]h"]h$]h&]uh1j&hj5hMhj5ubj')}(h)``size_t start`` The first byte to zero. h](j-)}(h``size_t start``h]j3)}(hj6h]h size_t start}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj6ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj6ubjI)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj!6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMhj6ubah}(h]h ]h"]h$]h&]uh1jHhj6ubeh}(h]h ]h"]h$]h&]uh1j&hj6hMhj5ubj')}(h.``size_t length`` The number of bytes to zero.h](j-)}(h``size_t length``h]j3)}(hjA6h]h size_t length}(hjC6hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj?6ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj;6ubjI)}(hhh]h)}(hThe number of bytes to zero.h]hThe number of bytes to zero.}(hjZ6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjW6ubah}(h]h ]h"]h$]h&]uh1jHhj;6ubeh}(h]h ]h"]h$]h&]uh1j&hjV6hMhj5ubeh}(h]h ]h"]h$]h&]uh1j!hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_release_kmap (C function)c.folio_release_kmaphNtauh1jhjhhhNhNubj)}(hhh](j)}(h9void folio_release_kmap (struct folio *folio, void *addr)h]j)}(h8void folio_release_kmap(struct folio *folio, void *addr)h](j)}(hvoidh]hvoid}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhj6hMubj)}(hfolio_release_kmaph]j!)}(hfolio_release_kmaph]hfolio_release_kmap}(hj6hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj6ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj6hhhj6hMubj:)}(h!(struct folio *folio, void *addr)h](j@)}(hstruct folio *folioh](jF)}(hjIh]hstruct}(hj6hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j!)}(hfolioh]hfolio}(hj6hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj6modnameN classnameNjj)}j]j)}j~j6sbc.folio_release_kmapasbuh1hhj6ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj )}(hjh]h*}(hj$7hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj6ubj!)}(hfolioh]hfolio}(hj17hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj6ubj@)}(h void *addrh](j)}(hvoidh]hvoid}(hjJ7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF7ubj)}(h h]h }(hjX7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF7ubj )}(hjh]h*}(hjf7hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjF7ubj!)}(haddrh]haddr}(hjs7hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjF7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj6ubeh}(h]h ]h"]h$]h&]jjuh1j9hj6hhhj6hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj6hhhj6hMubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhj6hhubj)}(hhh]h)}(h"Unmap a folio and drop a refcount.h]h"Unmap a folio and drop a refcount.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7hhubah}(h]h ]h"]h$]h&]uh1jhj6hhhj6hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj7jj7jjjuh1jhhhjhNhNubj)}(hXU**Parameters** ``struct folio *folio`` The folio to release. ``void *addr`` The address previously returned by a call to kmap_local_folio(). **Description** It is common, eg in directory handling to kmap a folio. This function unmaps the folio and drops the refcount that was being held to keep the folio alive while we accessed it.h](h)}(h**Parameters**h]j )}(hj7h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj7ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubj")}(hhh](j')}(h.``struct folio *folio`` The folio to release. h](j-)}(h``struct folio *folio``h]j3)}(hj7h]hstruct folio *folio}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj7ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubjI)}(hhh]h)}(hThe folio to release.h]hThe folio to release.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1jHhj7ubeh}(h]h ]h"]h$]h&]uh1j&hj7hMhj7ubj')}(hP``void *addr`` The address previously returned by a call to kmap_local_folio(). h](j-)}(h``void *addr``h]j3)}(hj8h]h void *addr}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj8ubah}(h]h ]h"]h$]h&]uh1j,hS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj8ubjI)}(hhh]h)}(h@The address previously returned by a call to kmap_local_folio().h]h@The address previously returned by a call to kmap_local_folio().}(hj08hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,8hMhj-8ubah}(h]h ]h"]h$]h&]uh1jHhj8ubeh}(h]h ]h"]h$]h&]uh1j&hj,8hMhj7ubeh}(h]h ]h"]h$]h&]uh1j!hj7ubh)}(h**Description**h]j )}(hjR8h]h Description}(hjT8hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjP8ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubh)}(hIt is common, eg in directory handling to kmap a folio. This function unmaps the folio and drops the refcount that was being held to keep the folio alive while we accessed it.h]hIt is common, eg in directory handling to kmap a folio. This function unmaps the folio and drops the refcount that was being held to keep the folio alive while we accessed it.}(hjh8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_high (C function) c.kmap_highhNtauh1jhjhhhNhNubj)}(hhh](j)}(h$void * kmap_high (struct page *page)h]j)}(h"void *kmap_high(struct page *page)h](j)}(hvoidh]hvoid}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM-ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj8hM-ubj )}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj8hhhj8hM-ubj)}(h kmap_highh]j!)}(h kmap_highh]h kmap_high}(hj8hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj8ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj8hhhj8hM-ubj:)}(h(struct page *page)h]j@)}(hstruct page *pageh](jF)}(hjIh]hstruct}(hj8hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j!)}(hpageh]hpage}(hj8hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj8ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj9modnameN classnameNjj)}j]j)}j~j8sb c.kmap_highasbuh1hhj8ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj )}(hjh]h*}(hj-9hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj8ubj!)}(hpageh]hpage}(hj:9hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj8ubah}(h]h ]h"]h$]h&]jjuh1j9hj8hhhj8hM-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj8hhhj8hM-ubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1jhj8hM-hj8hhubj)}(hhh]h)}(hmap a highmem page into memoryh]hmap a highmem page into memory}(hjd9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM-hja9hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj8hM-ubeh}(h]h ](j|functioneh"]h$]h&]jj|jj|9jj|9jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct page *page`` :c:type:`struct page ` to map **Description** Returns the page's virtual memory address. We cannot call this from interrupts, as it may block.h](h)}(h**Parameters**h]j )}(hj9h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj9ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM1hj9ubj")}(hhh]j')}(h:``struct page *page`` :c:type:`struct page ` to map h](j-)}(h``struct page *page``h]j3)}(hj9h]hstruct page *page}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj9ubah}(h]h ]h"]h$]h&]uh1j,hH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM.hj9ubjI)}(hhh]h)}(h#:c:type:`struct page ` to maph](h)}(h:c:type:`struct page `h]j3)}(hj9h]h struct page}(hj9hhhNhNubah}(h]h ](xrefj|c-typeeh"]h$]h&]uh1j2hj9ubah}(h]h ]h"]h$]h&]refdoc mm/highmem refdomainj|reftypetype refexplicitrefwarnjj)}j]sb reftargetpageuh1hhj9hM.hj9ubh to map}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj9hM.hj9ubah}(h]h ]h"]h$]h&]uh1jHhj9ubeh}(h]h ]h"]h$]h&]uh1j&hj9hM.hj9ubah}(h]h ]h"]h$]h&]uh1j!hj9ubh)}(h**Description**h]j )}(hj:h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj:ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.cxhM0hj9ubh)}(h*Returns the page's virtual memory address.h]h,Returns the page’s virtual memory address.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM/hj9ubh)}(h5We cannot call this from interrupts, as it may block.h]h5We cannot call this from interrupts, as it may block.}(hj*:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM1hj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_high_get (C function)c.kmap_high_gethNtauh1jhjhhhNhNubj)}(hhh](j)}(h.void * kmap_high_get (const struct page *page)h]j)}(h,void *kmap_high_get(const struct page *page)h](j)}(hvoidh]hvoid}(hjY:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU:hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMIubj)}(h h]h }(hjh:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU:hhhjg:hMIubj )}(hjh]h*}(hjv:hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjU:hhhjg:hMIubj)}(h kmap_high_geth]j!)}(h kmap_high_geth]h kmap_high_get}(hj:hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj:ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjU:hhhjg:hMIubj:)}(h(const struct page *page)h]j@)}(hconst struct page *pageh](jF)}(hjGh]hconst}(hj:hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubjF)}(hjIh]hstruct}(hj:hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubh)}(hhh]j!)}(hpageh]hpage}(hj:hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj:ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj:modnameN classnameNjj)}j]j)}j~j:sbc.kmap_high_getasbuh1hhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj )}(hjh]h*}(hj ;hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj:ubj!)}(hpageh]hpage}(hj;hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj:ubah}(h]h ]h"]h$]h&]jjuh1j9hjU:hhhjg:hMIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjQ:hhhjg:hMIubah}(h]jL:ah ](jjeh"]h$]h&]jj)jhuh1jhjg:hMIhjN:hhubj)}(hhh]h)}(hpin a highmem page into memoryh]hpin a highmem page into memory}(hjA;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMIhj>;hhubah}(h]h ]h"]h$]h&]uh1jhjN:hhhjg:hMIubeh}(h]h ](j|functioneh"]h$]h&]jj|jjY;jjY;jjjuh1jhhhjhNhNubj)}(hX=**Parameters** ``const struct page *page`` :c:type:`struct page ` to pin **Description** Returns the page's current virtual memory address, or NULL if no mapping exists. If and only if a non null address is returned then a matching call to kunmap_high() is necessary. This can be called from any context.h](h)}(h**Parameters**h]j )}(hjc;h]h Parameters}(hje;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hja;ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMMhj];ubj")}(hhh]j')}(h@``const struct page *page`` :c:type:`struct page ` to pin h](j-)}(h``const struct page *page``h]j3)}(hj;h]hconst struct page *page}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj;ubah}(h]h ]h"]h$]h&]uh1j,hH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMJhj|;ubjI)}(hhh]h)}(h#:c:type:`struct page ` to pinh](h)}(h:c:type:`struct page `h]j3)}(hj;h]h struct page}(hj;hhhNhNubah}(h]h ](j9j|c-typeeh"]h$]h&]uh1j2hj;ubah}(h]h ]h"]h$]h&]refdocj9 refdomainj|reftypetype refexplicitrefwarnjj9j9pageuh1hhj;hMJhj;ubh to pin}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj;hMJhj;ubah}(h]h ]h"]h$]h&]uh1jHhj|;ubeh}(h]h ]h"]h$]h&]uh1j&hj;hMJhjy;ubah}(h]h ]h"]h$]h&]uh1j!hj];ubh)}(h**Description**h]j )}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj;ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMLhj];ubh)}(hReturns the page's current virtual memory address, or NULL if no mapping exists. If and only if a non null address is returned then a matching call to kunmap_high() is necessary.h]hReturns the page’s current virtual memory address, or NULL if no mapping exists. If and only if a non null address is returned then a matching call to kunmap_high() is necessary.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMKhj];ubh)}(h$This can be called from any context.h]h$This can be called from any context.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMOhj];ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap_high (C function) c.kunmap_highhNtauh1jhjhhhNhNubj)}(hhh](j)}(h*void kunmap_high (const struct page *page)h]j)}(h)void kunmap_high(const struct page *page)h](j)}(hvoidh]hvoid}(hj0<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,<hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMbubj)}(h h]h }(hj?<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,<hhhj><hMbubj)}(h kunmap_highh]j!)}(h kunmap_highh]h kunmap_high}(hjQ<hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjM<ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj,<hhhj><hMbubj:)}(h(const struct page *page)h]j@)}(hconst struct page *pageh](jF)}(hjGh]hconst}(hjm<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhji<ubj)}(h h]h }(hjz<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji<ubjF)}(hjIh]hstruct}(hj<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhji<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji<ubh)}(hhh]j!)}(hpageh]hpage}(hj<hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj<ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj<modnameN classnameNjj)}j]j)}j~jS<sb c.kunmap_highasbuh1hhji<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji<ubj )}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hji<ubj!)}(hpageh]hpage}(hj<hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hji<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hje<ubah}(h]h ]h"]h$]h&]jjuh1j9hj,<hhhj><hMbubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj(<hhhj><hMbubah}(h]j#<ah ](jjeh"]h$]h&]jj)jhuh1jhj><hMbhj%<hhubj)}(hhh]h)}(h unmap a highmem page into memoryh]h unmap a highmem page into memory}(hj =hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMbhj=hhubah}(h]h ]h"]h$]h&]uh1jhj%<hhhj><hMbubeh}(h]h ](j|functioneh"]h$]h&]jj|jj#=jj#=jjjuh1jhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` :c:type:`struct page ` to unmap **Description** If ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called only from user context.h](h)}(h**Parameters**h]j )}(hj-=h]h Parameters}(hj/=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj+=ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMfhj'=ubj")}(hhh]j')}(hB``const struct page *page`` :c:type:`struct page ` to unmap h](j-)}(h``const struct page *page``h]j3)}(hjL=h]hconst struct page *page}(hjN=hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjJ=ubah}(h]h ]h"]h$]h&]uh1j,hH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMchjF=ubjI)}(hhh]h)}(h%:c:type:`struct page ` to unmaph](h)}(h:c:type:`struct page `h]j3)}(hjk=h]h struct page}(hjm=hhhNhNubah}(h]h ](j9j|c-typeeh"]h$]h&]uh1j2hji=ubah}(h]h ]h"]h$]h&]refdocj9 refdomainj|reftypetype refexplicitrefwarnjj9j9pageuh1hhja=hMchje=ubh to unmap}(hje=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhja=hMchjb=ubah}(h]h ]h"]h$]h&]uh1jHhjF=ubeh}(h]h ]h"]h$]h&]uh1j&hja=hMchjC=ubah}(h]h ]h"]h$]h&]uh1j!hj'=ubh)}(h**Description**h]j )}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj=ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMehj'=ubh)}(hZIf ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called only from user context.h]hZIf ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called only from user context.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMdhj'=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jpage_address (C function)c.page_addresshNtauh1jhjhhhNhNubj)}(hhh](j)}(h-void * page_address (const struct page *page)h]j)}(h+void *page_address(const struct page *page)h](j)}(hvoidh]hvoid}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj=hMubj )}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj=hhhj=hMubj)}(h page_addressh]j!)}(h page_addressh]h page_address}(hj>hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj>ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj=hhhj=hMubj:)}(h(const struct page *page)h]j@)}(hconst struct page *pageh](jF)}(hjGh]hconst}(hj5>hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj1>ubj)}(h h]h }(hjB>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1>ubjF)}(hjIh]hstruct}(hjP>hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj1>ubj)}(h h]h }(hj]>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1>ubh)}(hhh]j!)}(hpageh]hpage}(hjn>hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjk>ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetjp>modnameN classnameNjj)}j]j)}j~j>sbc.page_addressasbuh1hhj1>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1>ubj )}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj1>ubj!)}(hpageh]hpage}(hj>hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj1>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj->ubah}(h]h ]h"]h$]h&]jjuh1j9hj=hhhj=hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj=hhhj=hMubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1jhj=hMhj=hhubj)}(hhh]h)}(h(get the mapped virtual address of a pageh]h(get the mapped virtual address of a page}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj=hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj>jj>jjjuh1jhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` :c:type:`struct page ` to get the virtual address of **Description** Returns the page's virtual address.h](h)}(h**Parameters**h]j )}(hj>h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj>ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>ubj")}(hhh]j')}(hW``const struct page *page`` :c:type:`struct page ` to get the virtual address of h](j-)}(h``const struct page *page``h]j3)}(hj?h]hconst struct page *page}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj?ubah}(h]h ]h"]h$]h&]uh1j,hH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj?ubjI)}(hhh]h)}(h::c:type:`struct page ` to get the virtual address ofh](h)}(h:c:type:`struct page `h]j3)}(hj3?h]h struct page}(hj5?hhhNhNubah}(h]h ](j9j|c-typeeh"]h$]h&]uh1j2hj1?ubah}(h]h ]h"]h$]h&]refdocj9 refdomainj|reftypetype refexplicitrefwarnjj9j9pageuh1hhj)?hMhj-?ubh to get the virtual address of}(hj-?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj)?hMhj*?ubah}(h]h ]h"]h$]h&]uh1jHhj?ubeh}(h]h ]h"]h$]h&]uh1j&hj)?hMhj ?ubah}(h]h ]h"]h$]h&]uh1j!hj>ubh)}(h**Description**h]j )}(hjn?h]h Description}(hjp?hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjl?ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>ubh)}(h#Returns the page's virtual address.h]h%Returns the page’s virtual address.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jset_page_address (C function)c.set_page_addresshNtauh1jhjhhhNhNubj)}(hhh](j)}(h8void set_page_address (struct page *page, void *virtual)h]j)}(h7void set_page_address(struct page *page, void *virtual)h](j)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMubj)}(hset_page_addressh]j!)}(hset_page_addressh]hset_page_address}(hj?hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj?ubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhj?hhhj?hMubj:)}(h"(struct page *page, void *virtual)h](j@)}(hstruct page *pageh](jF)}(hjIh]hstruct}(hj?hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubh)}(hhh]j!)}(hpageh]hpage}(hj@hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj @ubah}(h]h ]h"]h$]h&] refdomainj|reftypej~ reftargetj@modnameN classnameNjj)}j]j)}j~j?sbc.set_page_addressasbuh1hhj?ubj)}(h h]h }(hj.@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj )}(hjh]h*}(hj<@hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj?ubj!)}(hpageh]hpage}(hjI@hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj?ubj@)}(h void *virtualh](j)}(hvoidh]hvoid}(hjb@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^@ubj)}(h h]h }(hjp@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^@ubj )}(hjh]h*}(hj~@hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj^@ubj!)}(hvirtualh]hvirtual}(hj@hhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hj^@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j?hj?ubeh}(h]h ]h"]h$]h&]jjuh1j9hj?hhhj?hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj?hhhj?hMubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1jhj?hMhj?hhubj)}(hhh]h)}(hset a page's virtual addressh]hset a page’s virtual address}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj@hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj?hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj@jj@jjjuh1jhhhjhNhNubj)}(hw**Parameters** ``struct page *page`` :c:type:`struct page ` to set ``void *virtual`` virtual address to useh](h)}(h**Parameters**h]j )}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj@ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj@ubj")}(hhh](j')}(h:``struct page *page`` :c:type:`struct page ` to set h](j-)}(h``struct page *page``h]j3)}(hj@h]hstruct page *page}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj@ubah}(h]h ]h"]h$]h&]uh1j,hH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj@ubjI)}(hhh]h)}(h#:c:type:`struct page ` to seth](h)}(h:c:type:`struct page `h]j3)}(hjAh]h struct page}(hjAhhhNhNubah}(h]h ](j9j|c-typeeh"]h$]h&]uh1j2hjAubah}(h]h ]h"]h$]h&]refdocj9 refdomainj|reftypetype refexplicitrefwarnjj9j9pageuh1hhj AhMhjAubh to set}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj AhMhj Aubah}(h]h ]h"]h$]h&]uh1jHhj@ubeh}(h]h ]h"]h$]h&]uh1j&hj AhMhj@ubj')}(h(``void *virtual`` virtual address to useh](j-)}(h``void *virtual``h]j3)}(hjNAh]h void *virtual}(hjPAhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjLAubah}(h]h ]h"]h$]h&]uh1j,hH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhjHAubjI)}(hhh]h)}(hvirtual address to useh]hvirtual address to use}(hjgAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhjdAubah}(h]h ]h"]h$]h&]uh1jHhjHAubeh}(h]h ]h"]h$]h&]uh1j&hjcAhMhj@ubeh}(h]h ]h"]h$]h&]uh1j!hj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap_atomic (C macro)c.kunmap_atomichNtauh1jhjhhhNhNubj)}(hhh](j)}(h kunmap_atomich]j)}(h kunmap_atomich]j)}(h kunmap_atomich]j!)}(hjAh]h kunmap_atomic}(hjAhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjAubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjAhhh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjAhhhjAhMubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1jhjAhMhjAhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjAhhhjAhMubeh}(h]h ](j|macroeh"]h$]h&]jj|jjAjjAjjjuh1jhhhjhNhNubh)}(h``kunmap_atomic (__addr)``h]j3)}(hjAh]hkunmap_atomic (__addr)}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjAubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjhhubh block_quote)}(h@Unmap the virtual address mapped by kmap_atomic() - deprecated! h]h)}(h?Unmap the virtual address mapped by kmap_atomic() - deprecated!h]h?Unmap the virtual address mapped by kmap_atomic() - deprecated!}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjAubah}(h]h ]h"]h$]h&]uh1jAhjBhMhjhhubj)}(hX**Parameters** ``__addr`` Virtual address to be unmapped **Description** Unmaps an address previously mapped by kmap_atomic() and re-enables pagefaults. Depending on PREEMP_RT configuration, re-enables also migration and preemption. Users should not count on these side effects. Mappings should be unmapped in the reverse order that they were mapped. See kmap_local_page() for details on nesting. **__addr** can be any address within the mapped page, so there is no need to subtract any offset that has been added. In contrast to kunmap(), this function takes the address returned from kmap_atomic(), not the page passed to it. The compiler will warn you if you pass the page.h](h)}(h**Parameters**h]j )}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjBubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhM hjBubj")}(hhh]j')}(h*``__addr`` Virtual address to be unmapped h](j-)}(h ``__addr``h]j3)}(hj4Bh]h__addr}(hj6BhhhNhNubah}(h]h ]h"]h$]h&]uh1j2hj2Bubah}(h]h ]h"]h$]h&]uh1j,h\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj.BubjI)}(hhh]h)}(hVirtual address to be unmappedh]hVirtual address to be unmapped}(hjMBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIBhMhjJBubah}(h]h ]h"]h$]h&]uh1jHhj.Bubeh}(h]h ]h"]h$]h&]uh1j&hjIBhMhj+Bubah}(h]h ]h"]h$]h&]uh1j!hjBubh)}(h**Description**h]j )}(hjoBh]h Description}(hjqBhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjmBubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjBubh)}(hUnmaps an address previously mapped by kmap_atomic() and re-enables pagefaults. Depending on PREEMP_RT configuration, re-enables also migration and preemption. Users should not count on these side effects.h]hUnmaps an address previously mapped by kmap_atomic() and re-enables pagefaults. Depending on PREEMP_RT configuration, re-enables also migration and preemption. Users should not count on these side effects.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjBubh)}(huMappings should be unmapped in the reverse order that they were mapped. See kmap_local_page() for details on nesting.h]huMappings should be unmapped in the reverse order that they were mapped. See kmap_local_page() for details on nesting.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhM hjBubh)}(hX**__addr** can be any address within the mapped page, so there is no need to subtract any offset that has been added. In contrast to kunmap(), this function takes the address returned from kmap_atomic(), not the page passed to it. The compiler will warn you if you pass the page.h](j )}(h **__addr**h]h__addr}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjBubhX  can be any address within the mapped page, so there is no need to subtract any offset that has been added. In contrast to kunmap(), this function takes the address returned from kmap_atomic(), not the page passed to it. The compiler will warn you if you pass the page.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap_local (C macro)c.kunmap_localhNtauh1jhjhhhNhNubj)}(hhh](j)}(h kunmap_localh]j)}(h kunmap_localh]j)}(h kunmap_localh]j!)}(hjBh]h kunmap_local}(hjBhhhNhNubah}(h]h ]j-ah"]h$]h&]uh1j hjBubah}(h]h ](j4j5eh"]h$]h&]jjuh1jhjBhhh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhjBhhhjBhMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1jhjBhMhjBhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjBhhhjBhMubeh}(h]h ](j|macroeh"]h$]h&]jj|jjCjjCjjjuh1jhhhjhNhNubh)}(h``kunmap_local (__addr)``h]j3)}(hjCh]hkunmap_local (__addr)}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjCubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjhhubjA)}(h+Unmap a page mapped via kmap_local_page(). h]h)}(h*Unmap a page mapped via kmap_local_page().h]h*Unmap a page mapped via kmap_local_page().}(hj0ChhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj,Cubah}(h]h ]h"]h$]h&]uh1jAhj>ChMhjhhubj)}(hXE**Parameters** ``__addr`` An address within the page mapped **Description** **__addr** can be any address within the mapped page. Commonly it is the address return from kmap_local_page(), but it can also include offsets. Unmapping should be done in the reverse order of the mapping. See kmap_local_page() for details.h](h)}(h**Parameters**h]j )}(hjKCh]h Parameters}(hjMChhhNhNubah}(h]h ]h"]h$]h&]uh1j hjICubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjECubj")}(hhh]j')}(h-``__addr`` An address within the page mapped h](j-)}(h ``__addr``h]j3)}(hjjCh]h__addr}(hjlChhhNhNubah}(h]h ]h"]h$]h&]uh1j2hjhCubah}(h]h ]h"]h$]h&]uh1j,h\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjdCubjI)}(hhh]h)}(h!An address within the page mappedh]h!An address within the page mapped}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChMhjCubah}(h]h ]h"]h$]h&]uh1jHhjdCubeh}(h]h ]h"]h$]h&]uh1j&hjChMhjaCubah}(h]h ]h"]h$]h&]uh1j!hjECubh)}(h**Description**h]j )}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j hjCubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjECubh)}(h**__addr** can be any address within the mapped page. Commonly it is the address return from kmap_local_page(), but it can also include offsets.h](j )}(h **__addr**h]h__addr}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j hjCubh can be any address within the mapped page. Commonly it is the address return from kmap_local_page(), but it can also include offsets.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjECubh)}(haUnmapping should be done in the reverse order of the mapping. See kmap_local_page() for details.h]haUnmapping should be done in the reverse order of the mapping. See kmap_local_page() for details.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhM hjECubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]jah ]h"] functionsah$]h&]uh1hhhhhhhhKubeh}(h]high-memory-handlingah ]h"]high memory handlingah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj Derror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehʌ _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jCjCjjj3jjj4j,jVjjxjCju nametypes}(jCjj3jj,jjCuh}(jChjhjjj4j6jVjjxj/jjjjjjjjj8 j= j: j? js jx jWj\jjj4j9jejjjpjujjjjj\"ja"jO%jT%j(j(j++j0+ju.jz.j1j1j14j64j6j6j8j8jL:jQ:j#<j(<j=j=j?j?jAjAjBjBj jj.j%jPjGjrjijju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j.DKsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.