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.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubhdesc_sig_punctuation)}(hjh]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(hkmaph]h desc_sig_name)}(hkmaph]hkmap}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1j hjubah}(h]h ](sig-namedescnameeh"]h$]h&]jjuh1jhjhhhjhKubhdesc_parameterlist)}(h(struct page *page)h]hdesc_parameter)}(hstruct page *pageh](hdesc_sig_keyword)}(hstructh]hstruct}(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%hjhhhjhKubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(hMap a page for long term usageh]hMap a page for long term usage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](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.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap (C function)c.kunmaphNtauh1jhjhhhNhNubj)}(hhh](j)}(h%void kunmap (const struct page *page)h]j)}(h$void kunmap(const struct page *page)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK(ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK(ubj)}(hkunmaph]j )}(hkunmaph]hkunmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjhhhjhK(ubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hconsth]hconst}(hj1hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj2)}(hj5h]hstruct}(hjMhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj-ubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j )}(hpageh]hpage}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmmodnameN classnameNjnjq)}jt]jw)}jjjsbc.kunmapasbuh1hhj-ubj)}(h h]h }(hjhhhNhNubah}(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&]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** ``const struct page *page`` Pointer to the page which was mapped by kmap() **Description** Counterpart to kmap(). A NOOP for CONFIG_HIGHMEM=n and for mappings of pages in the low memory area.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK,hjubj)}(hhh]j)}(hK``const struct page *page`` Pointer to the page which was mapped by kmap() h](j)}(h``const struct page *page``h]j)}(hjh]hconst struct 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)hj ubj5)}(hhh]h)}(h.Pointer to the page which was mapped by kmap()h]h.Pointer to the page which was mapped by kmap()}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hK)hj'ubah}(h]h ]h"]h$]h&]uh1j4hj ubeh}(h]h ]h"]h$]h&]uh1jhj&hK)hjubah}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjLh]h Description}(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.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.}(hjbhhhNhNubah}(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}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK1ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK1ubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jj kmap_to_pagesbc.kmap_to_pageasbuh1hhjhhhjhK1ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK1ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK1ubj)}(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&]jjuh1jhjhhhjhK1ubj&)}(h (void *addr)h]j,)}(h void *addrh](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj' hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(haddrh]haddr}(hj4 hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj ubah}(h]h ]h"]h$]h&]jjuh1j%hjhhhjhK1ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhK1ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhK1hjhhubj)}(hhh]h)}(h"Get the page for a kmap'ed addressh]h$Get the page for a kmap’ed address}(hj^ 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&]uh1jhjhhhjhK1ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjv jjv jjjuh1jhhhjhNhNubj)}(hj**Parameters** ``void *addr`` The address to look up **Return** The page which is mapped to **addr**.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK5hjz 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 hK2hj ubah}(h]h ]h"]h$]h&]uh1j hjz 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.hhK4hjz 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.hhK4hjz 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}(hj1 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK9ubj)}(h h]h }(hj@ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- hhhj? hK9ubj)}(hkmap_flush_unusedh]j )}(hkmap_flush_unusedh]hkmap_flush_unused}(hjR hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjN ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj- hhhj? hK9ubj&)}(h(void)h]j,)}(hvoidh]j)}(hvoidh]hvoid}(hjn hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj ubah}(h]h ]h"]h$]h&]noemphjjuh1j+hjf ubah}(h]h ]h"]h$]h&]jjuh1j%hj- hhhj? hK9ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj) hhhj? hK9ubah}(h]j$ ah ](jjeh"]h$]h&]jj)jhuh1jhj? hK9hj& hhubj)}(hhh]h)}(h@Flush all unused kmap mappings in order to remove stray mappingsh]h@Flush all unused kmap mappings in order to remove stray mappings}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK9hj hhubah}(h]h ]h"]h$]h&]uh1jhj& hhhj? hK9ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj jj jjjuh1jhhhjhNhNubj)}(h'**Parameters** ``void`` no argumentsh](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.hhK=hj ubj)}(hhh]j)}(h``void`` no argumentsh](j)}(h``void``h]j)}(hj h]hvoid}(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 no argumentsh]h no arguments}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj ubah}(h]h ]h"]h$]h&]uh1j4hj ubeh}(h]h ]h"]h$]h&]uh1jhj hK?hj ubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_local_page (C function)c.kmap_local_pagehNtauh1jhjhhhNhNubj)}(hhh](j)}(h0void * kmap_local_page (const struct page *page)h]j)}(h.void *kmap_local_page(const struct page *page)h](j)}(hvoidh]hvoid}(hj3 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK?ubj)}(h h]h }(hjB hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ hhhjA hK?ubj)}(hjh]h*}(hjP hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ hhhjA hK?ubj)}(hkmap_local_pageh]j )}(hkmap_local_pageh]hkmap_local_page}(hja hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj] ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj/ hhhjA hK?ubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hj3h]hconst}(hj} hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjy ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy ubj2)}(hj5h]hstruct}(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjy ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy 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)}jjjc sbc.kmap_local_pageasbuh1hhjy ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy ubj )}(hpageh]hpage}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjy ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hju ubah}(h]h ]h"]h$]h&]jjuh1j%hj/ hhhjA hK?ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+ hhhjA hK?ubah}(h]j& ah ](jjeh"]h$]h&]jj)jhuh1jhjA 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( hhhjA hK?ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj3 jj3 jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct page *page`` Pointer to the page to be mapped **Return** The virtual address of the mapping **Description** Can be invoked from any context, including interrupts. Requires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation: addr1 = kmap_local_page(page1); addr2 = kmap_local_page(page2); ... kunmap_local(addr2); kunmap_local(addr1); Unmapping addr1 before addr2 is invalid and causes malfunction. Contrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts. On CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. While kmap_local_page() is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity. On HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_page() can rely on this side effect.h](h)}(h**Parameters**h]j)}(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.hhKChj7 ubj)}(hhh]j)}(h=``const struct page *page`` Pointer to the page to be mapped h](j)}(h``const struct page *page``h]j)}(hj\ h]hconst struct page *page}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK@hjV ubj5)}(hhh]h)}(h Pointer to the page to be mappedh]h Pointer to the page to be mapped}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq hK@hjr ubah}(h]h ]h"]h$]h&]uh1j4hjV ubeh}(h]h ]h"]h$]h&]uh1jhjq hK@hjS ubah}(h]h ]h"]h$]h&]uh1j hj7 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.hhKBhj7 ubh)}(h"The virtual address of the mappingh]h"The virtual address of the mapping}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKBhj7 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.hhKDhj7 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.hhKChj7 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.hhKEhj7 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.hhKIhj7 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.hhKOhj7 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.hhKQhj7 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.hhKThj7 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.hhKXhj7 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[hj7 ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_local_folio (C function)c.kmap_local_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hBvoid * kmap_local_folio (const struct folio *folio, size_t offset)h]j)}(h@void *kmap_local_folio(const struct folio *folio, size_t offset)h](j)}(hvoidh]hvoid}(hjl hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKcubj)}(h h]h }(hj{ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh hhhjz hKcubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh hhhjz hKcubj)}(hkmap_local_folioh]j )}(hkmap_local_folioh]hkmap_local_folio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjh hhhjz hKcubj&)}(h*(const struct folio *folio, size_t offset)h](j,)}(hconst struct folio *folioh](j2)}(hj3h]hconst}(hj hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(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.kmap_local_folioasbuh1hhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjhhhNhNubah}(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 offseth](h)}(hhh]j )}(hsize_th]hsize_t}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjCubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjHmodnameN classnameNjnjq)}jt]j c.kmap_local_folioasbuh1hhj?ubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj )}(hoffseth]hoffset}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj ubeh}(h]h ]h"]h$]h&]jjuh1j%hjh hhhjz hKcubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjd hhhjz hKcubah}(h]j_ ah ](jjeh"]h$]h&]jj)jhuh1jhjz hKchja hhubj)}(hhh]h)}(h,Map a page in this folio for temporary usageh]h,Map a page in this folio for temporary usage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKchjhhubah}(h]h ]h"]h$]h&]uh1jhja hhhjz hKcubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio containing the page. ``size_t offset`` The byte offset within the folio which identifies the page. **Description** Requires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation:: addr1 = kmap_local_folio(folio1, offset1); addr2 = kmap_local_folio(folio2, offset2); ... kunmap_local(addr2); kunmap_local(addr1); Unmapping addr1 before addr2 is invalid and causes malfunction. Contrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts. On CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped. While it is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity. On HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_folio() can rely on this side effect. **Context** Can be invoked from any context. **Return** The virtual address of **offset**.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjubj)}(hhh](j)}(h=``const struct folio *folio`` The folio containing the page. h](j)}(h``const struct folio *folio``h]j)}(hjh]hconst struct 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.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hKehj,ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj+hKehjubeh}(h]h ]h"]h$]h&]uh1j hjubh)}(h**Description**h]j)}(hjQh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKghjubh)}(hRequires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation::h]hRequires careful handling when nesting multiple mappings because the map management is stack based. The unmap has to be in the reverse order of the map operation:}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKfhjubj)}(haddr1 = kmap_local_folio(folio1, offset1); addr2 = kmap_local_folio(folio2, offset2); ... kunmap_local(addr2); kunmap_local(addr1);h]haddr1 = kmap_local_folio(folio1, offset1); addr2 = kmap_local_folio(folio2, offset2); ... kunmap_local(addr2); kunmap_local(addr1);}hjvsbah}(h]h ]h"]h$]h&]jjuh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKjhjubh)}(h?Unmapping addr1 before addr2 is invalid and causes malfunction.h]h?Unmapping addr1 before addr2 is invalid and causes malfunction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKphjubh)}(hzContrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts.h]hzContrary to kmap() mappings the mapping is only valid in the context of the caller and cannot be handed to other contexts.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKrhjubh)}(hOn CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped.h]hOn CONFIG_HIGHMEM=n kernels and for low memory pages this returns the virtual address of the direct mapping. Only real highmem pages are temporarily mapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKuhjubh)}(hxWhile it is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity.h]hxWhile it is significantly faster than kmap() for the highmem case it comes with restrictions about the pointer validity.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKyhjubh)}(hOn HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_folio() can rely on this side effect.h]hOn HIGHMEM enabled systems mapping a highmem page has the side effect of disabling migration in order to keep the virtual address stable across preemption. No caller of kmap_local_folio() can rely on this side effect.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhK|hjubh)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h Can be invoked from any context.h]h Can be invoked from any context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(h **Return**h]j)}(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.hhKhjubh)}(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.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_atomic (C function) c.kmap_atomichNtauh1jhjhhhNhNubj)}(hhh](j)}(h,void * kmap_atomic (const struct page *page)h]j)}(h*void *kmap_atomic(const struct page *page)h](j)}(hvoidh]hvoid}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhj^hKubj)}(hjh]h*}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhj^hKubj)}(h kmap_atomich]j )}(h kmap_atomich]h kmap_atomic}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjzubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjLhhhj^hKubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hj3h]hconst}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjsb c.kmap_atomicasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubah}(h]h ]h"]h$]h&]jjuh1j%hjLhhhj^hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjHhhhj^hKubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1jhj^hKhjEhhubj)}(hhh]h)}(h7Atomically map a page for temporary usage - Deprecated!h]h7Atomically map a page for temporary usage - Deprecated!}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj5hhubah}(h]h ]h"]h$]h&]uh1jhjEhhhj^hKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjPjjPjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``const struct page *page`` Pointer to the page to be mapped **Return** The virtual address of the mapping **Description** In fact a wrapper around kmap_local_page() which also disables pagefaults and, depending on PREEMPT_RT configuration, also CPU migration and preemption. Therefore users should not count on the latter two side effects. Mappings should always be released by kunmap_atomic(). Do not use in new code. Use kmap_local_page() instead. It is used in atomic context when code wants to access the contents of a page that might be allocated from high memory (see __GFP_HIGHMEM), for example a page in the pagecache. The API has two functions, and they can be used in a manner similar to the following:: // Find the page of interest. struct page *page = find_get_page(mapping, offset); // Gain access to the contents of that page. void *vaddr = kmap_atomic(page); // Do something to the contents of that page. memset(vaddr, 0, PAGE_SIZE); // Unmap that page. kunmap_atomic(vaddr); Note that the kunmap_atomic() call takes the result of the kmap_atomic() call, not the argument. If you need to map two pages because you want to copy from one page to another you need to keep the kmap_atomic calls strictly nested, like: vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2); memcpy(vaddr1, vaddr2, PAGE_SIZE); kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);h](h)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubj)}(hhh]j)}(h=``const struct page *page`` Pointer to the page to be mapped h](j)}(h``const struct page *page``h]j)}(hjyh]hconst struct page *page}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjsubj5)}(hhh]h)}(h Pointer to the page to be mappedh]h Pointer to the page to be mapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hjsubeh}(h]h ]h"]h$]h&]uh1jhjhKhjpubah}(h]h ]h"]h$]h&]uh1j hjTubh)}(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.hhKhjTubh)}(h"The virtual address of the mappingh]h"The virtual address of the mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubh)}(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.hhKhjTubh)}(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.hhKhjTubh)}(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.hhKhjTubh)}(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.hhKhjTubh)}(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.hhKhjTubj)}(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);}hj-sbah}(h]h ]h"]h$]h&]jjuh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubh)}(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.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubh)}(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:}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubh)}(h9vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2);h]h9vaddr1 = kmap_atomic(page1); vaddr2 = kmap_atomic(page2);}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubh)}(h"memcpy(vaddr1, vaddr2, PAGE_SIZE);h]h"memcpy(vaddr1, vaddr2, PAGE_SIZE);}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubh)}(h-kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);h]h-kunmap_atomic(vaddr2); kunmap_atomic(vaddr1);}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jclear_user_page (C function)c.clear_user_pagehNtauh1jhjhhhNhNubj)}(hhh](j)}(hIvoid clear_user_page (void *addr, unsigned long vaddr, struct page *page)h]j)}(hHvoid clear_user_page(void *addr, unsigned long vaddr, struct page *page)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hclear_user_pageh]j )}(hclear_user_pageh]hclear_user_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjhhhjhKubj&)}(h4(void *addr, unsigned long vaddr, struct page *page)h](j,)}(h void *addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(haddrh]haddr}(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 }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hlongh]hlong}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hjPhhhNhNubah}(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+hjubj,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hjwhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjsbc.clear_user_pageasbuh1hhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hjhhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h'clear a page to be mapped to user spaceh]h'clear a page to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void *addr`` the address of the page ``unsigned long vaddr`` the address of the user mapping ``struct page *page`` the page **Description** We condition the definition of clear_user_page() on the architecture not having a custom clear_user_highpage(). That's because if there is some special flushing needed for clear_user_highpage() then it is likely that clear_user_page() also needs some magic. And, since our only caller is the generic clear_user_highpage(), not defining is not much of a loss.h](h)}(h**Parameters**h]j)}(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)}(h'``void *addr`` the address of the page h](j)}(h``void *addr``h]j)}(hj;h]h void *addr}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhj5ubj5)}(hhh]h)}(hthe address of the pageh]hthe address of the page}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhKhjQubah}(h]h ]h"]h$]h&]uh1j4hj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhKhj2ubj)}(h8``unsigned long vaddr`` the address of the user mapping h](j)}(h``unsigned long vaddr``h]j)}(hjth]hunsigned long vaddr}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjnubj5)}(hhh]h)}(hthe address of the user mappingh]hthe address of the user mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hjnubeh}(h]h ]h"]h$]h&]uh1jhjhKhj2ubj)}(h``struct page *page`` the page 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.hhKhjubj5)}(hhh]h)}(hthe pageh]hthe page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj2ubeh}(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.hhKhjubh)}(hXfWe condition the definition of clear_user_page() on the architecture not having a custom clear_user_highpage(). That's because if there is some special flushing needed for clear_user_highpage() then it is likely that clear_user_page() also needs some magic. And, since our only caller is the generic clear_user_highpage(), not defining is not much of a loss.h]hXhWe condition the definition of clear_user_page() on the architecture not having a custom clear_user_highpage(). That’s because if there is some special flushing needed for clear_user_highpage() then it is likely that clear_user_page() also needs some magic. And, since our only caller is the generic clear_user_highpage(), not defining is not much of a loss.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jclear_user_pages (C function)c.clear_user_pageshNtauh1jhjhhhNhNubj)}(hhh](j)}(h_void clear_user_pages (void *addr, unsigned long vaddr, struct page *page, unsigned int npages)h]j)}(h^void clear_user_pages(void *addr, unsigned long vaddr, struct page *page, unsigned int npages)h](j)}(hvoidh]hvoid}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhj;hKubj)}(hclear_user_pagesh]j )}(hclear_user_pagesh]hclear_user_pages}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjJubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj)hhhj;hKubj&)}(hI(void *addr, unsigned long vaddr, struct page *page, unsigned int npages)h](j,)}(h void *addrh](j)}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj )}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjfubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjbubj,)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hvaddrh]hvaddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjbubj,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjPsbc.clear_user_pagesasbuh1hhjubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hpageh]hpage}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjbubj,)}(hunsigned int npagesh](j)}(hunsignedh]hunsigned}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj )}(hnpagesh]hnpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjbubeh}(h]h ]h"]h$]h&]jjuh1j%hj)hhhj;hKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj%hhhj;hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj;hKhj"hhubj)}(hhh]h)}(h-clear a page range to be mapped to user spaceh]h-clear a page range to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj;hKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``void *addr`` start address ``unsigned long vaddr`` start address of the user mapping ``struct page *page`` start page ``unsigned int npages`` number of pages **Description** Assumes that the region (**addr**, +**npages**) has been validated already so this does no exception handling. If the architecture provides a clear_user_page(), use that; otherwise, we can safely use clear_pages().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(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)}(h``void *addr`` start address h](j)}(h``void *addr``h]j)}(hjh]h void *addr}(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.hhKhj ubj5)}(hhh]h)}(h start addressh]h start address}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hKhj(ubah}(h]h ]h"]h$]h&]uh1j4hj ubeh}(h]h ]h"]h$]h&]uh1jhj'hKhj ubj)}(h:``unsigned long vaddr`` start address of the user mapping h](j)}(h``unsigned long vaddr``h]j)}(hjKh]hunsigned long vaddr}(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.hhKhjEubj5)}(hhh]h)}(h!start address of the user mappingh]h!start address of the user mapping}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hKhjaubah}(h]h ]h"]h$]h&]uh1j4hjEubeh}(h]h ]h"]h$]h&]uh1jhj`hKhj ubj)}(h!``struct page *page`` start page 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.hhKhj~ubj5)}(hhh]h)}(h start pageh]h start page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hj~ubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubj)}(h(``unsigned int npages`` number of pages h](j)}(h``unsigned int npages``h]j)}(hjh]hunsigned int npages}(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)}(hnumber of pagesh]hnumber of pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubeh}(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.hhKhjubh)}(hnAssumes that the region (**addr**, +**npages**) has been validated already so this does no exception handling.h](hAssumes that the region (}(hjhhhNhNubj)}(h**addr**h]haddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhM, +**npages**) has been validated already so this does no exception handling.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjubh)}(hgIf the architecture provides a clear_user_page(), use that; otherwise, we can safely use clear_pages().h]hgIf the architecture provides a clear_user_page(), use that; otherwise, we can safely use clear_pages().}(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 clear_user_highpage (C function)c.clear_user_highpagehNtauh1jhjhhhNhNubj)}(hhh](j)}(hAvoid clear_user_highpage (struct page *page, unsigned long vaddr)h]j)}(h@void clear_user_highpage(struct page *page, unsigned long vaddr)h](j)}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjlhKubj)}(hclear_user_highpageh]j )}(hclear_user_highpageh]hclear_user_highpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj{ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjZhhhjlhKubj&)}(h((struct page *page, unsigned long vaddr)h](j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjsbc.clear_user_highpageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hpageh]hpage}(hjhhhNhNubah}(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 }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj )}(hvaddrh]hvaddr}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hjZhhhjlhKubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjVhhhjlhKubah}(h]jQah ](jjeh"]h$]h&]jj)jhuh1jhjlhKhjShhubj)}(hhh]h)}(h'clear a page to be mapped to user spaceh]h'clear a page to be mapped to user space}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhKhjlhhubah}(h]h ]h"]h$]h&]uh1jhjShhhjlhKubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct page *page`` start page ``unsigned long vaddr`` start address of the user mapping **Description** With !CONFIG_HIGHMEM this (and the copy_user_highpage() below) will be plain clear_user_page() (and copy_user_page()).h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj)}(hhh](j)}(h!``struct page *page`` start page h](j)}(h``struct page *page``h]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.hhMhjubj5)}(hhh]h)}(h start pageh]h start page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h:``unsigned long vaddr`` start address of the user mapping 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.hhMhjubj5)}(hhh]h)}(h!start address of the user mappingh]h!start address of the user mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(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.hhMhjubh)}(hvWith !CONFIG_HIGHMEM this (and the copy_user_highpage() below) will be plain clear_user_page() (and copy_user_page()).h]hvWith !CONFIG_HIGHMEM this (and the copy_user_highpage() below) will be plain clear_user_page() (and copy_user_page()).}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!clear_user_highpages (C function)c.clear_user_highpageshNtauh1jhjhhhNhNubj)}(hhh](j)}(hWvoid clear_user_highpages (struct page *page, unsigned long vaddr, unsigned int npages)h]j)}(hVvoid clear_user_highpages(struct page *page, unsigned long vaddr, unsigned int npages)h](j)}(hvoidh]hvoid}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhjwhMubj)}(hclear_user_highpagesh]j )}(hclear_user_highpagesh]hclear_user_highpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjehhhjwhMubj&)}(h=(struct page *page, unsigned long vaddr, unsigned int npages)h](j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjmodnameN classnameNjnjq)}jt]jw)}jjjsbc.clear_user_highpagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hvaddrh]hvaddr}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(hunsigned int npagesh](j)}(hunsignedh]hunsigned}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj )}(hnpagesh]hnpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjeubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hjehhhjwhMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjahhhjwhMubah}(h]j\ah ](jjeh"]h$]h&]jj)jhuh1jhjwhMhj^hhubj)}(hhh]h)}(h-clear a page range to be mapped to user spaceh]h-clear a page range to be mapped to user space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj^hhhjwhMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjjjjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct page *page`` start page ``unsigned long vaddr`` start address of the user mapping ``unsigned int npages`` number of pages **Description** Assumes that all the pages in the region (**page**, +**npages**) are valid so this does no exception handling.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubj)}(hhh](j)}(h!``struct page *page`` start page h](j)}(h``struct page *page``h]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.hhMhjubj5)}(hhh]h)}(h start pageh]h start page}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMhj"ubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhj!hMhjubj)}(h:``unsigned long vaddr`` start address of the user mapping h](j)}(h``unsigned long vaddr``h]j)}(hjEh]hunsigned long vaddr}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj?ubj5)}(hhh]h)}(h!start address of the user mappingh]h!start address of the user mapping}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhMhj[ubah}(h]h ]h"]h$]h&]uh1j4hj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhMhjubj)}(h(``unsigned int npages`` number of pages h](j)}(h``unsigned int npages``h]j)}(hj~h]hunsigned int npages}(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.hhMhjxubj5)}(hhh]h)}(hnumber of pagesh]hnumber of pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1j4hjxubeh}(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)}(hnAssumes that all the pages in the region (**page**, +**npages**) are valid so this does no exception handling.h](h*Assumes that all the pages in the region (}(hjhhhNhNubj)}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh<, +**npages**) are valid so this does no exception handling.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+vma_alloc_zeroed_movable_folio (C function) c.vma_alloc_zeroed_movable_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(h_struct folio * vma_alloc_zeroed_movable_folio (struct vm_area_struct *vma, unsigned long vaddr)h]j)}(h]struct folio *vma_alloc_zeroed_movable_folio(struct vm_area_struct *vma, unsigned long vaddr)h](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM4ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhM4ubh)}(hhh]j )}(hfolioh]hfolio}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj,ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj1modnameN classnameNjnjq)}jt]jw)}jjvma_alloc_zeroed_movable_foliosb c.vma_alloc_zeroed_movable_folioasbuh1hhj hhhjhM4ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhM4ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhM4ubj)}(hvma_alloc_zeroed_movable_folioh]j )}(hjMh]hvma_alloc_zeroed_movable_folio}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjkubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj hhhjhM4ubj&)}(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]jK 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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(hunsigned long vaddrh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hvaddrh]hvaddr}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hj hhhjhM4ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjhhhjhM4ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhM4hjhhubj)}(hhh]h)}(h!Allocate a zeroed page for a VMA.h]h!Allocate a zeroed page for a VMA.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM4hjYhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM4ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjtjjtjjjuh1jhhhjhNhNubj)}(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)}(hj~h]h Parameters}(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.hhM8hjxubj)}(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.hhM5hjubj5)}(hhh]h)}(h(The VMA the page is to be allocated for.h]h(The VMA the page is to be allocated for.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM5hjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhM5hjubj)}(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.hhM6hjubj5)}(hhh]h)}(h3The virtual address the page will be inserted into.h]h3The virtual address the page will be inserted into.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM6hjubah}(h]h ]h"]h$]h&]uh1j4hjubeh}(h]h ]h"]h$]h&]uh1jhjhM6hjubeh}(h]h ]h"]h$]h&]uh1j hjxubh)}(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.hhM8hjxubh)}(hThis function will allocate a page suitable for inserting into this VMA at this virtual address. It may be allocated from highmem or the movable zone. An architecture may provide its own implementation.h]hThis function will allocate a page suitable for inserting into this VMA at this virtual address. It may be allocated from highmem or the movable zone. An architecture may provide its own implementation.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM7hjxubh)}(h **Return**h]j)}(hj8h]hReturn}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM;hjxubh)}(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.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM<hjxubeh}(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}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM8ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhM8ubj)}(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&]jjuh1jhjyhhhjhM8ubj&)}(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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hjhhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(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)}jjjsbc.memcpy_from_folioasbuh1hhjubj)}(h h]h }(hj: hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjH hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj )}(hfolioh]hfolio}(hjU hhhNhNubah}(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}(hjq hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjn ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjs modnameN classnameNjnjq)}jt]j6 c.memcpy_from_folioasbuh1hhjj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj ubj )}(hoffseth]hoffset}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjubj,)}(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]j6 c.memcpy_from_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+hjubeh}(h]h ]h"]h$]h&]jjuh1j%hjyhhhjhM8ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjuhhhjhM8ubah}(h]jpah ](jjeh"]h$]h&]jj)jhuh1jhjhM8hjrhhubj)}(hhh]h)}(h#Copy a range of bytes from a folio.h]h#Copy a range of bytes from a folio.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM8hj !hhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhM8ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj'!jj'!jjjuh1jhhhjhNhNubj)}(h**Parameters** ``char *to`` The memory to copy to. ``struct folio *folio`` The folio to read from. ``size_t offset`` The first byte in the folio to read. ``size_t len`` The number of bytes to copy.h](h)}(h**Parameters**h]j)}(hj1!h]h Parameters}(hj3!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<hj+!ubj)}(hhh](j)}(h$``char *to`` The memory to copy to. h](j)}(h ``char *to``h]j)}(hjP!h]hchar *to}(hjR!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN!ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM9hjJ!ubj5)}(hhh]h)}(hThe memory to copy to.h]hThe memory to copy to.}(hji!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhje!hM9hjf!ubah}(h]h ]h"]h$]h&]uh1j4hjJ!ubeh}(h]h ]h"]h$]h&]uh1jhje!hM9hjG!ubj)}(h0``struct folio *folio`` The folio to read from. 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.hhM:hj!ubj5)}(hhh]h)}(hThe folio to read from.h]hThe folio to read from.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hM:hj!ubah}(h]h ]h"]h$]h&]uh1j4hj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hM:hjG!ubj)}(h7``size_t offset`` The first byte in the folio to read. h](j)}(h``size_t offset``h]j)}(hj!h]h size_t offset}(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.hhM;hj!ubj5)}(hhh]h)}(h$The first byte in the folio to read.h]h$The first byte in the folio to read.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hM;hj!ubah}(h]h ]h"]h$]h&]uh1j4hj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hM;hjG!ubj)}(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.hhM=hj!ubj5)}(hhh]h)}(hThe number of bytes to copy.h]hThe number of bytes to copy.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM<hj"ubah}(h]h ]h"]h$]h&]uh1j4hj!ubeh}(h]h ]h"]h$]h&]uh1jhj"hM=hjG!ubeh}(h]h ]h"]h$]h&]uh1j hj+!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jmemcpy_to_folio (C function)c.memcpy_to_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hWvoid memcpy_to_folio (struct folio *folio, size_t offset, const char *from, size_t len)h]j)}(hVvoid memcpy_to_folio(struct folio *folio, size_t offset, const char *from, size_t len)h](j)}(hvoidh]hvoid}(hjU"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ"hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMTubj)}(h h]h }(hjd"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ"hhhjc"hMTubj)}(hmemcpy_to_folioh]j )}(hmemcpy_to_folioh]hmemcpy_to_folio}(hjv"hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjr"ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjQ"hhhjc"hMTubj&)}(hB(struct folio *folio, size_t offset, const char *from, size_t len)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.memcpy_to_folioasbuh1hhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jDhj"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 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.memcpy_to_folioasbuh1hhj#ubj)}(h h]h }(hj%#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj )}(hoffseth]hoffset}(hj3#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj"ubj,)}(hconst char *fromh](j2)}(hj3h]hconst}(hjL#hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjH#ubj)}(h h]h }(hjY#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH#ubj)}(hcharh]hchar}(hjg#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH#ubj)}(h h]h }(hju#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH#ubj )}(hfromh]hfrom}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjH#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]j"c.memcpy_to_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%hjQ"hhhjc"hMTubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjM"hhhjc"hMTubah}(h]jH"ah ](jjeh"]h$]h&]jj)jhuh1jhjc"hMThjJ"hhubj)}(hhh]h)}(h!Copy a range of bytes to a folio.h]h!Copy a range of bytes to a folio.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMThj#hhubah}(h]h ]h"]h$]h&]uh1jhjJ"hhhjc"hMTubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj$jj$jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio to write to. ``size_t offset`` The first byte in the folio to store to. ``const char *from`` The memory to copy from. ``size_t len`` The number of bytes to copy.h](h)}(h**Parameters**h]j)}(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.hhMXhj$ubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hjC$h]hstruct folio *folio}(hjE$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA$ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMUhj=$ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj\$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX$hMUhjY$ubah}(h]h ]h"]h$]h&]uh1j4hj=$ubeh}(h]h ]h"]h$]h&]uh1jhjX$hMUhj:$ubj)}(h;``size_t offset`` The first byte in the folio to store to. h](j)}(h``size_t offset``h]j)}(hj|$h]h size_t offset}(hj~$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz$ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMVhjv$ubj5)}(hhh]h)}(h(The first byte in the folio to store to.h]h(The first byte in the folio to store to.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMVhj$ubah}(h]h ]h"]h$]h&]uh1j4hjv$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMVhj:$ubj)}(h.``const char *from`` The memory to copy from. h](j)}(h``const char *from``h]j)}(hj$h]hconst char *from}(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)}(hThe memory to copy from.h]hThe memory to copy from.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMWhj$ubah}(h]h ]h"]h$]h&]uh1j4hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMWhj:$ubj)}(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.hhMYhj$ubj5)}(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.hhMXhj%ubah}(h]h ]h"]h$]h&]uh1j4hj$ubeh}(h]h ]h"]h$]h&]uh1jhj%hMYhj:$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_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}(hjH%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD%hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMrubj)}(h h]h }(hjW%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD%hhhjV%hMrubj)}(hjh]h*}(hje%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD%hhhjV%hMrubj)}(hfolio_zero_tailh]j )}(hfolio_zero_tailh]hfolio_zero_tail}(hjv%hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjr%ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjD%hhhjV%hMrubj&)}(h1(struct folio *folio, size_t offset, void *kaddr)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_tailasbuh1hhj%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 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.folio_zero_tailasbuh1hhj&ubj)}(h h]h }(hj%&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj )}(hoffseth]hoffset}(hj3&hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj%ubj,)}(h void *kaddrh](j)}(hvoidh]hvoid}(hjL&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH&ubj)}(h h]h }(hjZ&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH&ubj)}(hjh]h*}(hjh&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjH&ubj )}(hkaddrh]hkaddr}(hju&hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjH&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj%ubeh}(h]h ]h"]h$]h&]jjuh1j%hjD%hhhjV%hMrubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj@%hhhjV%hMrubah}(h]j;%ah ](jjeh"]h$]h&]jj)jhuh1jhjV%hMrhj=%hhubj)}(hhh]h)}(hZero the tail of a folio.h]hZero the tail of a folio.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMrhj&hhubah}(h]h ]h"]h$]h&]uh1jhj=%hhhjV%hMrubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj&jj&jjjuh1jhhhjhNhNubj)}(hXX**Parameters** ``struct folio *folio`` The folio to zero. ``size_t offset`` The byte offset in the folio to start zeroing at. ``void *kaddr`` The address the folio is currently mapped to. **Description** If you have already used kmap_local_folio() to map a folio, written some data to it and now need to zero the end of the folio (and flush the dcache), you can use this function. If you do not have the folio kmapped (eg the folio has been partially populated by DMA), use folio_zero_range() or folio_zero_segment() instead. **Return** An address which can be passed to kunmap_local().h](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMvhj&ubj)}(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.hhMshj&ubj5)}(hhh]h)}(hThe folio to zero.h]hThe folio to zero.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMshj&ubah}(h]h ]h"]h$]h&]uh1j4hj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMshj&ubj)}(hD``size_t offset`` The byte offset in the folio to start zeroing at. h](j)}(h``size_t offset``h]j)}(hj'h]h size_t offset}(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)}(h1The byte offset in the folio to start zeroing at.h]h1The byte offset in the folio to start zeroing at.}(hj2'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>``void *kaddr`` The address the folio is currently mapped to. h](j)}(h``void *kaddr``h]j)}(hjR'h]h void *kaddr}(hjT'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP'ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMuhjL'ubj5)}(hhh]h)}(h-The address the folio is currently mapped to.h]h-The address the folio is currently mapped to.}(hjk'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg'hMuhjh'ubah}(h]h ]h"]h$]h&]uh1j4hjL'ubeh}(h]h ]h"]h$]h&]uh1jhjg'hMuhj&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.hhMwhj&ubh)}(hXBIf you have already used kmap_local_folio() to map a folio, written some data to it and now need to zero the end of the folio (and flush the dcache), you can use this function. If you do not have the folio kmapped (eg the folio has been partially populated by DMA), use folio_zero_range() or folio_zero_segment() instead.h]hXBIf you have already used kmap_local_folio() to map a folio, written some data to it and now need to zero the end of the folio (and flush the dcache), you can use this function. If you do not have the folio kmapped (eg the folio has been partially populated by DMA), use folio_zero_range() or folio_zero_segment() instead.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMvhj&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.hhM|hj&ubh)}(h1An address which can be passed to kunmap_local().h]h1An address which can be passed to kunmap_local().}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhM}hj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_fill_tail (C function)c.folio_fill_tailhNtauh1jhjhhhNhNubj)}(hhh](j)}(hWvoid folio_fill_tail (struct folio *folio, size_t offset, const char *from, size_t len)h]j)}(hVvoid folio_fill_tail(struct folio *folio, size_t offset, const char *from, size_t len)h](j)}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj(hMubj)}(hfolio_fill_tailh]j )}(hfolio_fill_tailh]hfolio_fill_tail}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj(ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj'hhhj(hMubj&)}(hB(struct folio *folio, size_t offset, const char *from, size_t len)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj6(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2(ubj)}(h h]h }(hjC(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2(ubh)}(hhh]j )}(hfolioh]hfolio}(hjT(hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjQ(ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjV(modnameN classnameNjnjq)}jt]jw)}jjj(sbc.folio_fill_tailasbuh1hhj2(ubj)}(h h]h }(hjt(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2(ubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2(ubj )}(hfolioh]hfolio}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj2(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj.(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]jp(c.folio_fill_tailasbuh1hhj(ubj)}(h h]h }(hj(hhhNhNubah}(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+hj.(ubj,)}(hconst char *fromh](j2)}(hj3h]hconst}(hj(hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hcharh]hchar}(hj )hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hjh]h*}(hj')hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj )}(hfromh]hfrom}(hj4)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj.(ubj,)}(h size_t lenh](h)}(hhh]j )}(hsize_th]hsize_t}(hjP)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjM)ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjR)modnameN classnameNjnjq)}jt]jp(c.folio_fill_tailasbuh1hhjI)ubj)}(h h]h }(hjn)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI)ubj )}(hlenh]hlen}(hj|)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjI)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.Copy some data to a folio and pad with zeroes.h]h.Copy some data to a folio and pad with zeroes.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj(hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj)jj)jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The destination folio. ``size_t offset`` The offset into **folio** at which to start copying. ``const char *from`` The data to copy. ``size_t len`` How many bytes of data to copy. **Description** This function is most useful for filesystems which support inline data. When they want to copy data from the inode into the page cache, this function does everything for them. It supports large folios even on HIGHMEM configurations.h](h)}(h**Parameters**h]j)}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]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 destination folio. 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 destination folio.h]hThe destination folio.}(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)}(hG``size_t offset`` The offset into **folio** at which to start copying. h](j)}(h``size_t offset``h]j)}(hj *h]h size_t offset}(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)}(h4The offset into **folio** at which to start copying.h](hThe offset into }(hj9*hhhNhNubj)}(h **folio**h]hfolio}(hjA*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9*ubh at which to start copying.}(hj9*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj5*hMhj6*ubah}(h]h ]h"]h$]h&]uh1j4hj*ubeh}(h]h ]h"]h$]h&]uh1jhj5*hMhj)ubj)}(h'``const char *from`` The data to copy. h](j)}(h``const char *from``h]j)}(hjk*h]hconst char *from}(hjm*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji*ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhje*ubj5)}(hhh]h)}(hThe data to copy.h]hThe data to copy.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j4hje*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj)ubj)}(h/``size_t len`` How many bytes of data 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.hhMhj*ubj5)}(hhh]h)}(hHow many bytes of data to copy.h]hHow many bytes of data to copy.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1j4hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj)ubeh}(h]h ]h"]h$]h&]uh1j hj)ubh)}(h**Description**h]j)}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)ubh)}(hThis function is most useful for filesystems which support inline data. When they want to copy data from the inode into the page cache, this function does everything for them. It supports large folios even on HIGHMEM configurations.h]hThis function is most useful for filesystems which support inline data. When they want to copy data from the inode into the page cache, this function does everything for them. It supports large folios even on HIGHMEM configurations.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#memcpy_from_file_folio (C function)c.memcpy_from_file_foliohNtauh1jhjhhhNhNubj)}(hhh](j)}(hUsize_t memcpy_from_file_folio (char *to, struct folio *folio, loff_t pos, size_t len)h]j)}(hTsize_t memcpy_from_file_folio(char *to, struct folio *folio, loff_t pos, size_t len)h](h)}(hhh]j )}(hsize_th]hsize_t}(hj'+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj$+ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj)+modnameN classnameNjnjq)}jt]jw)}jjmemcpy_from_file_foliosbc.memcpy_from_file_folioasbuh1hhj +hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hjI+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj +hhhjH+hMubj)}(hmemcpy_from_file_folioh]j )}(hjE+h]hmemcpy_from_file_folio}(hj[+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjW+ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj +hhhjH+hMubj&)}(h7(char *to, struct folio *folio, loff_t pos, size_t len)h](j,)}(hchar *toh](j)}(hcharh]hchar}(hjv+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr+ubj)}(hjh]h*}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr+ubj )}(htoh]hto}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjr+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjn+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]jC+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+hjn+ubj,)}(h loff_t posh](h)}(hhh]j )}(hloff_th]hloff_t}(hj+,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj(,ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj-,modnameN classnameNjnjq)}jt]jC+c.memcpy_from_file_folioasbuh1hhj$,ubj)}(h h]h }(hjI,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$,ubj )}(hposh]hpos}(hjW,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj$,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjn+ubj,)}(h size_t lenh](h)}(hhh]j )}(hsize_th]hsize_t}(hjs,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjp,ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetju,modnameN classnameNjnjq)}jt]jC+c.memcpy_from_file_folioasbuh1hhjl,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl,ubj )}(hlenh]hlen}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjl,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjn+ubeh}(h]h ]h"]h$]h&]jjuh1j%hj +hhhjH+hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj+hhhjH+hMubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1jhjH+hMhj+hhubj)}(hhh]h)}(h"Copy some bytes from a file folio.h]h"Copy some bytes from a file folio.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhjH+hMubeh}(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.hhMhj,ubj)}(hhh](j)}(h%``char *to`` The destination buffer. h](j)}(h ``char *to``h]j)}(hj -h]hchar *to}(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 destination buffer.h]hThe destination buffer.}(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)}(h0``struct folio *folio`` The folio to copy from. h](j)}(h``struct folio *folio``h]j)}(hjC-h]hstruct folio *folio}(hjE-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA-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 copy from.h]hThe folio to copy from.}(hj\-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjX-hMhjY-ubah}(h]h ]h"]h$]h&]uh1j4hj=-ubeh}(h]h ]h"]h$]h&]uh1jhjX-hMhj-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&]uh1jhjz-ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjv-ubj5)}(hhh]h)}(hThe position in the file.h]hThe position in the file.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1j4hjv-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj-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.hhMhj-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-hMhj-ubah}(h]h ]h"]h$]h&]uh1j4hj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj-ubeh}(h]h ]h"]h$]h&]uh1j hj,ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(hCopy up to **len** bytes from this folio. This may be limited by PAGE_SIZE if the folio comes from HIGHMEM, and by the size of the folio.h](h Copy up to }(hj.hhhNhNubj)}(h**len**h]hlen}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubhx bytes from this folio. This may be limited by PAGE_SIZE if the folio comes from HIGHMEM, and by the size of the folio.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(h **Return**h]j)}(hj).h]hReturn}(hj+.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'.ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubh)}(h*The number of bytes copied from the folio.h]h*The number of bytes copied from the folio.}(hj?.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j 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}(hjn.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj.hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj}.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj.hhhj|.hMubj)}(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&]jjuh1jhjj.hhhj|.hMubj&)}(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}(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 )}(hstart1h]hstart1}(hjL/hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj.ubj,)}(h size_t xend1h](h)}(hhh]j )}(hsize_th]hsize_t}(hjh/hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hje/ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetjj/modnameN classnameNjnjq)}jt]j.c.folio_zero_segmentsasbuh1hhja/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja/ubj )}(hxend1h]hxend1}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hja/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 }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj )}(hxend2h]hxend2}(hj$0hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj.ubeh}(h]h ]h"]h$]h&]jjuh1j%hjj.hhhj|.hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhjf.hhhj|.hMubah}(h]ja.ah ](jjeh"]h$]h&]jj)jhuh1jhj|.hMhjc.hhubj)}(hhh]h)}(h Zero two byte ranges in a folio.h]h Zero two byte ranges in a folio.}(hjN0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjK0hhubah}(h]h ]h"]h$]h&]uh1jhjc.hhhj|.hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjf0jjf0jjjuh1jhhhjhNhNubj)}(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)}(hjp0h]h Parameters}(hjr0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn0ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjj0ubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hj0h]hstruct folio *folio}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj0ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1j4hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj0ubj)}(h*``size_t start1`` The first byte to zero. h](j)}(h``size_t start1``h]j)}(hj0h]h size_t start1}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj0ubj5)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hMhj0ubah}(h]h ]h"]h$]h&]uh1j4hj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMhj0ubj)}(hA``size_t xend1`` One more than the last byte in the first range. h](j)}(h``size_t xend1``h]j)}(hj1h]h size_t xend1}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj0ubj5)}(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.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1j4hj0ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhj0ubj)}(h>``size_t start2`` The first byte to zero in the second range. h](j)}(h``size_t start2``h]j)}(hj:1h]h size_t start2}(hj<1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj81ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj41ubj5)}(hhh]h)}(h+The first byte to zero in the second range.h]h+The first byte to zero in the second range.}(hjS1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjO1hMhjP1ubah}(h]h ]h"]h$]h&]uh1j4hj41ubeh}(h]h ]h"]h$]h&]uh1jhjO1hMhj0ubj)}(hA``size_t xend2`` One more than the last byte in the second range.h](j)}(h``size_t xend2``h]j)}(hjs1h]h size_t xend2}(hju1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq1ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjm1ubj5)}(hhh]h)}(h0One more than the last byte in the second range.h]h0One more than the last byte in the second range.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj1ubah}(h]h ]h"]h$]h&]uh1j4hjm1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhj0ubeh}(h]h ]h"]h$]h&]uh1j hjj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_zero_segment (C function)c.folio_zero_segmenthNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid folio_zero_segment (struct folio *folio, size_t start, size_t xend)h]j)}(hGvoid folio_zero_segment(struct folio *folio, size_t start, size_t xend)h](j)}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhj1hMubj)}(hfolio_zero_segmenth]j )}(hfolio_zero_segmenth]hfolio_zero_segment}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj1ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj1hhhj1hMubj&)}(h0(struct folio *folio, size_t start, size_t xend)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj 2hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubh)}(hhh]j )}(hfolioh]hfolio}(hj(2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj%2ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj*2modnameN classnameNjnjq)}jt]jw)}jjj1sbc.folio_zero_segmentasbuh1hhj2ubj)}(h h]h }(hjH2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hjh]h*}(hjV2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj )}(hfolioh]hfolio}(hjc2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj2ubj,)}(h size_t starth](h)}(hhh]j )}(hsize_th]hsize_t}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj|2ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj2modnameN classnameNjnjq)}jt]jD2c.folio_zero_segmentasbuh1hhjx2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx2ubj )}(hstarth]hstart}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjx2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj2ubj,)}(h size_t xendh](h)}(hhh]j )}(hsize_th]hsize_t}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj2ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj2modnameN classnameNjnjq)}jt]jD2c.folio_zero_segmentasbuh1hhj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj )}(hxendh]hxend}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj2ubeh}(h]h ]h"]h$]h&]jjuh1j%hj1hhhj1hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj1hhhj1hMubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1jhj1hMhj1hhubj)}(hhh]h)}(hZero a byte range in a folio.h]hZero a byte range in a folio.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj53jj53jjjuh1jhhhjhNhNubj)}(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)}(hj?3h]h Parameters}(hjA3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=3ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj93ubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hj^3h]hstruct folio *folio}(hj`3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\3ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjX3ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hjw3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs3hMhjt3ubah}(h]h ]h"]h$]h&]uh1j4hjX3ubeh}(h]h ]h"]h$]h&]uh1jhjs3hMhjU3ubj)}(h)``size_t start`` The first byte to zero. h](j)}(h``size_t start``h]j)}(hj3h]h size_t start}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3ubj5)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1j4hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjU3ubj)}(h4``size_t xend`` One more than the last byte to zero.h](j)}(h``size_t xend``h]j)}(hj3h]h size_t xend}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3ubj5)}(hhh]h)}(h$One more than the last byte to zero.h]h$One more than the last byte to zero.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj3ubah}(h]h ]h"]h$]h&]uh1j4hj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjU3ubeh}(h]h ]h"]h$]h&]uh1j hj93ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_zero_range (C function)c.folio_zero_rangehNtauh1jhjhhhNhNubj)}(hhh](j)}(hHvoid folio_zero_range (struct folio *folio, size_t start, size_t length)h]j)}(hGvoid folio_zero_range(struct folio *folio, size_t start, size_t length)h](j)}(hvoidh]hvoid}(hj*4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&4hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj94hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&4hhhj84hMubj)}(hfolio_zero_rangeh]j )}(hfolio_zero_rangeh]hfolio_zero_range}(hjK4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjG4ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj&4hhhj84hMubj&)}(h2(struct folio *folio, size_t start, size_t length)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hjg4hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjc4ubj)}(h h]h }(hjt4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc4ubh)}(hhh]j )}(hfolioh]hfolio}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj4modnameN classnameNjnjq)}jt]jw)}jjjM4sbc.folio_zero_rangeasbuh1hhjc4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc4ubj )}(hfolioh]hfolio}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjc4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj_4ubj,)}(h size_t starth](h)}(hhh]j )}(hsize_th]hsize_t}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj4modnameN classnameNjnjq)}jt]j4c.folio_zero_rangeasbuh1hhj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj )}(hstarth]hstart}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj_4ubj,)}(h size_t lengthh](h)}(hhh]j )}(hsize_th]hsize_t}(hj$5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj!5ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj&5modnameN classnameNjnjq)}jt]j4c.folio_zero_rangeasbuh1hhj5ubj)}(h h]h }(hjB5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj )}(hlengthh]hlength}(hjP5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj_4ubeh}(h]h ]h"]h$]h&]jjuh1j%hj&4hhhj84hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj"4hhhj84hMubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1jhj84hMhj4hhubj)}(hhh]h)}(hZero a byte range in a folio.h]hZero a byte range in a folio.}(hjz5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjw5hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj84hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj5jj5jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio to write to. ``size_t start`` The first byte to zero. ``size_t length`` The number of bytes to zero.h](h)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj5ubj)}(hhh](j)}(h/``struct folio *folio`` The folio to write to. h](j)}(h``struct folio *folio``h]j)}(hj5h]hstruct folio *folio}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj5ubj5)}(hhh]h)}(hThe folio to write to.h]hThe folio to write to.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1j4hj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMhj5ubj)}(h)``size_t start`` The first byte to zero. h](j)}(h``size_t start``h]j)}(hj5h]h size_t start}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj5ubj5)}(hhh]h)}(hThe first byte to zero.h]hThe first byte to zero.}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj 6hMhj 6ubah}(h]h ]h"]h$]h&]uh1j4hj5ubeh}(h]h ]h"]h$]h&]uh1jhj 6hMhj5ubj)}(h.``size_t length`` The number of bytes to zero.h](j)}(h``size_t length``h]j)}(hj-6h]h size_t length}(hj/6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+6ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj'6ubj5)}(hhh]h)}(hThe number of bytes to zero.h]hThe number of bytes to zero.}(hjF6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhjC6ubah}(h]h ]h"]h$]h&]uh1j4hj'6ubeh}(h]h ]h"]h$]h&]uh1jhjB6hMhj5ubeh}(h]h ]h"]h$]h&]uh1j hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfolio_release_kmap (C function)c.folio_release_kmaphNtauh1jhjhhhNhNubj)}(hhh](j)}(h9void folio_release_kmap (struct folio *folio, void *addr)h]j)}(h8void folio_release_kmap(struct folio *folio, void *addr)h](j)}(hvoidh]hvoid}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhj6hMubj)}(hfolio_release_kmaph]j )}(hfolio_release_kmaph]hfolio_release_kmap}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj6ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj6hhhj6hMubj&)}(h!(struct folio *folio, void *addr)h](j,)}(hstruct folio *folioh](j2)}(hj5h]hstruct}(hj6hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j )}(hfolioh]hfolio}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj6ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj6modnameN classnameNjnjq)}jt]jw)}jjj6sbc.folio_release_kmapasbuh1hhj6ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj )}(hfolioh]hfolio}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj6ubj,)}(h void *addrh](j)}(hvoidh]hvoid}(hj67hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj27ubj)}(h h]h }(hjD7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj27ubj)}(hjh]h*}(hjR7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj27ubj )}(haddrh]haddr}(hj_7hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj27ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj6ubeh}(h]h ]h"]h$]h&]jjuh1j%hj6hhhj6hMubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj6hhhj6hMubah}(h]jz6ah ](jjeh"]h$]h&]jj)jhuh1jhj6hMhj|6hhubj)}(hhh]h)}(h"Unmap a folio and drop a refcount.h]h"Unmap a folio and drop a refcount.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7hhubah}(h]h ]h"]h$]h&]uh1jhj|6hhhj6hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj7jj7jjjuh1jhhhjhNhNubj)}(hXU**Parameters** ``struct folio *folio`` The folio to release. ``void *addr`` The address previously returned by a call to kmap_local_folio(). **Description** It is common, eg in directory handling to kmap a folio. This function unmaps the folio and drops the refcount that was being held to keep the folio alive while we accessed it.h](h)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubj)}(hhh](j)}(h.``struct folio *folio`` The folio to release. h](j)}(h``struct folio *folio``h]j)}(hj7h]hstruct folio *folio}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubj5)}(hhh]h)}(hThe folio to release.h]hThe folio to release.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMhj7ubah}(h]h ]h"]h$]h&]uh1j4hj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMhj7ubj)}(hP``void *addr`` The address previously returned by a call to kmap_local_folio(). h](j)}(h``void *addr``h]j)}(hj8h]h void *addr}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubj5)}(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().}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1j4hj7ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhj7ubeh}(h]h ]h"]h$]h&]uh1j hj7ubh)}(h**Description**h]j)}(hj>8h]h Description}(hj@8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<8ubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubh)}(hIt is common, eg in directory handling to kmap a folio. This function unmaps the folio and drops the refcount that was being held to keep the folio alive while we accessed it.h]hIt is common, eg in directory handling to kmap a folio. This function unmaps the folio and drops the refcount that was being held to keep the folio alive while we accessed it.}(hjT8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhS/var/lib/git/docbuild/linux/Documentation/mm/highmem:211: ./include/linux/highmem.hhMhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_high (C function) c.kmap_highhNtauh1jhjhhhNhNubj)}(hhh](j)}(h$void * kmap_high (struct page *page)h]j)}(h"void *kmap_high(struct page *page)h](j)}(hvoidh]hvoid}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM-ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj8hM-ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj8hM-ubj)}(h kmap_highh]j )}(h kmap_highh]h kmap_high}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj8ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj8hhhj8hM-ubj&)}(h(struct page *page)h]j,)}(hstruct page *pageh](j2)}(hj5h]hstruct}(hj8hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j )}(hpageh]hpage}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj8ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj8modnameN classnameNjnjq)}jt]jw)}jjj8sb c.kmap_highasbuh1hhj8ubj)}(h h]h }(hj 9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj )}(hpageh]hpage}(hj&9hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj8ubah}(h]h ]h"]h$]h&]jjuh1j%hj8hhhj8hM-ubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj{8hhhj8hM-ubah}(h]jv8ah ](jjeh"]h$]h&]jj)jhuh1jhj8hM-hjx8hhubj)}(hhh]h)}(hmap a highmem page into memoryh]hmap a highmem page into memory}(hjP9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM-hjM9hhubah}(h]h ]h"]h$]h&]uh1jhjx8hhhj8hM-ubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjh9jjh9jjjuh1jhhhjhNhNubj)}(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)}(hjr9h]h Parameters}(hjt9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp9ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM1hjl9ubj)}(hhh]j)}(h:``struct page *page`` :c:type:`struct page ` to map h](j)}(h``struct page *page``h]j)}(hj9h]hstruct page *page}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM.hj9ubj5)}(hhh]h)}(h#:c:type:`struct page ` to maph](h)}(h:c:type:`struct page `h]j)}(hj9h]h struct page}(hj9hhhNhNubah}(h]h ](xrefjhc-typeeh"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]refdoc mm/highmem refdomainjhreftypetype refexplicitrefwarnjnjq)}jt]sb reftargetpageuh1hhj9hM.hj9ubh to map}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj9hM.hj9ubah}(h]h ]h"]h$]h&]uh1j4hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9hM.hj9ubah}(h]h ]h"]h$]h&]uh1j hjl9ubh)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM0hjl9ubh)}(h*Returns the page's virtual memory address.h]h,Returns the page’s virtual memory address.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.clhM/hjl9ubh)}(h5We cannot call this from interrupts, as it may block.h]h5We cannot call this from interrupts, as it may block.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chM1hjl9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkmap_high_get (C function)c.kmap_high_gethNtauh1jhjhhhNhNubj)}(hhh](j)}(h.void * kmap_high_get (const struct page *page)h]j)}(h,void *kmap_high_get(const struct page *page)h](j)}(hvoidh]hvoid}(hjE:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA:hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMIubj)}(h h]h }(hjT:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA:hhhjS:hMIubj)}(hjh]h*}(hjb:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA:hhhjS:hMIubj)}(h kmap_high_geth]j )}(h kmap_high_geth]h kmap_high_get}(hjs:hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjo:ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhjA:hhhjS:hMIubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hj3h]hconst}(hj:hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj2)}(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)}jjju:sbc.kmap_high_getasbuh1hhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj )}(hpageh]hpage}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj:ubah}(h]h ]h"]h$]h&]jjuh1j%hjA:hhhjS:hMIubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj=:hhhjS:hMIubah}(h]j8:ah ](jjeh"]h$]h&]jj)jhuh1jhjS:hMIhj::hhubj)}(hhh]h)}(hpin a highmem page into memoryh]hpin a highmem page into memory}(hj-;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMIhj*;hhubah}(h]h ]h"]h$]h&]uh1jhj::hhhjS:hMIubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjjE;jjE;jjjuh1jhhhjhNhNubj)}(hX=**Parameters** ``const struct page *page`` :c:type:`struct page ` to pin **Description** Returns the page's current virtual memory address, or NULL if no mapping exists. If and only if a non null address is returned then a matching call to kunmap_high() is necessary. This can be called from any context.h](h)}(h**Parameters**h]j)}(hjO;h]h Parameters}(hjQ;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM;ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMMhjI;ubj)}(hhh]j)}(h@``const struct page *page`` :c:type:`struct page ` to pin h](j)}(h``const struct page *page``h]j)}(hjn;h]hconst struct page *page}(hjp;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl;ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMJhjh;ubj5)}(hhh]h)}(h#:c:type:`struct page ` to pinh](h)}(h:c:type:`struct page `h]j)}(hj;h]h struct page}(hj;hhhNhNubah}(h]h ](j9jhc-typeeh"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]refdocj9 refdomainjhreftypetype refexplicitrefwarnjnj9j9pageuh1hhj;hMJhj;ubh to pin}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj;hMJhj;ubah}(h]h ]h"]h$]h&]uh1j4hjh;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMJhje;ubah}(h]h ]h"]h$]h&]uh1j hjI;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.chMLhjI;ubh)}(hReturns the page's current virtual memory address, or NULL if no mapping exists. If and only if a non null address is returned then a matching call to kunmap_high() is necessary.h]hReturns the page’s current virtual memory address, or NULL if no mapping exists. If and only if a non null address is returned then a matching call to kunmap_high() is necessary.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMKhjI;ubh)}(h$This can be called from any context.h]h$This can be called from any context.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMOhjI;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jkunmap_high (C function) c.kunmap_highhNtauh1jhjhhhNhNubj)}(hhh](j)}(h*void kunmap_high (const struct page *page)h]j)}(h)void kunmap_high(const struct page *page)h](j)}(hvoidh]hvoid}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMbubj)}(h h]h }(hj+<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhj*<hMbubj)}(h kunmap_highh]j )}(h kunmap_highh]h kunmap_high}(hj=<hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj9<ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj<hhhj*<hMbubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hj3h]hconst}(hjY<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU<ubj)}(h h]h }(hjf<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU<ubj2)}(hj5h]hstruct}(hjt<hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hjU<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU<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.kunmap_highasbuh1hhjU<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU<ubj )}(hpageh]hpage}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjU<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hjQ<ubah}(h]h ]h"]h$]h&]jjuh1j%hj<hhhj*<hMbubeh}(h]h ]h"]h$]h&]jjjuh1jjjhj<hhhj*<hMbubah}(h]j<ah ](jjeh"]h$]h&]jj)jhuh1jhj*<hMbhj<hhubj)}(hhh]h)}(h unmap a highmem page into memoryh]h unmap a highmem page into memory}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMbhj<hhubah}(h]h ]h"]h$]h&]uh1jhj<hhhj*<hMbubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj=jj=jjjuh1jhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` :c:type:`struct page ` to unmap **Description** If ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called only from user context.h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMfhj=ubj)}(hhh]j)}(hB``const struct page *page`` :c:type:`struct page ` to unmap h](j)}(h``const struct page *page``h]j)}(hj8=h]hconst struct page *page}(hj:=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6=ubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMchj2=ubj5)}(hhh]h)}(h%:c:type:`struct page ` to unmaph](h)}(h:c:type:`struct page `h]j)}(hjW=h]h struct page}(hjY=hhhNhNubah}(h]h ](j9jhc-typeeh"]h$]h&]uh1jhjU=ubah}(h]h ]h"]h$]h&]refdocj9 refdomainjhreftypetype refexplicitrefwarnjnj9j9pageuh1hhjM=hMchjQ=ubh to unmap}(hjQ=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjM=hMchjN=ubah}(h]h ]h"]h$]h&]uh1j4hj2=ubeh}(h]h ]h"]h$]h&]uh1jhjM=hMchj/=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.chMehj=ubh)}(hZIf ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called only from user context.h]hZIf ARCH_NEEDS_KMAP_HIGH_GET is not defined then this may be called only from user context.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMdhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jpage_address (C function)c.page_addresshNtauh1jhjhhhNhNubj)}(hhh](j)}(h-void * page_address (const struct page *page)h]j)}(h+void *page_address(const struct page *page)h](j)}(hvoidh]hvoid}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj=hMubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj=hMubj)}(h page_addressh]j )}(h page_addressh]h page_address}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj>ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj=hhhj=hMubj&)}(h(const struct page *page)h]j,)}(hconst struct page *pageh](j2)}(hj3h]hconst}(hj!>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(h h]h }(hj.>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(hj5h]hstruct}(hj<>hhhNhNubah}(h]h ]j>ah"]h$]h&]uh1j1hj>ubj)}(h h]h }(hjI>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubh)}(hhh]j )}(hpageh]hpage}(hjZ>hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjW>ubah}(h]h ]h"]h$]h&] refdomainjhreftypejj reftargetj\>modnameN classnameNjnjq)}jt]jw)}jjj>sbc.page_addressasbuh1hhj>ubj)}(h h]h }(hjz>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+hj>ubah}(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(get the mapped virtual address of a pageh]h(get the mapped virtual address of a page}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj=hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj>jj>jjjuh1jhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` :c:type:`struct page ` to get the virtual address of **Description** Returns the page's virtual address.h](h)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>ubj)}(hhh]j)}(hW``const struct page *page`` :c:type:`struct page ` to get the virtual address of h](j)}(h``const struct page *page``h]j)}(hj?h]hconst struct 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.chMhj>ubj5)}(hhh]h)}(h::c:type:`struct page ` to get the virtual address ofh](h)}(h:c:type:`struct page `h]j)}(hj?h]h struct page}(hj!?hhhNhNubah}(h]h ](j9jhc-typeeh"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]refdocj9 refdomainjhreftypetype refexplicitrefwarnjnj9j9pageuh1hhj?hMhj?ubh to get the virtual address of}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj?hMhj?ubah}(h]h ]h"]h$]h&]uh1j4hj>ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj>ubah}(h]h ]h"]h$]h&]uh1j hj>ubh)}(h**Description**h]j)}(hjZ?h]h Description}(hj\?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX?ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>ubh)}(h#Returns the page's virtual address.h]h%Returns the page’s virtual address.}(hjp?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jset_page_address (C function)c.set_page_addresshNtauh1jhjhhhNhNubj)}(hhh](j)}(h8void set_page_address (struct page *page, void *virtual)h]j)}(h7void set_page_address(struct page *page, void *virtual)h](j)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhj?hMubj)}(hset_page_addressh]j )}(hset_page_addressh]hset_page_address}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj?ubah}(h]h ](j j!eh"]h$]h&]jjuh1jhj?hhhj?hMubj&)}(h"(struct page *page, void *virtual)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.set_page_addressasbuh1hhj?ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hjh]h*}(hj(@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj )}(hpageh]hpage}(hj5@hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j+hj?ubj,)}(h void *virtualh](j)}(hvoidh]hvoid}(hjN@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ@ubj)}(h h]h }(hj\@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ@ubj)}(hjh]h*}(hjj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ@ubj )}(hvirtualh]hvirtual}(hjw@hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjJ@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)}(hset a page's virtual addressh]hset a page’s virtual address}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj@hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj?hMubeh}(h]h ](jhfunctioneh"]h$]h&]jjhjj@jj@jjjuh1jhhhjhNhNubj)}(hw**Parameters** ``struct page *page`` :c:type:`struct page ` to set ``void *virtual`` virtual address to useh](h)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1hhH/var/lib/git/docbuild/linux/Documentation/mm/highmem:212: ./mm/highmem.chMhj@ubj)}(hhh](j)}(h:``struct page *page`` :c:type:`struct page ` to set h](j)}(h``struct page *page``h]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.chMhj@ubj5)}(hhh]h)}(h#:c:type:`struct page ` to seth](h)}(h:c:type:`struct page `h]j)}(hjAh]h struct page}(hjAhhhNhNubah}(h]h ](j9jhc-typeeh"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]refdocj9 refdomainjhreftypetype refexplicitrefwarnjnj9j9pageuh1hhj@hMhj@ubh to set}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj@hMhj@ubah}(h]h ]h"]h$]h&]uh1j4hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhj@ubj)}(h(``void *virtual`` virtual address to useh](j)}(h``void *virtual``h]j)}(hj:Ah]h void *virtual}(hj