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]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?}(hhhhhNhNubah}(h]id1ah ]h"]h$]h&]refidwhat-is-high-memoryuh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hTemporary Virtual Mappings}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]refidtemporary-virtual-mappingsuh1hhjubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hCost of Temporary Mappings}(hj3hhhNhNubah}(h]id3ah ]h"]h$]h&]refidcost-of-temporary-mappingsuh1hhj0ubah}(h]h ]h"]h$]h&]uh1hhj-ubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]hi386 PAE}(hjUhhhNhNubah}(h]id4ah ]h"]h$]h&]refidi386-paeuh1hhjRubah}(h]h ]h"]h$]h&]uh1hhjOubah}(h]h ]h"]h$]h&]uh1hhhubh)}(hhh]h)}(hhh]h)}(hhh]h Functions}(hjwhhhNhNubah}(h]id5ah ]h"]h$]h&]refid functionsuh1hhjtubah}(h]h ]h"]h$]h&]uh1hhjqubah}(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&]refidhuh1hhjhhhhhK 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]hah ]h"]what is high memory?ah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hTemporary Virtual Mappingsh]hTemporary Virtual Mappings}(hj%hhhNhNubah}(h]h ]h"]h$]h&]jjuh1hhj"hhhhhK1ubh)}(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.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hj"hhubh)}(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.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjDubh)}(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.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjDubh)}(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.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjDubh)}(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.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjDubh)}(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&]uh1hhhhKIhjDubh)}(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&]uh1hhhhKNhjDubh)}(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&]uh1hhhhKQhjDubh)}(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&]uh1hhhhKWhjDubh)}(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^hjDubh)}(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&]uh1hhhhKchjDubeh}(h]h ]h"]h$]h&]uh1hhjAhhhhhNubh)}(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.}(hjhhhNhNubah}(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().}(hj$hhhNhNubah}(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.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1hhjAhhhhhNubh)}(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().}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFubh)}(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.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFubh)}(h[Legacy documentation]h]h[Legacy documentation]}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFubh)}(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().}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFubh)}(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&]uh1hhhhKhjFubh)}(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&]uh1hhhhKhjFubh)}(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&]uh1hhhhKhjFubeh}(h]h ]h"]h$]h&]uh1hhjAhhhhhNubh)}(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&]uh1hhjAhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1hhhhK6hj"hhubeh}(h]j ah ]h"]temporary virtual mappingsah$]h&]uh1hhhhhhhhK1ubh)}(hhh](h)}(hCost of Temporary Mappingsh]hCost of Temporary Mappings}(hjhhhNhNubah}(h]h ]h"]h$]h&]jj<uh1hhjhhhhhKubh)}(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.}(hjhhhNhNubah}(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]jBah ]h"]cost of temporary mappingsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hi386 PAEh]hi386 PAE}(hjhhhNhNubah}(h]h ]h"]h$]h&]jj^uh1hhjhhhhhKubh)}(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&]uh1hhhhKhjhhubh)}(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:}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj=ubah}(h]h ]h"]h$]h&]uh1hhj:hhhhhNubh)}(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...}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjUubah}(h]h ]h"]h$]h&]uh1hhj:hhhhhNubh)}(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.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjmubah}(h]h ]h"]h$]h&]uh1hhj:hhhhhNubeh}(h]h ]h"]h$]h&]jjuh1hhhhKhjhhubh)}(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&]uh1hhhhKhjhhubeh}(h]jdah ]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.hhK%ubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhK%ubhdesc_sig_punctuation)}(hjh]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjhhhjhK%ubh desc_name)}(hkmaph]h desc_sig_name)}(hkmaph]hkmap}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1j hjubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1jhjhhhjhK%ubhdesc_parameterlist)}(h(struct page *page)h]hdesc_parameter)}(hstruct page *pageh](hdesc_sig_keyword)}(hstructh]hstruct}(hj3hhhNhNubah}(h]h ]kah"]h$]h&]uh1j1hj-ubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j )}(hpageh]hpage}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjPubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjUmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jo ASTIdentifier)}jjjsbc.kmapasbuh1hhj-ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj'ubah}(h]h ]h"]h$]h&]jjuh1j%hjhhhjhK%ubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jsphinx_line_type declaratorhjhhhjhK%ubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhK%hjhhubh 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&]uh1jhjhhhjhK%ubeh}(h]h ](jhfunctioneh"]h$]h&]domainjhobjtypejdesctypejnoindex 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)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(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)}(hjh]hstruct page *page}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh definition)}(hhh]h)}(h Pointer to the page to be mappedh]h Pointer to the page to be mapped}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKhj6ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj3hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hj[h]hReturn}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(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}(hjqhhhNhNubah}(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&]uh1jhjubah}(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.hhK hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap (C function)c.kunmaphNtauh1jhjhhhNhNubj)}(hhh](j)}(hvoid kunmap (struct page *page)h]j)}(hvoid kunmap(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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjhhhjhK.ubj&)}(h(struct page *page)h]j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j )}(hpageh]hpage}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjLubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjQmodnameN classnameNjnjq)}jt]jw)}jjjsbc.kunmapasbuh1hhj-ubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjh]h*}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj)ubah}(h]h ]h"]h$]h&]jjuh1j%hjhhhjhK.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 ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``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&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK,hjubj)}(hhh]j)}(hE``struct page *page`` Pointer to the page which was mapped by kmap() h](j)}(h``struct page *page``h]j)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK)hjubj5)}(hhh]h)}(h.Pointer to the page which was mapped by kmap()h]h.Pointer to the page which was mapped by kmap()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK)hj ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj hK)hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj0h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.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.}(hjFhhhNhNubah}(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](j2)}(hj5h]hstruct}(hjuhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjqhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK6ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhK6ubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jj kmap_to_pagesbc.kmap_to_pageasbuh1hhjqhhhjhK6ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhK6ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhK6ubj)}(h kmap_to_pageh]j )}(hjh]h kmap_to_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjqhhhjhK6ubj&)}(h (void *addr)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*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(haddrh]haddr}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubah}(h]h ]h"]h$]h&]jjuh1j%hjqhhhjhK6ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjmhhhjhK6ubah}(h]jhah ](jjeh"]h$]h&]jj)jhuh1jhjhK6hjjhhubj)}(hhh]h)}(h"Get the page for a kmap'ed addressh]h$Get the page for a kmap’ed address}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK1hj? hhubah}(h]h ]h"]h$]h&]uh1jhjjhhhjhK6ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjZ jjZ jjjuh1jhhhjhNhNubj)}(hj**Parameters** ``void *addr`` The address to look up **Return** The page which is mapped to **addr**.h](h)}(h**Parameters**h]j)}(hjd h]h Parameters}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb 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]j)}(hj h]h void *addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK2hj} ubj5)}(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&]uh1j4hj} ubeh}(h]h ]h"]h$]h&]uh1jhj hK2hjz ubah}(h]h ]h"]h$]h&]uh1j hj^ ubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 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&]uh1jhj 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}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKah"]h$]h&]uh1j1hj] ubj)}(h h]h }(hjn hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj] ubh)}(hhh]j )}(hpageh]hpage}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj| ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj modnameN classnameNjnjq)}jt]jw)}jjjG 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&]uh1jhj] ubj )}(hpageh]hpage}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj] ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjY ubah}(h]h ]h"]h$]h&]jjuh1j%hj hhhj% hK`ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj hhhj% hK`ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj% 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 hhhj% hK`ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj jj jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``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)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKChj ubj)}(hhh]j)}(h7``struct page *page`` Pointer to the page to be mapped h](j)}(h``struct page *page``h]j)}(hj% h]hstruct page *page}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj# ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK@hj ubj5)}(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&]uh1j4hj ubeh}(h]h ]h"]h$]h&]uh1jhj: hK@hj ubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(h **Return**h]j)}(hj` h]hReturn}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKBhj ubh)}(h"The virtual address of the mappingh]h"The virtual address of the mapping}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKBhj ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKDhj 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.hhKDhj 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.hhKFhj 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.hhKJhj 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.hhKPhj 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.hhKRhj 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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKUhj 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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKYhj 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.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK\hj 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)}(hah"]h$]h&]uh1j1hj{ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ ubh)}(hhh]j )}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj modnameN classnameNjnjq)}jt]jw)}jjje sbc.kmap_local_folioasbuh1hhj{ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ ubj )}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj{ ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjw ubj,)}(h size_t offseth](h)}(hhh]j )}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj modnameN classnameNjnjq)}jt]j c.kmap_local_folioasbuh1hhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hoffseth]hoffset}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjw ubeh}(h]h ]h"]h$]h&]jjuh1j%hj1 hhhjC hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj- hhhjC hKubah}(h]j( ah ](jjeh"]h$]h&]jj)jhuh1jhjC hKhj* hhubj)}(hhh]h)}(h,Map a page in this folio for temporary usageh]h,Map a page in this folio for temporary usage}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKchjGhhubah}(h]h ]h"]h$]h&]uh1jhj* hhhjC hKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjbjjbjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``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**.Oh](h)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjfubj)}(hhh](j)}(h7``struct folio *folio`` The folio containing the page. h](j)}(h``struct folio *folio``h]j)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKdhjubj5)}(hhh]h)}(hThe folio containing the page.h]hThe folio containing the page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKdhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhKdhjubj)}(hN``size_t offset`` The byte offset within the folio which identifies the page. h](j)}(h``size_t offset``h]j)}(hjh]h size_t offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKehjubj5)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKehjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhKehjubeh}(h]h ]h"]h$]h&]uh1j hjfubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjfubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjfubj)}(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);}hj$sbah}(h]h ]h"]h$]h&]jjuh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKkhjfubh)}(h?Unmapping addr1 before addr2 is invalid and causes malfunction.h]h?Unmapping addr1 before addr2 is invalid and causes malfunction.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKqhjfubh)}(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.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKshjfubh)}(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.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKvhjfubh)}(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.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKzhjfubh)}(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.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK}hjfubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjfubh)}(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.hhKhjfubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjfubh)}(h"The virtual address of **offset**.h](hThe virtual address of }(hjhhhNhNubj)}(h **offset**h]hoffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjfubeh}(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 (struct page *page)h]j)}(h$void *kmap_atomic(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 }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hKubj)}(h kmap_atomich]j )}(h kmap_atomich]h kmap_atomic}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj(ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjhhhj hKubj&)}(h(struct page *page)h]j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hjHhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjDubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubh)}(hhh]j )}(hpageh]hpage}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjcubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjhmodnameN classnameNjnjq)}jt]jw)}jjj.sb c.kmap_atomicasbuh1hhjDubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjDubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj@ubah}(h]h ]h"]h$]h&]jjuh1j%hjhhhj hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hKhjhhubj)}(hhh]h)}(h7Atomically map a page for temporary usage - Deprecated!h]h7Atomically map a page for temporary usage - Deprecated!}(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&]uh1jhjhhhj hKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``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)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj)}(hhh]j)}(h7``struct page *page`` Pointer to the page to be mapped h](j)}(h``struct page *page``h]j)}(hj h]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj5)}(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!hKhj"ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj!hKhjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h **Return**h]j)}(hjGh]hReturn}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(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}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h**Description**h]j)}(hjnh]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(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.hhKhjubh)}(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.hhKhjubh)}(h6Do not use in new code. Use kmap_local_page() instead.h]h6Do not use in new code. Use kmap_local_page() instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj)}(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);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h9vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2);h]h9vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h"memcpy(vaddr1, vaddr2, PAGE_SIZE);h]h"memcpy(vaddr1, vaddr2, PAGE_SIZE);}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h-kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);h]h-kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);}(hj hhhNhNubah}(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+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](j2)}(hj5h]hstruct}(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhjGhKubh)}(hhh]j )}(hfolioh]hfolio}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjVubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj[modnameN classnameNjnjq)}jt]jw)}jjvma_alloc_zeroed_movable_foliosb c.vma_alloc_zeroed_movable_folioasbuh1hhj6hhhjGhKubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhjGhKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhjGhKubj)}(hvma_alloc_zeroed_movable_folioh]j )}(hjwh]hvma_alloc_zeroed_movable_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj6hhhjGhKubj&)}(h1(struct vm_area_struct *vma, unsigned long vaddr)h](j,)}(hstruct vm_area_struct *vmah](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]ju c.vma_alloc_zeroed_movable_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hvmah]hvma}(hj hhhNhNubah}(h]h ]jah"]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 }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hvaddrh]hvaddr}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hj6hhhjGhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj2hhhjGhKubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1jhjGhKhj/hhubj)}(hhh]h)}(h!Allocate a zeroed page for a VMA.h]h!Allocate a zeroed page for a VMA.}(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&]uh1jhj/hhhjGhKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(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&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj)}(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]j)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj5)}(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&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hL``unsigned long vaddr`` The virtual address the page will be inserted into. h](j)}(h``unsigned long vaddr``h]j)}(hjh]hunsigned long vaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubj5)}(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&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(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.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h **Return**h]j)}(hjbh]hReturn}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(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.}(hjxhhhNhNubah}(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](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.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hmemcpy_from_folioh]j )}(hmemcpy_from_folioh]hmemcpy_from_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjhhhjhMubj&)}(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&]uh1jhjubj )}(htoh]hto}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj&hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj"ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubh)}(hhh]j )}(hfolioh]hfolio}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjAubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjFmodnameN classnameNjnjq)}jt]jw)}jjjsbc.memcpy_from_folioasbuh1hhj"ubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(h size_t offseth](h)}(hhh]j )}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]j`c.memcpy_from_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(h size_t lenh](h)}(hhh]j )}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]j`c.memcpy_from_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h#Copy a range of bytes from a folio.h]h#Copy a range of bytes from a folio.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj6hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjQjjQjjjuh1jhhhjhNhNubj)}(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)}(hj[h]h Parameters}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjUubj)}(hhh](j)}(h$``char *to`` The memory to copy to. h](j)}(h ``char *to``h]j)}(hjzh]hchar *to}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjtubj5)}(hhh]h)}(hThe memory to copy to.h]hThe memory to copy to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhjqubj)}(h0``struct folio *folio`` The folio to read from. h](j)}(h``struct folio *folio``h]j)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(hhh]h)}(hThe folio to read from.h]hThe folio to read from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjqubj)}(h7``size_t offset`` The first byte in the folio to read. h](j)}(h``size_t offset``h]j)}(hjh]h size_t offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(hhh]h)}(h$The first byte in the folio to read.h]h$The first byte in the folio to read.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjqubj)}(h+``size_t len`` The number of bytes to copy.h](j)}(h``size_t len``h]j)}(hj%h]h size_t len}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(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.hhMhj;ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjqubeh}(h]h ]h"]h$]h&]uh1j hjUubeh}(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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhjhMubj)}(hmemcpy_to_folioh]j )}(hmemcpy_to_folioh]hmemcpy_to_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj{hhhjhMubj&)}(hB(struct folio *folio, size_t offset, const char *from, size_t len)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjsbc.memcpy_to_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(h size_t offseth](h)}(hhh]j )}(hsize_th]hsize_t}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj3modnameN classnameNjnjq)}jt]jc.memcpy_to_folioasbuh1hhj*ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj )}(hoffseth]hoffset}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(hconst char *fromh](j2)}(hconsth]hconst}(hjvhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubj )}(hfromh]hfrom}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjrubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(h size_t lenh](h)}(hhh]j )}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jc.memcpy_to_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hj{hhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjwhhhjhMubah}(h]jrah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjthhubj)}(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.hhMhj*hhubah}(h]h ]h"]h$]h&]uh1jhjthhhjhMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjEjjEjjjuh1jhhhjhNhNubj)}(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)}(hjOh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjIubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hjnh]hstruct folio *folio}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjhubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhjeubj)}(h;``size_t offset`` The first byte in the folio to store to. h](j)}(h``size_t offset``h]j)}(hjh]h size_t offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(hhh]h)}(h(The first byte in the folio to store to.h]h(The first byte in the folio to store to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjeubj)}(h.``const char *from`` The memory to copy from. h](j)}(h``const char *from``h]j)}(hjh]hconst char *from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(hhh]h)}(hThe memory to copy from.h]hThe memory to copy from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjeubj)}(h+``size_t len`` The number of bytes to copy.h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(hhh]h)}(hThe number of bytes to copy.h]hThe number of bytes to copy.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj/ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj.hMhjeubeh}(h]h ]h"]h$]h&]uh1j hjIubeh}(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}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjhMubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjhMubj)}(hfolio_zero_tailh]j )}(hfolio_zero_tailh]hfolio_zero_tail}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjohhhjhMubj&)}(h1(struct folio *folio, size_t offset, void *kaddr)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjsbc.folio_zero_tailasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(h size_t offseth](h)}(hhh]j )}(hsize_th]hsize_t}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj4modnameN classnameNjnjq)}jt]jc.folio_zero_tailasbuh1hhj+ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj )}(hoffseth]hoffset}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(h void *kaddrh](j)}(hvoidh]hvoid}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj )}(hkaddrh]hkaddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hjohhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjkhhhjhMubah}(h]jfah ](jjeh"]h$]h&]jj)jhuh1jhjhMhjhhhubj)}(hhh]h)}(hZero the tail of a folio.h]hZero the tail of a folio.}(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&]uh1jhjhhhhjhMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(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)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj)}(hhh](j)}(h+``struct folio *folio`` The folio to zero. h](j)}(h``struct folio *folio``h]j)}(hj h]hstruct folio *folio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj5)}(hhh]h)}(hThe folio to zero.h]hThe folio to zero.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj!ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(hD``size_t offset`` The byte offset in the folio to start zeroing at. h](j)}(h``size_t offset``h]j)}(hjDh]h size_t offset}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj>ubj5)}(hhh]h)}(h1The byte offset in the folio to start zeroing at.h]h1The byte offset in the folio to start zeroing at.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMhjZubah}(h]h ]h"]h$]h&]uh1j4hj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhMhjubj)}(h>``void *kaddr`` The address the folio is currently mapped to. h](j)}(h``void *kaddr``h]j)}(hj}h]h void *kaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjwubj5)}(hhh]h)}(h-The address the folio is currently mapped to.h]h-The address the folio is currently mapped to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubh)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubh)}(h1An address which can be passed to kunmap_local().h]h1An address which can be passed to kunmap_local().}(hjhhhNhNubah}(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](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.hhM,ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj2hM,ubj)}(hfolio_fill_tailh]j )}(hfolio_fill_tailh]hfolio_fill_tail}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjAubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj hhhj2hM,ubj&)}(hB(struct folio *folio, size_t offset, const char *from, size_t len)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hjahhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj]ubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubh)}(hhh]j )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj|ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjGsbc.folio_fill_tailasbuh1hhj]ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj )}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjYubj,)}(h size_t offseth](h)}(hhh]j )}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jc.folio_fill_tailasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjYubj,)}(hconst char *fromh](j2)}(hjxh]hconst}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcharh]hchar}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hfromh]hfrom}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjYubj,)}(h size_t lenh](h)}(hhh]j )}(hsize_th]hsize_t}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjxubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj}modnameN classnameNjnjq)}jt]jc.folio_fill_tailasbuh1hhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj )}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjYubeh}(h]h ]h"]h$]h&]jjuh1j%hj hhhj2hM,ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhj2hM,ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj2hM,hjhhubj)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM!hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj2hM,ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(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)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM%hjubj)}(hhh](j)}(h/``struct folio *folio`` The destination folio. h](j)}(h``struct folio *folio``h]j)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM"hj ubj5)}(hhh]h)}(hThe destination folio.h]hThe destination folio.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hM"hj(ubah}(h]h ]h"]h$]h&]uh1j4hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hM"hj ubj)}(hG``size_t offset`` The offset into **folio** at which to start copying. h](j)}(h``size_t offset``h]j)}(hjKh]h size_t offset}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM#hjEubj5)}(hhh]h)}(h4The offset into **folio** at which to start copying.h](hThe offset into }(hjdhhhNhNubj)}(h **folio**h]hfolio}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh at which to start copying.}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj`hM#hjaubah}(h]h ]h"]h$]h&]uh1j4hjEubeh}(h]h ]h"]h$]h&]uh1jhj`hM#hj ubj)}(h'``const char *from`` The data to copy. h](j)}(h``const char *from``h]j)}(hjh]hconst char *from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM$hjubj5)}(hhh]h)}(hThe data to copy.h]hThe data to copy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM$hjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhM$hj ubj)}(h/``size_t len`` How many bytes of data to copy. h](j)}(h``size_t len``h]j)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM%hjubj5)}(hhh]h)}(hHow many bytes of data to copy.h]hHow many bytes of data to copy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM%hjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhM%hj ubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM'hjubh)}(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.hhM'hjubeh}(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}(hjR hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjO ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjT modnameN classnameNjnjq)}jt]jw)}jjmemcpy_from_file_foliosbc.memcpy_from_file_folioasbuh1hhjK hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMRubj)}(h h]h }(hjt hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK hhhjs hMRubj)}(hmemcpy_from_file_folioh]j )}(hjp h]hmemcpy_from_file_folio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjK hhhjs hMRubj&)}(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&]uh1jhj ubj )}(htoh]hto}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj ubj,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j )}(hfolioh]hfolio}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj!modnameN classnameNjnjq)}jt]jn 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&]uh1jhj ubj )}(hfolioh]hfolio}(hj:!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj ubj,)}(h loff_t posh](h)}(hhh]j )}(hloff_th]hloff_t}(hjV!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjS!ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjX!modnameN classnameNjnjq)}jt]jn c.memcpy_from_file_folioasbuh1hhjO!ubj)}(h h]h }(hjt!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO!ubj )}(hposh]hpos}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjO!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj ubj,)}(h size_t lenh](h)}(hhh]j )}(hsize_th]hsize_t}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj!ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj!modnameN classnameNjnjq)}jt]jn c.memcpy_from_file_folioasbuh1hhj!ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj )}(hlenh]hlen}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj ubeh}(h]h ]h"]h$]h&]jjuh1j%hjK hhhjs hMRubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjG hhhjs hMRubah}(h]jB ah ](jjeh"]h$]h&]jj)jhuh1jhjs hMRhjD 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.hhMGhj!hhubah}(h]h ]h"]h$]h&]uh1jhjD hhhjs hMRubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj "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&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMKhj"ubj)}(hhh](j)}(h%``char *to`` The destination buffer. h](j)}(h ``char *to``h]j)}(hj5"h]hchar *to}(hj7"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3"ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMHhj/"ubj5)}(hhh]h)}(hThe destination buffer.h]hThe destination buffer.}(hjN"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJ"hMHhjK"ubah}(h]h ]h"]h$]h&]uh1j4hj/"ubeh}(h]h ]h"]h$]h&]uh1jhjJ"hMHhj,"ubj)}(h0``struct folio *folio`` The folio to copy from. h](j)}(h``struct folio *folio``h]j)}(hjn"h]hstruct folio *folio}(hjp"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl"ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMIhjh"ubj5)}(hhh]h)}(hThe folio to copy from.h]hThe folio to copy from.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMIhj"ubah}(h]h ]h"]h$]h&]uh1j4hjh"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMIhj,"ubj)}(h)``loff_t pos`` The position in the file. h](j)}(h``loff_t pos``h]j)}(hj"h]h loff_t pos}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMJhj"ubj5)}(hhh]h)}(hThe position in the file.h]hThe position in the file.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMJhj"ubah}(h]h ]h"]h$]h&]uh1j4hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMJhj,"ubj)}(h4``size_t len`` The maximum number of bytes to copy. h](j)}(h``size_t len``h]j)}(hj"h]h size_t len}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMKhj"ubj5)}(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"hMKhj"ubah}(h]h ]h"]h$]h&]uh1j4hj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMKhj,"ubeh}(h]h ]h"]h$]h&]uh1j hj"ubh)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMMhj"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 }(hj1#hhhNhNubj)}(h**len**h]hlen}(hj9#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1#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.}(hj1#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMMhj"ubh)}(h **Return**h]j)}(hjT#h]hReturn}(hjV#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR#ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMPhj"ubh)}(h*The number of bytes copied from the folio.h]h*The number of bytes copied from the folio.}(hjj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMPhj"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.hhMlubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj#hMlubj)}(hfolio_zero_segmentsh]j )}(hfolio_zero_segmentsh]hfolio_zero_segments}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj#hhhj#hMlubj&)}(hO(struct folio *folio, size_t start1, size_t xend1, size_t start2, size_t xend2)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj#ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j )}(hfolioh]hfolio}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj#modnameN classnameNjnjq)}jt]jw)}jjj#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&]uh1jhj#ubj )}(hfolioh]hfolio}(hj/$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj#ubj,)}(h size_t start1h](h)}(hhh]j )}(hsize_th]hsize_t}(hjK$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjH$ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjM$modnameN classnameNjnjq)}jt]j$c.folio_zero_segmentsasbuh1hhjD$ubj)}(h h]h }(hji$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD$ubj )}(hstart1h]hstart1}(hjw$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjD$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj#ubj,)}(h size_t xend1h](h)}(hhh]j )}(hsize_th]hsize_t}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj$ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj$modnameN classnameNjnjq)}jt]j$c.folio_zero_segmentsasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj )}(hxend1h]hxend1}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj#ubj,)}(h size_t start2h](h)}(hhh]j )}(hsize_th]hsize_t}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj$ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj$modnameN classnameNjnjq)}jt]j$c.folio_zero_segmentsasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj )}(hstart2h]hstart2}(hj%hhhNhNubah}(h]h ]jah"]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#%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj %ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj%%modnameN classnameNjnjq)}jt]j$c.folio_zero_segmentsasbuh1hhj%ubj)}(h h]h }(hjA%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj )}(hxend2h]hxend2}(hjO%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj#ubeh}(h]h ]h"]h$]h&]jjuh1j%hj#hhhj#hMlubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj#hhhj#hMlubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj#hMlhj#hhubj)}(hhh]h)}(h Zero two byte ranges in a folio.h]h Zero two byte ranges in a folio.}(hjy%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMehjv%hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hMlubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj%jj%jjjuh1jhhhjhNhNubj)}(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)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMihj%ubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hj%h]hstruct folio *folio}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMfhj%ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMfhj%ubah}(h]h ]h"]h$]h&]uh1j4hj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMfhj%ubj)}(h*``size_t start1`` The first byte to zero. h](j)}(h``size_t start1``h]j)}(hj%h]h size_t start1}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMghj%ubj5)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj &hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMghj &ubah}(h]h ]h"]h$]h&]uh1j4hj%ubeh}(h]h ]h"]h$]h&]uh1jhj&hMghj%ubj)}(hA``size_t xend1`` One more than the last byte in the first range. h](j)}(h``size_t xend1``h]j)}(hj,&h]h size_t xend1}(hj.&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*&ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhhj&&ubj5)}(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.}(hjE&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjA&hMhhjB&ubah}(h]h ]h"]h$]h&]uh1j4hj&&ubeh}(h]h ]h"]h$]h&]uh1jhjA&hMhhj%ubj)}(h>``size_t start2`` The first byte to zero in the second range. h](j)}(h``size_t start2``h]j)}(hje&h]h size_t start2}(hjg&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc&ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMihj_&ubj5)}(hhh]h)}(h+The first byte to zero in the second range.h]h+The first byte to zero in the second range.}(hj~&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjz&hMihj{&ubah}(h]h ]h"]h$]h&]uh1j4hj_&ubeh}(h]h ]h"]h$]h&]uh1jhjz&hMihj%ubj)}(hA``size_t xend2`` One more than the last byte in the second range.h](j)}(h``size_t xend2``h]j)}(hj&h]h size_t xend2}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMkhj&ubj5)}(hhh]h)}(h0One more than the last byte in the second range.h]h0One more than the last byte in the second range.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMjhj&ubah}(h]h ]h"]h$]h&]uh1j4hj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMkhj%ubeh}(h]h ]h"]h$]h&]uh1j hj%ubeh}(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}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMxubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhj'hMxubj)}(hfolio_zero_segmenth]j )}(hfolio_zero_segmenth]hfolio_zero_segment}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj'ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj&hhhj'hMxubj&)}(h0(struct folio *folio, size_t start, size_t xend)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj5'hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj1'ubj)}(h h]h }(hjB'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1'ubh)}(hhh]j )}(hfolioh]hfolio}(hjS'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjP'ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjU'modnameN classnameNjnjq)}jt]jw)}jjj'sbc.folio_zero_segmentasbuh1hhj1'ubj)}(h h]h }(hjs'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1'ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1'ubj )}(hfolioh]hfolio}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj1'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj-'ubj,)}(h size_t starth](h)}(hhh]j )}(hsize_th]hsize_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj'ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj'modnameN classnameNjnjq)}jt]jo'c.folio_zero_segmentasbuh1hhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj )}(hstarth]hstart}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj-'ubj,)}(h size_t xendh](h)}(hhh]j )}(hsize_th]hsize_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj'ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj'modnameN classnameNjnjq)}jt]jo'c.folio_zero_segmentasbuh1hhj'ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj )}(hxendh]hxend}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj-'ubeh}(h]h ]h"]h$]h&]jjuh1j%hj&hhhj'hMxubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj&hhhj'hMxubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj'hMxhj&hhubj)}(hhh]h)}(hZero a byte range in a folio.h]hZero a byte range in a folio.}(hjH(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMshjE(hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj'hMxubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj`(jj`(jjjuh1jhhhjhNhNubj)}(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)}(hjj(h]h Parameters}(hjl(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh(ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMwhjd(ubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hj(h]hstruct folio *folio}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMthj(ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMthj(ubah}(h]h ]h"]h$]h&]uh1j4hj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMthj(ubj)}(h)``size_t start`` The first byte to zero. h](j)}(h``size_t start``h]j)}(hj(h]h size_t start}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMuhj(ubj5)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMuhj(ubah}(h]h ]h"]h$]h&]uh1j4hj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMuhj(ubj)}(h4``size_t xend`` One more than the last byte to zero.h](j)}(h``size_t xend``h]j)}(hj(h]h size_t xend}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMwhj(ubj5)}(hhh]h)}(h$One more than the last byte to zero.h]h$One more than the last byte to zero.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMvhj)ubah}(h]h ]h"]h$]h&]uh1j4hj(ubeh}(h]h ]h"]h$]h&]uh1jhj)hMwhj(ubeh}(h]h ]h"]h$]h&]uh1j hjd(ubeh}(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}(hjU)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ)hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjd)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ)hhhjc)hMubj)}(hfolio_zero_rangeh]j )}(hfolio_zero_rangeh]hfolio_zero_range}(hjv)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjr)ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjQ)hhhjc)hMubj&)}(h2(struct folio *folio, size_t start, size_t length)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj)hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j )}(hfolioh]hfolio}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj)ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj)modnameN classnameNjnjq)}jt]jw)}jjjx)sbc.folio_zero_rangeasbuh1hhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj )}(hfolioh]hfolio}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj)ubj,)}(h size_t starth](h)}(hhh]j )}(hsize_th]hsize_t}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj*ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj *modnameN classnameNjnjq)}jt]j)c.folio_zero_rangeasbuh1hhj*ubj)}(h h]h }(hj%*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj )}(hstarth]hstart}(hj3*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj)ubj,)}(h size_t lengthh](h)}(hhh]j )}(hsize_th]hsize_t}(hjO*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjL*ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjQ*modnameN classnameNjnjq)}jt]j)c.folio_zero_rangeasbuh1hhjH*ubj)}(h h]h }(hjm*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH*ubj )}(hlengthh]hlength}(hj{*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjH*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj)ubeh}(h]h ]h"]h$]h&]jjuh1j%hjQ)hhhjc)hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjM)hhhjc)hMubah}(h]jH)ah ](jjeh"]h$]h&]jj)jhuh1jhjc)hMhjJ)hhubj)}(hhh]h)}(hZero a byte range in a folio.h]hZero a byte range in a 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&]uh1jhjJ)hhhjc)hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj*jj*jjjuh1jhhhjhNhNubj)}(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)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*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 folio to write to. h](j)}(h``struct folio *folio``h]j)}(hj*h]hstruct folio *folio}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj*ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j4hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj*ubj)}(h)``size_t start`` The first byte to zero. h](j)}(h``size_t start``h]j)}(hj+h]h size_t start}(hj!+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj+ubj5)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj8+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4+hMhj5+ubah}(h]h ]h"]h$]h&]uh1j4hj+ubeh}(h]h ]h"]h$]h&]uh1jhj4+hMhj*ubj)}(h.``size_t length`` The number of bytes to zero.h](j)}(h``size_t length``h]j)}(hjX+h]h size_t length}(hjZ+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV+ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjR+ubj5)}(hhh]h)}(hThe number of bytes to zero.h]hThe number of bytes to zero.}(hjq+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjn+ubah}(h]h ]h"]h$]h&]uh1j4hjR+ubeh}(h]h ]h"]h$]h&]uh1jhjm+hMhj*ubeh}(h]h ]h"]h$]h&]uh1j hj*ubeh}(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}(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_release_kmaph]j )}(hfolio_release_kmaph]hfolio_release_kmap}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj+hhhj+hMubj&)}(h!(struct folio *folio, void *addr)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj+hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j )}(hfolioh]hfolio}(hj ,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ,ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj,modnameN classnameNjnjq)}jt]jw)}jjj+sbc.folio_release_kmapasbuh1hhj+ubj)}(h h]h }(hj-,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hjh]h*}(hj;,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj )}(hfolioh]hfolio}(hjH,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj+ubj,)}(h void *addrh](j)}(hvoidh]hvoid}(hja,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj],ubj)}(h h]h }(hjo,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj],ubj)}(hjh]h*}(hj},hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj],ubj )}(haddrh]haddr}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj],ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj+ubeh}(h]h ]h"]h$]h&]jjuh1j%hj+hhhj+hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+hhhj+hMubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1jhj+hMhj+hhubj)}(hhh]h)}(h"Unmap a folio and drop a refcount.h]h"Unmap a folio and drop a refcount.}(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 ](jhfunctioneh"]h$]h&]jjhjj,jj,jjjuh1jhhhjhNhNubj)}(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)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,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 folio to release. h](j)}(h``struct folio *folio``h]j)}(hj,h]hstruct folio *folio}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubj5)}(hhh]h)}(hThe folio to release.h]hThe folio to release.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj -hMhj -ubah}(h]h ]h"]h$]h&]uh1j4hj,ubeh}(h]h ]h"]h$]h&]uh1jhj -hMhj,ubj)}(hP``void *addr`` The address previously returned by a call to kmap_local_folio(). h](j)}(h``void *addr``h]j)}(hj.-h]h void *addr}(hj0-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,-ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj(-ubj5)}(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().}(hjG-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC-hMhjD-ubah}(h]h ]h"]h$]h&]uh1j4hj(-ubeh}(h]h ]h"]h$]h&]uh1jhjC-hMhj,ubeh}(h]h ]h"]h$]h&]uh1j hj,ubh)}(h**Description**h]j)}(hji-h]h Description}(hjk-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg-ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(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.}(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](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}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM3ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hM3ubj)}(hjh]h*}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hM3ubj)}(h kmap_highh]j )}(h kmap_highh]h kmap_high}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj-ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj-hhhj-hM3ubj&)}(h(struct page *page)h]j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hj-hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j )}(hpageh]hpage}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj.ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj.modnameN classnameNjnjq)}jt]jw)}jjj-sb c.kmap_highasbuh1hhj-ubj)}(h h]h }(hj6.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjh]h*}(hjD.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj )}(hpageh]hpage}(hjQ.hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj-ubah}(h]h ]h"]h$]h&]jjuh1j%hj-hhhj-hM3ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj-hhhj-hM3ubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1jhj-hM3hj-hhubj)}(hhh]h)}(hmap a highmem page into memoryh]hmap a highmem page into memory}(hj{.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM,hjx.hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj-hM3ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj.jj.jjjuh1jhhhjhNhNubj)}(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)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM0hj.ubj)}(hhh]j)}(h:``struct page *page`` :c:type:`struct page ` to map h](j)}(h``struct page *page``h]j)}(hj.h]hstruct page *page}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM-hj.ubj5)}(hhh]h)}(h#:c:type:`struct page ` to maph](h)}(h:c:type:`struct page `h]j)}(hj.h]h struct page}(hj.hhhNhNubah}(h]h ](xrefjhc-typeeh"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]refdoc mm/highmem refdomainjhreftypetype refexplicitrefwarnjnjq)}jt]sb reftargetpageuh1hhj.hM-hj.ubh to map}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj.hM-hj.ubah}(h]h ]h"]h$]h&]uh1j4hj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hM-hj.ubah}(h]h ]h"]h$]h&]uh1j hj.ubh)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM/hj.ubh)}(h*Returns the page's virtual memory address.h]h,Returns the page’s virtual memory address.}(hj2/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM/hj.ubh)}(h5We cannot call this from interrupts, as it may block.h]h5We cannot call this from interrupts, as it may block.}(hjA/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM1hj.ubeh}(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 (struct page *page)h]j)}(h&void *kmap_high_get(struct page *page)h](j)}(hvoidh]hvoid}(hjp/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl/hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMQubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl/hhhj~/hMQubj)}(hjh]h*}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl/hhhj~/hMQubj)}(h kmap_high_geth]j )}(h kmap_high_geth]h kmap_high_get}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjl/hhhj~/hMQubj&)}(h(struct page *page)h]j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hj/hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j )}(hpageh]hpage}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj/modnameN classnameNjnjq)}jt]jw)}jjj/sbc.kmap_high_getasbuh1hhj/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj )}(hpageh]hpage}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj/ubah}(h]h ]h"]h$]h&]jjuh1j%hjl/hhhj~/hMQubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjh/hhhj~/hMQubah}(h]jc/ah ](jjeh"]h$]h&]jj)jhuh1jhj~/hMQhje/hhubj)}(hhh]h)}(hpin a highmem page into memoryh]hpin a highmem page into memory}(hj=0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMHhj:0hhubah}(h]h ]h"]h$]h&]uh1jhje/hhhj~/hMQubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjU0jjU0jjjuh1jhhhjhNhNubj)}(hX7**Parameters** ``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)}(hj_0h]h Parameters}(hja0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]0ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMLhjY0ubj)}(hhh]j)}(h:``struct page *page`` :c:type:`struct page ` to pin h](j)}(h``struct page *page``h]j)}(hj~0h]hstruct page *page}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|0ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMIhjx0ubj5)}(hhh]h)}(h#:c:type:`struct page ` to pinh](h)}(h:c:type:`struct page `h]j)}(hj0h]h struct page}(hj0hhhNhNubah}(h]h ](j.jhc-typeeh"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]refdocj. refdomainjhreftypetype refexplicitrefwarnjnj.j.pageuh1hhj0hMIhj0ubh to pin}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj0hMIhj0ubah}(h]h ]h"]h$]h&]uh1j4hjx0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMIhju0ubah}(h]h ]h"]h$]h&]uh1j hjY0ubh)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMKhjY0ubh)}(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.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMKhjY0ubh)}(h$This can be called from any context.h]h$This can be called from any context.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMOhjY0ubeh}(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 (struct page *page)h]j)}(h#void kunmap_high(struct page *page)h](j)}(hvoidh]hvoid}(hj,1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(1hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMgubj)}(h h]h }(hj;1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(1hhhj:1hMgubj)}(h kunmap_highh]j )}(h kunmap_highh]h kunmap_high}(hjM1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjI1ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj(1hhhj:1hMgubj&)}(h(struct page *page)h]j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hji1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hje1ubj)}(h h]h }(hjv1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje1ubh)}(hhh]j )}(hpageh]hpage}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj1ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj1modnameN classnameNjnjq)}jt]jw)}jjjO1sb c.kunmap_highasbuh1hhje1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje1ubj)}(hjh]h*}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje1ubj )}(hpageh]hpage}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hje1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hja1ubah}(h]h ]h"]h$]h&]jjuh1j%hj(1hhhj:1hMgubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj$1hhhj:1hMgubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj:1hMghj!1hhubj)}(hhh]h)}(h unmap a highmem page into memoryh]h unmap a highmem page into memory}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMahj1hhubah}(h]h ]h"]h$]h&]uh1jhj!1hhhj:1hMgubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj2jj2jjjuh1jhhhjhNhNubj)}(h**Parameters** ``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)}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 2ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMehj2ubj)}(hhh]j)}(h<``struct page *page`` :c:type:`struct page ` to unmap h](j)}(h``struct page *page``h]j)}(hj-2h]hstruct page *page}(hj/2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+2ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMbhj'2ubj5)}(hhh]h)}(h%:c:type:`struct page ` to unmaph](h)}(h:c:type:`struct page `h]j)}(hjL2h]h struct page}(hjN2hhhNhNubah}(h]h ](j.jhc-typeeh"]h$]h&]uh1jhjJ2ubah}(h]h ]h"]h$]h&]refdocj. refdomainjhreftypetype refexplicitrefwarnjnj.j.pageuh1hhjB2hMbhjF2ubh to unmap}(hjF2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjB2hMbhjC2ubah}(h]h ]h"]h$]h&]uh1j4hj'2ubeh}(h]h ]h"]h$]h&]uh1jhjB2hMbhj$2ubah}(h]h ]h"]h$]h&]uh1j hj2ubh)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMdhj2ubh)}(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.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMdhj2ubeh}(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}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhj2hMubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhj2hMubj)}(h page_addressh]j )}(h page_addressh]h page_address}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj2ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj2hhhj2hMubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hjxh]hconst}(hj3hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(h h]h }(hj#3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(hj5h]hstruct}(hj13hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj3ubj)}(h h]h }(hj>3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubh)}(hhh]j )}(hpageh]hpage}(hjO3hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjL3ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjQ3modnameN classnameNjnjq)}jt]jw)}jjj2sbc.page_addressasbuh1hhj3ubj)}(h h]h }(hjo3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hjh]h*}(hj}3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj )}(hpageh]hpage}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj3ubah}(h]h ]h"]h$]h&]jjuh1j%hj2hhhj2hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj2hhhj2hMubah}(h]j2ah ](jjeh"]h$]h&]jj)jhuh1jhj2hMhj2hhubj)}(hhh]h)}(h(get the mapped virtual address of a pageh]h(get the mapped virtual address of a page}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj3hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhj2hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj3jj3jjjuh1jhhhjhNhNubj)}(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)}(hj3h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj3ubj)}(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]j)}(hj3h]hconst struct page *page}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj3ubj5)}(hhh]h)}(h::c:type:`struct page ` to get the virtual address ofh](h)}(h:c:type:`struct page `h]j)}(hj4h]h struct page}(hj4hhhNhNubah}(h]h ](j.jhc-typeeh"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]refdocj. refdomainjhreftypetype refexplicitrefwarnjnj.j.pageuh1hhj 4hMhj4ubh to get the virtual address of}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj 4hMhj 4ubah}(h]h ]h"]h$]h&]uh1j4hj3ubeh}(h]h ]h"]h$]h&]uh1jhj 4hMhj3ubah}(h]h ]h"]h$]h&]uh1j hj3ubh)}(h**Description**h]j)}(hjO4h]h Description}(hjQ4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM4ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj3ubh)}(h#Returns the page's virtual address.h]h%Returns the page’s virtual address.}(hje4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj3ubeh}(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}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhj4hMubj)}(hset_page_addressh]j )}(hset_page_addressh]hset_page_address}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj4hhhj4hMubj&)}(h"(struct page *page, void *virtual)h](j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hj4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubh)}(hhh]j )}(hpageh]hpage}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj4modnameN classnameNjnjq)}jt]jw)}jjj4sbc.set_page_addressasbuh1hhj4ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj )}(hpageh]hpage}(hj*5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj4ubj,)}(h void *virtualh](j)}(hvoidh]hvoid}(hjC5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?5ubj)}(h h]h }(hjQ5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?5ubj)}(hjh]h*}(hj_5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?5ubj )}(hvirtualh]hvirtual}(hjl5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj?5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj4ubeh}(h]h ]h"]h$]h&]jjuh1j%hj4hhhj4hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj4hhhj4hMubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhj4hMhj4hhubj)}(hhh]h)}(hset a page's virtual addressh]hset a page’s virtual address}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj5hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj4hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj5jj5jjjuh1jhhhjhNhNubj)}(hw**Parameters** ``struct page *page`` :c:type:`struct page ` to set ``void *virtual`` virtual address to useh](h)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj5ubj)}(hhh](j)}(h:``struct page *page`` :c:type:`struct page ` to set h](j)}(h``struct page *page``h]j)}(hj5h]hstruct page *page}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj5ubj5)}(hhh]h)}(h#:c:type:`struct page ` to seth](h)}(h:c:type:`struct page `h]j)}(hj5h]h struct page}(hj5hhhNhNubah}(h]h ](j.jhc-typeeh"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]refdocj. refdomainjhreftypetype refexplicitrefwarnjnj.j.pageuh1hhj5hMhj5ubh to set}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1j4hj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMhj5ubj)}(h(``void *virtual`` virtual address to useh](j)}(h``void *virtual``h]j)}(hj/6h]h void *virtual}(hj16hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-6ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj)6ubj5)}(hhh]h)}(hvirtual address to useh]hvirtual address to use}(hjH6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhjE6ubah}(h]h ]h"]h$]h&]uh1j4hj)6ubeh}(h]h ]h"]h$]h&]uh1jhjD6hMhj5ubeh}(h]h ]h"]h$]h&]uh1j hj5ubeh}(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 )}(hj6h]h kunmap_atomic}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj6ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj6hhh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj6hhhj6hMubah}(h]j|6ah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhj~6hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj~6hhhj6hMubeh}(h]h ](jhmacroeh"]h$]h&]jjhjj6jj6jjjuh1jhhhjhNhNubh)}(h``kunmap_atomic (__addr)``h]j)}(hj6h]hkunmap_atomic (__addr)}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhM hjhhubh 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!}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhKhj6ubah}(h]h ]h"]h$]h&]uh1j6hj6hKhjhhubj)}(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)}(hj6h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhKhj6ubj)}(hhh]j)}(h*``__addr`` Virtual address to be unmapped h](j)}(h ``__addr``h]j)}(hj7h]h__addr}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhKhj7ubj5)}(hhh]h)}(hVirtual address to be unmappedh]hVirtual address to be unmapped}(hj.7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*7hKhj+7ubah}(h]h ]h"]h$]h&]uh1j4hj7ubeh}(h]h ]h"]h$]h&]uh1jhj*7hKhj 7ubah}(h]h ]h"]h$]h&]uh1j hj6ubh)}(h**Description**h]j)}(hjP7h]h Description}(hjR7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN7ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhKhj6ubh)}(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.}(hjf7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhKhj6ubh)}(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.}(hju7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhKhj6ubh)}(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}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubhX  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.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj6ubeh}(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 )}(hj7h]h kunmap_local}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj7ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj7hhh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMubah}(h]h ]h"]h$]h&]jjjuh1jjjhj7hhhj7hMubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1jhj7hMhj7hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj7hhhj7hMubeh}(h]h ](jhmacroeh"]h$]h&]jjhjj7jj7jjjuh1jhhhjhNhNubh)}(h``kunmap_local (__addr)``h]j)}(hj7h]hkunmap_local (__addr)}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjhhubj6)}(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().}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj 8ubah}(h]h ]h"]h$]h&]uh1j6hj8hMhjhhubj)}(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)}(hj,8h]h Parameters}(hj.8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*8ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj&8ubj)}(hhh]j)}(h-``__addr`` An address within the page mapped h](j)}(h ``__addr``h]j)}(hjK8h]h__addr}(hjM8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI8ubah}(h]h ]h"]h$]h&]uh1jh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhjE8ubj5)}(hhh]h)}(h!An address within the page mappedh]h!An address within the page mapped}(hjd8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`8hMhja8ubah}(h]h ]h"]h$]h&]uh1j4hjE8ubeh}(h]h ]h"]h$]h&]uh1jhj`8hMhjB8ubah}(h]h ]h"]h$]h&]uh1j hj&8ubh)}(h**Description**h]j)}(hj8h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj&8ubh)}(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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh can be any address within the mapped page. Commonly it is the address return from kmap_local_page(), but it can also include offsets.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj&8ubh)}(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.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/mm/highmem:213: ./include/linux/highmem-internal.hhMhj&8ubeh}(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_handlerj9error_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}(j8j8jjjhjj jjBjjdj8ju nametypes}(j8jjjjjj8uh}(j8hjhhjj j"jBjjdjjjjjjjjhjmj j j j j( j- jjj-j2jjjrjwjfjkjjjB jG j#j#j&j&jH)jM)j+j+j-j-jc/jh/j1j$1j2j2j4j4j|6j6j7j7hhjjj<j3j^jUjjwu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j9KsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.