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/core-api/mm-apimodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/core-api/mm-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/core-api/mm-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/core-api/mm-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/core-api/mm-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/pt_BR/core-api/mm-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/sp_SP/core-api/mm-apimodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hMemory Management APIsh]hMemory Management APIs}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh=/var/lib/git/docbuild/linux/Documentation/core-api/mm-api.rsthKubh)}(hhh](h)}(hUser Space Memory Accessh]hUser Space Memory Access}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleget_user (C macro) c.get_userhNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(hget_userh]hdesc_signature_line)}(hget_userh]h desc_name)}(hget_userh]h desc_sig_name)}(hhh]hget_user}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&] xml:spacepreserveuh1hhhhhh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK[ubah}(h]h ]h"]h$]h&]jj add_permalinkuh1hsphinx_line_type declaratorhhhhhjhK[ubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhjhK[hhhhubh desc_content)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hhhhhjhK[ubeh}(h]h ](cmacroeh"]h$]h&]domainjAobjtypejBdesctypejBnoindex noindexentrynocontentsentryuh1hhhhhhNhNubh paragraph)}(h``get_user (x, ptr)``h]hliteral)}(hjPh]hget_user (x, ptr)}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK]hhhhubh block_quote)}(h'Get a simple variable from user space. h]jM)}(h&Get a simple variable from user space.h]h&Get a simple variable from user space.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK[hjjubah}(h]h ]h"]h$]h&]uh1jhhj|hK[hhhhubh container)}(hXW**Parameters** ``x`` Variable to store result. ``ptr`` Source address, in user space. **Context** User context only. This function may sleep if pagefaults are enabled. **Description** This macro copies a single simple variable from user space to kernel space. It supports simple types like char and int, but not larger data types like structures or arrays. **ptr** must have pointer-to-simple-variable type, and the result of dereferencing **ptr** must be assignable to **x** without a cast. **Return** zero on success, or -EFAULT on error. On error, the variable **x** is set to zero.h](jM)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK_hjubhdefinition_list)}(hhh](hdefinition_list_item)}(h ``x`` Variable to store result. h](hterm)}(h``x``h]jS)}(hjh]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK\hjubh definition)}(hhh]jM)}(hVariable to store result.h]hVariable to store result.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhK\hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK\hjubj)}(h'``ptr`` Source address, in user space. h](j)}(h``ptr``h]jS)}(hjh]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK]hjubj)}(hhh]jM)}(hSource address, in user space.h]hSource address, in user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhK]hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK]hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Context**h]j)}(hj(h]hContext}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK_hjubjM)}(hEUser context only. This function may sleep if pagefaults are enabled.h]hEUser context only. This function may sleep if pagefaults are enabled.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK_hjubjM)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKbhjubjM)}(hThis macro copies a single simple variable from user space to kernel space. It supports simple types like char and int, but not larger data types like structures or arrays.h]hThis macro copies a single simple variable from user space to kernel space. It supports simple types like char and int, but not larger data types like structures or arrays.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKahjubjM)}(h**ptr** must have pointer-to-simple-variable type, and the result of dereferencing **ptr** must be assignable to **x** without a cast.h](j)}(h**ptr**h]hptr}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubhL must have pointer-to-simple-variable type, and the result of dereferencing }(hjthhhNhNubj)}(h**ptr**h]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh must be assignable to }(hjthhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubh without a cast.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKehjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhhjubjM)}(hRzero on success, or -EFAULT on error. On error, the variable **x** is set to zero.h](h=zero on success, or -EFAULT on error. On error, the variable }(hjhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set to zero.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKihjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__get_user (C macro) c.__get_userhNtauh1hhhhhhNhNubh)}(hhh](h)}(h __get_userh]h)}(h __get_userh]h)}(h __get_userh]j)}(hjh]h __get_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKoubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj%hKoubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%hKohjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhj%hKoubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGj>jHj>jIjJjKuh1hhhhhhNhNubjM)}(h``__get_user (x, ptr)``h]jS)}(hjDh]h__get_user (x, ptr)}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjBubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKqhhhhubji)}(h;Get a simple variable from user space, with less checking. h]jM)}(h:Get a simple variable from user space, with less checking.h]h:Get a simple variable from user space, with less checking.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKohjZubah}(h]h ]h"]h$]h&]uh1jhhjlhKohhhhubj)}(hX**Parameters** ``x`` Variable to store result. ``ptr`` Source address, in user space. **Context** User context only. This function may sleep if pagefaults are enabled. **Description** This macro copies a single simple variable from user space to kernel space. It supports simple types like char and int, but not larger data types like structures or arrays. **ptr** must have pointer-to-simple-variable type, and the result of dereferencing **ptr** must be assignable to **x** without a cast. Caller must check the pointer with access_ok() before calling this function. **Return** zero on success, or -EFAULT on error. On error, the variable **x** is set to zero.h](jM)}(h**Parameters**h]j)}(hjyh]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKshjsubj)}(hhh](j)}(h ``x`` Variable to store result. h](j)}(h``x``h]jS)}(hjh]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKphjubj)}(hhh]jM)}(hVariable to store result.h]hVariable to store result.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKphjubj)}(h'``ptr`` Source address, in user space. h](j)}(h``ptr``h]jS)}(hjh]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKqhjubj)}(hhh]jM)}(hSource address, in user space.h]hSource address, in user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKqhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKqhjubeh}(h]h ]h"]h$]h&]uh1jhjsubjM)}(h **Context**h]j)}(hj h]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKshjsubjM)}(hEUser context only. This function may sleep if pagefaults are enabled.h]hEUser context only. This function may sleep if pagefaults are enabled.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKshjsubjM)}(h**Description**h]j)}(hj3h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKvhjsubjM)}(hThis macro copies a single simple variable from user space to kernel space. It supports simple types like char and int, but not larger data types like structures or arrays.h]hThis macro copies a single simple variable from user space to kernel space. It supports simple types like char and int, but not larger data types like structures or arrays.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKuhjsubjM)}(h**ptr** must have pointer-to-simple-variable type, and the result of dereferencing **ptr** must be assignable to **x** without a cast.h](j)}(h**ptr**h]hptr}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubhL must have pointer-to-simple-variable type, and the result of dereferencing }(hjXhhhNhNubj)}(h**ptr**h]hptr}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh must be assignable to }(hjXhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh without a cast.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKyhjsubjM)}(hLCaller must check the pointer with access_ok() before calling this function.h]hLCaller must check the pointer with access_ok() before calling this function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhK|hjsubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjsubjM)}(hRzero on success, or -EFAULT on error. On error, the variable **x** is set to zero.h](h=zero on success, or -EFAULT on error. On error, the variable }(hjhhhNhNubj)}(h**x**h]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set to zero.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hput_user (C macro) c.put_userhNtauh1hhhhhhNhNubh)}(hhh](h)}(hput_userh]h)}(hput_userh]h)}(hput_userh]j)}(hjh]hput_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGj1jHj1jIjJjKuh1hhhhhhNhNubjM)}(h``put_user (x, ptr)``h]jS)}(hj7h]hput_user (x, ptr)}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhhhhubji)}(h&Write a simple value into user space. h]jM)}(h%Write a simple value into user space.h]h%Write a simple value into user space.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjMubah}(h]h ]h"]h$]h&]uh1jhhj_hKhhhhubj)}(hX **Parameters** ``x`` Value to copy to user space. ``ptr`` Destination address, in user space. **Context** User context only. This function may sleep if pagefaults are enabled. **Description** This macro copies a single simple value from kernel space to user space. It supports simple types like char and int, but not larger data types like structures or arrays. **ptr** must have pointer-to-simple-variable type, and **x** must be assignable to the result of dereferencing **ptr**. **Return** zero on success, or -EFAULT on error.h](jM)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubj)}(hhh](j)}(h#``x`` Value to copy to user space. h](j)}(h``x``h]jS)}(hjh]hx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjubj)}(hhh]jM)}(hValue to copy to user space.h]hValue to copy to user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h,``ptr`` Destination address, in user space. h](j)}(h``ptr``h]jS)}(hjh]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjubj)}(hhh]jM)}(h#Destination address, in user space.h]h#Destination address, in user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjfubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubjM)}(hEUser context only. This function may sleep if pagefaults are enabled.h]hEUser context only. This function may sleep if pagefaults are enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubjM)}(h**Description**h]j)}(hj&h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubjM)}(hThis macro copies a single simple value from kernel space to user space. It supports simple types like char and int, but not larger data types like structures or arrays.h]hThis macro copies a single simple value from kernel space to user space. It supports simple types like char and int, but not larger data types like structures or arrays.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubjM)}(hw**ptr** must have pointer-to-simple-variable type, and **x** must be assignable to the result of dereferencing **ptr**.h](j)}(h**ptr**h]hptr}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh0 must have pointer-to-simple-variable type, and }(hjKhhhNhNubj)}(h**x**h]hx}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh3 must be assignable to the result of dereferencing }(hjKhhhNhNubj)}(h**ptr**h]hptr}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubjM)}(h%zero on success, or -EFAULT on error.h]h%zero on success, or -EFAULT on error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__put_user (C macro) c.__put_userhNtauh1hhhhhhNhNubh)}(hhh](h)}(h __put_userh]h)}(h __put_userh]h)}(h __put_userh]j)}(hjh]h __put_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhhhNhNubjM)}(h``__put_user (x, ptr)``h]jS)}(hj h]h__put_user (x, ptr)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhhhhubji)}(h:Write a simple value into user space, with less checking. h]jM)}(h9Write a simple value into user space, with less checking.h]h9Write a simple value into user space, with less checking.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjubah}(h]h ]h"]h$]h&]uh1jhhj1hKhhhhubj)}(hXn**Parameters** ``x`` Value to copy to user space. ``ptr`` Destination address, in user space. **Context** User context only. This function may sleep if pagefaults are enabled. **Description** This macro copies a single simple value from kernel space to user space. It supports simple types like char and int, but not larger data types like structures or arrays. **ptr** must have pointer-to-simple-variable type, and **x** must be assignable to the result of dereferencing **ptr**. Caller must check the pointer with access_ok() before calling this function. **Return** zero on success, or -EFAULT on error.h](jM)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubj)}(hhh](j)}(h#``x`` Value to copy to user space. h](j)}(h``x``h]jS)}(hj]h]hx}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjWubj)}(hhh]jM)}(hValue to copy to user space.h]hValue to copy to user space.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjrhKhjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjrhKhjTubj)}(h,``ptr`` Destination address, in user space. h](j)}(h``ptr``h]jS)}(hjh]hptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhjubj)}(hhh]jM)}(h#Destination address, in user space.h]h#Destination address, in user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjTubeh}(h]h ]h"]h$]h&]uh1jhj8ubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(hEUser context only. This function may sleep if pagefaults are enabled.h]hEUser context only. This function may sleep if pagefaults are enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(hThis macro copies a single simple value from kernel space to user space. It supports simple types like char and int, but not larger data types like structures or arrays.h]hThis macro copies a single simple value from kernel space to user space. It supports simple types like char and int, but not larger data types like structures or arrays.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(hw**ptr** must have pointer-to-simple-variable type, and **x** must be assignable to the result of dereferencing **ptr**.h](j)}(h**ptr**h]hptr}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh0 must have pointer-to-simple-variable type, and }(hjhhhNhNubj)}(h**x**h]hx}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 must be assignable to the result of dereferencing }(hjhhhNhNubj)}(h**ptr**h]hptr}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(hLCaller must check the pointer with access_ok() before calling this function.h]hLCaller must check the pointer with access_ok() before calling this function.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(h **Return**h]j)}(hjoh]hReturn}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubjM)}(h%zero on success, or -EFAULT on error.h]h%zero on success, or -EFAULT on error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh]/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:8: ./arch/x86/include/asm/uaccess.hhKhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hclear_user (C function) c.clear_userhNtauh1hhhhhhNhNubh)}(hhh](h)}(h;unsigned long clear_user (void __user *to, unsigned long n)h]h)}(h:unsigned long clear_user(void __user *to, unsigned long n)h](hdesc_sig_keyword_type)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK4ubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhK4ubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK4ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK4ubh)}(h clear_userh]j)}(h clear_userh]h clear_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhK4ubhdesc_parameterlist)}(h"(void __user *to, unsigned long n)h](hdesc_parameter)}(hvoid __user *toh](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj% hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh__user}(hj hhhNhNubj)}(h h]h }(hj7 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubhdesc_sig_punctuation)}(h*h]h*}(hjG hhhNhNubah}(h]h ]pah"]h$]h&]uh1jE hj ubj)}(htoh]hto}(hjV hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long nh](j)}(hunsignedh]hunsigned}(hjo hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubj)}(h h]h }(hj} hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubj)}(hlongh]hlong}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubj)}(hjh]hn}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhK4ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhK4ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhK4hjhhubj4)}(hhh]jM)}(h%Zero a block of memory in user space.h]h%Zero a block of memory in user space.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK4hj hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhK4ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhhhNhNubj)}(hX**Parameters** ``void __user *to`` Destination address, in user space. ``unsigned long n`` Number of bytes to zero. **Description** Zero a block of memory in user space. **Return** number of bytes that could not be cleared. On success, this will be zero.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK8hj ubj)}(hhh](j)}(h8``void __user *to`` Destination address, in user space. h](j)}(h``void __user *to``h]jS)}(hj h]hvoid __user *to}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK5hj ubj)}(hhh]jM)}(h#Destination address, in user space.h]h#Destination address, in user space.}(hj* hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj& hK5hj' ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj& hK5hj ubj)}(h-``unsigned long n`` Number of bytes to zero. h](j)}(h``unsigned long n``h]jS)}(hjJ h]hunsigned long n}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjH ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK6hjD ubj)}(hhh]jM)}(hNumber of bytes to zero.h]hNumber of bytes to zero.}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_ hK6hj` ubah}(h]h ]h"]h$]h&]uh1jhjD ubeh}(h]h ]h"]h$]h&]uh1jhj_ hK6hj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK8hj ubjM)}(h%Zero a block of memory in user space.h]h%Zero a block of memory in user space.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK7hj ubjM)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK9hj ubjM)}(hInumber of bytes that could not be cleared. On success, this will be zero.h]hInumber of bytes that could not be cleared. On success, this will be zero.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chK:hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__clear_user (C function)c.__clear_userhNtauh1hhhhhhNhNubh)}(hhh](h)}(h=unsigned long __clear_user (void __user *to, unsigned long n)h]h)}(h ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chKIhj: ubj)}(hhh]jM)}(h#Destination address, in user space.h]h#Destination address, in user space.}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjU hKIhjV ubah}(h]h ]h"]h$]h&]uh1jhj: ubeh}(h]h ]h"]h$]h&]uh1jhjU hKIhj7 ubj)}(h-``unsigned long n`` Number of bytes to zero. h](j)}(h``unsigned long n``h]jS)}(hjy h]hunsigned long n}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjw ubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chKJhjs ubj)}(hhh]jM)}(hNumber of bytes to zero.h]hNumber of bytes to zero.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hKJhj ubah}(h]h ]h"]h$]h&]uh1jhjs ubeh}(h]h ]h"]h$]h&]uh1jhj hKJhj7 ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chKLhj ubjM)}(h{Zero a block of memory in user space. Caller must check the specified block with access_ok() before calling this function.h]h{Zero a block of memory in user space. Caller must check the specified block with access_ok() before calling this function.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chKKhj ubjM)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chKNhj ubjM)}(hInumber of bytes that could not be cleared. On success, this will be zero.h]hInumber of bytes that could not be cleared. On success, this will be zero.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:11: ./arch/x86/lib/usercopy_32.chKOhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h get_user_pages_fast (C function)c.get_user_pages_fasthNtauh1hhhhhhNhNubh)}(hhh](h)}(hhint get_user_pages_fast (unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages)h]h)}(hgint get_user_pages_fast(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM ubj)}(h h]h }(hj/ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj. hM ubh)}(hget_user_pages_fasth]j)}(hget_user_pages_fasth]hget_user_pages_fast}(hjA hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj= ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhj. hM ubj )}(hP(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages)h](j )}(hunsigned long starth](j)}(hunsignedh]hunsigned}(hj] hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubj)}(h h]h }(hjk hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubj)}(hlongh]hlong}(hjy hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubj)}(hstarth]hstart}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjU ubj )}(h int nr_pagesh](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hnr_pagesh]hnr_pages}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjU ubj )}(hunsigned int gup_flagsh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h gup_flagsh]h gup_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjU ubj )}(hstruct page **pagesh](hdesc_sig_keyword)}(hstructh]hstruct}(hj6hhhNhNubah}(h]h ]kah"]h$]h&]uh1j4hj0ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(hpageh]hpage}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjAreftype identifier reftargetjXmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jq ASTIdentifier)}jljC sbc.get_user_pages_fastasbuh1hhj0ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0ubj)}(hpagesh]hpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjU ubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhj. hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj. hM ubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj. hM hj hhubj4)}(hhh]jM)}(hpin user pages in memoryh]hpin user pages in memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj. hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhhhNhNubj)}(hXl**Parameters** ``unsigned long start`` starting user address ``int nr_pages`` number of pages from start to pin ``unsigned int gup_flags`` flags modifying pin behaviour ``struct page **pages`` array that receives pointers to the pages pinned. Should be at least nr_pages long. **Description** Attempt to pin user pages in memory without taking mm->mmap_lock. If not successful, it will fall back to taking the lock and calling get_user_pages(). Returns number of pages pinned. This may be fewer than the number requested. If nr_pages is 0 or negative, returns 0. If no pages were pinned, returns -errno.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjubj)}(hhh](j)}(h.``unsigned long start`` starting user address h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hj ubj)}(hhh]jM)}(hstarting user addressh]hstarting user address}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj&hM hj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj&hM hjubj)}(h3``int nr_pages`` number of pages from start to pin h](j)}(h``int nr_pages``h]jS)}(hjJh]h int nr_pages}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjDubj)}(hhh]jM)}(h!number of pages from start to pinh]h!number of pages from start to pin}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_hM hj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj_hM hjubj)}(h9``unsigned int gup_flags`` flags modifying pin behaviour h](j)}(h``unsigned int gup_flags``h]jS)}(hjh]hunsigned int gup_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hj}ubj)}(hhh]jM)}(hflags modifying pin behaviourh]hflags modifying pin behaviour}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hl``struct page **pages`` array that receives pointers to the pages pinned. Should be at least nr_pages long. h](j)}(h``struct page **pages``h]jS)}(hjh]hstruct page **pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjubj)}(hhh]jM)}(hSarray that receives pointers to the pages pinned. Should be at least nr_pages long.h]hSarray that receives pointers to the pages pinned. Should be at least nr_pages long.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjubjM)}(hAttempt to pin user pages in memory without taking mm->mmap_lock. If not successful, it will fall back to taking the lock and calling get_user_pages().h]hAttempt to pin user pages in memory without taking mm->mmap_lock. If not successful, it will fall back to taking the lock and calling get_user_pages().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjubjM)}(hReturns number of pages pinned. This may be fewer than the number requested. If nr_pages is 0 or negative, returns 0. If no pages were pinned, returns -errno.h]hReturns number of pages pinned. This may be fewer than the number requested. If nr_pages is 0 or negative, returns 0. If no pages were pinned, returns -errno.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhH/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:14: ./mm/gup.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubhtarget)}(h.. _mm-api-gfp-flags:h]h}(h]h ]h"]h$]h&]refidmm-api-gfp-flagsuh1j3hKhhhhhhubeh}(h]user-space-memory-accessah ]h"]user space memory accessah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hMemory Allocation Controlsh]hMemory Allocation Controls}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhhhhhKubh)}(hhh](h)}(h!Page mobility and placement hintsh]h!Page mobility and placement hints}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhNhNubjM)}(hThese flags provide hints about how mobile the page is. Pages with similar mobility are placed within the same pageblocks to minimise problems due to external fragmentation.h]hThese flags provide hints about how mobile the page is. Pages with similar mobility are placed within the same pageblocks to minimise problems due to external fragmentation.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhKthjZubjM)}(h``__GFP_MOVABLE`` (also a zone modifier) indicates that the page can be moved by page migration during memory compaction or can be reclaimed.h](jS)}(h``__GFP_MOVABLE``h]h __GFP_MOVABLE}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubh| (also a zone modifier) indicates that the page can be moved by page migration during memory compaction or can be reclaimed.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhKxhjZubjM)}(h``__GFP_RECLAIMABLE`` is used for slab allocations that specify SLAB_RECLAIM_ACCOUNT and whose pages can be freed via shrinkers.h](jS)}(h``__GFP_RECLAIMABLE``h]h__GFP_RECLAIMABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhk is used for slab allocations that specify SLAB_RECLAIM_ACCOUNT and whose pages can be freed via shrinkers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhK{hjZubjM)}(h``__GFP_WRITE`` indicates the caller intends to dirty the page. Where possible, these pages will be spread between local zones to avoid all the dirty pages being in one zone (fair zone allocation policy).h](jS)}(h``__GFP_WRITE``h]h __GFP_WRITE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh indicates the caller intends to dirty the page. Where possible, these pages will be spread between local zones to avoid all the dirty pages being in one zone (fair zone allocation policy).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhK~hjZubjM)}(h@``__GFP_HARDWALL`` enforces the cpuset memory allocation policy.h](jS)}(h``__GFP_HARDWALL``h]h__GFP_HARDWALL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh. enforces the cpuset memory allocation policy.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhKhjZubjM)}(h``__GFP_THISNODE`` forces the allocation to be satisfied from the requested node with no fallbacks or placement policy enforcements.h](jS)}(h``__GFP_THISNODE``h]h__GFP_THISNODE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhr forces the allocation to be satisfied from the requested node with no fallbacks or placement policy enforcements.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhKhjZubjM)}(hU``__GFP_ACCOUNT`` causes the allocation to be accounted to the active cgroup context.h](jS)}(h``__GFP_ACCOUNT``h]h __GFP_ACCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubhD causes the allocation to be accounted to the active cgroup context.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:22: ./include/linux/gfp_types.hhKhjZubeh}(h]!page-mobility-and-placement-hintsah ]h"]!page mobility and placement hintsah$]h&]uh1hhjIhhhNhNubh)}(hhh](h)}(h ``PAGE_ALLOC_COSTLY_ORDER``). !costly allocations are too essential to fail so they are implicitly non-failing by default (with some exceptions like OOM victims might fail so the caller still has to check for failures) while costly requests try to be not disruptive and back off even without invoking the OOM killer. The following three modifiers might be used to override some of these implicit rules. Please note that all of them must be used along with ``__GFP_DIRECT_RECLAIM`` flag.h](h|The default allocator behavior depends on the request size. We have a concept of so-called costly allocations (with order > }(hjhhhNhNubjS)}(h``PAGE_ALLOC_COSTLY_ORDER``h]hPAGE_ALLOC_COSTLY_ORDER}(hjhh\hNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX). !costly allocations are too essential to fail so they are implicitly non-failing by default (with some exceptions like OOM victims might fail so the caller still has to check for failures) while costly requests try to be not disruptive and back off even without invoking the OOM killer. The following three modifiers might be used to override some of these implicit rules. Please note that all of them must be used along with }(hjhhhNhNubjS)}(h``__GFP_DIRECT_RECLAIM``h]h__GFP_DIRECT_RECLAIM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh flag.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:28: ./include/linux/gfp_types.hhKhjubjM)}(hX``__GFP_NORETRY``: The VM implementation will try only very lightweight memory direct reclaim to get some memory under memory pressure (thus it can sleep). It will avoid disruptive actions like OOM killer. The caller must handle the failure which is quite likely to happen under heavy memory pressure. The flag is suitable when failure can easily be handled at small cost, such as reduced throughput.h](jS)}(h``__GFP_NORETRY``h]h __GFP_NORETRY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX: The VM implementation will try only very lightweight memory direct reclaim to get some memory under memory pressure (thus it can sleep). It will avoid disruptive actions like OOM killer. The caller must handle the failure which is quite likely to happen under heavy memory pressure. The flag is suitable when failure can easily be handled at small cost, such as reduced throughput.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:28: ./include/linux/gfp_types.hhKhjubjM)}(hX``__GFP_RETRY_MAYFAIL``: The VM implementation will retry memory reclaim procedures that have previously failed if there is some indication that progress has been made elsewhere. It can wait for other tasks to attempt high-level approaches to freeing memory such as compaction (which removes fragmentation) and page-out. There is still a definite limit to the number of retries, but it is a larger limit than with ``__GFP_NORETRY``. Allocations with this flag may fail, but only when there is genuinely little unused memory. While these allocations do not directly trigger the OOM killer, their failure indicates that the system is likely to need to use the OOM killer soon. The caller must handle failure, but can reasonably do so by failing a higher-level request, or completing it only in a much less efficient manner. If the allocation does fail, and the caller is in a position to free some non-essential memory, doing so could benefit the system as a whole.h](jS)}(h``__GFP_RETRY_MAYFAIL``h]h__GFP_RETRY_MAYFAIL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX: The VM implementation will retry memory reclaim procedures that have previously failed if there is some indication that progress has been made elsewhere. It can wait for other tasks to attempt high-level approaches to freeing memory such as compaction (which removes fragmentation) and page-out. There is still a definite limit to the number of retries, but it is a larger limit than with }(hjhhhNhNubjS)}(h``__GFP_NORETRY``h]h __GFP_NORETRY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX. Allocations with this flag may fail, but only when there is genuinely little unused memory. While these allocations do not directly trigger the OOM killer, their failure indicates that the system is likely to need to use the OOM killer soon. The caller must handle failure, but can reasonably do so by failing a higher-level request, or completing it only in a much less efficient manner. If the allocation does fail, and the caller is in a position to free some non-essential memory, doing so could benefit the system as a whole.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:28: ./include/linux/gfp_types.hhKhjubjM)}(hX``__GFP_NOFAIL``: The VM implementation _must_ retry infinitely: the caller cannot handle allocation failures. The allocation could block indefinitely but will never return with failure. Testing for failure is pointless. It _must_ be blockable and used together with __GFP_DIRECT_RECLAIM. It should _never_ be used in non-sleepable contexts. New users should be evaluated carefully (and the flag should be used only when there is no reasonable failure policy) but it is definitely preferable to use the flag rather than opencode endless loop around allocator. Allocating pages from the buddy with __GFP_NOFAIL and order > 1 is not supported. Please consider using kvmalloc() instead.h](jS)}(h``__GFP_NOFAIL``h]h __GFP_NOFAIL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX: The VM implementation _must_ retry infinitely: the caller cannot handle allocation failures. The allocation could block indefinitely but will never return with failure. Testing for failure is pointless. It _must_ be blockable and used together with __GFP_DIRECT_RECLAIM. It should _never_ be used in non-sleepable contexts. New users should be evaluated carefully (and the flag should be used only when there is no reasonable failure policy) but it is definitely preferable to use the flag rather than opencode endless loop around allocator. Allocating pages from the buddy with __GFP_NOFAIL and order > 1 is not supported. Please consider using kvmalloc() instead.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:28: ./include/linux/gfp_types.hhKhjubeh}(h]reclaim-modifiersah ]h"]reclaim modifiersah$]h&]uh1hhjIhhhNhNubh)}(hhh](h)}(hUseful GFP flag combinationsh]hUseful GFP flag combinations}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hNhNubjM)}(hUseful GFP flag combinations that are commonly used. It is recommended that subsystems start with one of these combinations and then set/clear ``__GFP_FOO`` flags as necessary.h](hUseful GFP flag combinations that are commonly used. It is recommended that subsystems start with one of these combinations and then set/clear }(hj<hhhNhNubjS)}(h ``__GFP_FOO``h]h __GFP_FOO}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubh flags as necessary.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM,hj+ubjM)}(hX``GFP_ATOMIC`` users can not sleep and need the allocation to succeed. A lower watermark is applied to allow access to "atomic reserves". The current implementation doesn't support NMI, nor contexts that disable preemption under PREEMPT_RT. This includes raw_spin_lock() and plain preempt_disable() - see "Memory allocation" in Documentation/core-api/real-time/differences.rst for more info.h](jS)}(h``GFP_ATOMIC``h]h GFP_ATOMIC}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubhX users can not sleep and need the allocation to succeed. A lower watermark is applied to allow access to “atomic reserves”. The current implementation doesn’t support NMI, nor contexts that disable preemption under PREEMPT_RT. This includes raw_spin_lock() and plain preempt_disable() - see “Memory allocation” in Documentation/core-api/real-time/differences.rst for more info.}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM0hj+ubjM)}(h``GFP_KERNEL`` is typical for kernel-internal allocations. The caller requires ``ZONE_NORMAL`` or a lower zone for direct access but can direct reclaim.h](jS)}(h``GFP_KERNEL``h]h GFP_KERNEL}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubhA is typical for kernel-internal allocations. The caller requires }(hjzhhhNhNubjS)}(h``ZONE_NORMAL``h]h ZONE_NORMAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubh: or a lower zone for direct access but can direct reclaim.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM7hj+ubjM)}(hr``GFP_KERNEL_ACCOUNT`` is the same as GFP_KERNEL, except the allocation is accounted to the active cgroup context.h](jS)}(h``GFP_KERNEL_ACCOUNT``h]hGFP_KERNEL_ACCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh\ is the same as GFP_KERNEL, except the allocation is accounted to the active cgroup context.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM:hj+ubjM)}(hX``GFP_NOWAIT`` is for kernel allocations that should not stall for direct reclaim, start physical IO or use any filesystem callback. It is very likely to fail to allocate memory, even for very small allocations. The same restrictions on calling contexts apply as for ``GFP_ATOMIC``.h](jS)}(h``GFP_NOWAIT``h]h GFP_NOWAIT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh is for kernel allocations that should not stall for direct reclaim, start physical IO or use any filesystem callback. It is very likely to fail to allocate memory, even for very small allocations. The same restrictions on calling contexts apply as for }(hjhhhNhNubjS)}(h``GFP_ATOMIC``h]h GFP_ATOMIC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM=hj+ubjM)}(hXd``GFP_NOIO`` will use direct reclaim to discard clean pages or slab pages that do not require the starting of any physical IO. Please try to avoid using this flag directly and instead use memalloc_noio_{save,restore} to mark the whole scope which cannot perform any IO with a short explanation why. All allocation requests will inherit GFP_NOIO implicitly.h](jS)}(h ``GFP_NOIO``h]hGFP_NOIO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhXX will use direct reclaim to discard clean pages or slab pages that do not require the starting of any physical IO. Please try to avoid using this flag directly and instead use memalloc_noio_{save,restore} to mark the whole scope which cannot perform any IO with a short explanation why. All allocation requests will inherit GFP_NOIO implicitly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhMBhj+ubjM)}(hXK``GFP_NOFS`` will use direct reclaim but will not use any filesystem interfaces. Please try to avoid using this flag directly and instead use memalloc_nofs_{save,restore} to mark the whole scope which cannot/shouldn't recurse into the FS layer with a short explanation why. All allocation requests will inherit GFP_NOFS implicitly.h](jS)}(h ``GFP_NOFS``h]hGFP_NOFS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhXA will use direct reclaim but will not use any filesystem interfaces. Please try to avoid using this flag directly and instead use memalloc_nofs_{save,restore} to mark the whole scope which cannot/shouldn’t recurse into the FS layer with a short explanation why. All allocation requests will inherit GFP_NOFS implicitly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhMIhj+ubjM)}(hX``GFP_USER`` is for userspace allocations that also need to be directly accessibly by the kernel or hardware. It is typically used by hardware for buffers that are mapped to userspace (e.g. graphics) that hardware still must DMA to. cpuset limits are enforced for these allocations.h](jS)}(h ``GFP_USER``h]hGFP_USER}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/ubhX is for userspace allocations that also need to be directly accessibly by the kernel or hardware. It is typically used by hardware for buffers that are mapped to userspace (e.g. graphics) that hardware still must DMA to. cpuset limits are enforced for these allocations.}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhMOhj+ubjM)}(hX``GFP_DMA`` exists for historical reasons and should be avoided where possible. The flags indicates that the caller requires that the lowest zone be used (``ZONE_DMA`` or 16M on x86-64). Ideally, this would be removed but it would require careful auditing as some users really require it and others use the flag to avoid lowmem reserves in ``ZONE_DMA`` and treat the lowest zone as a type of emergency reserve.h](jS)}(h ``GFP_DMA``h]hGFP_DMA}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLubh exists for historical reasons and should be avoided where possible. The flags indicates that the caller requires that the lowest zone be used (}(hjLhhhNhNubjS)}(h ``ZONE_DMA``h]hZONE_DMA}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLubh or 16M on x86-64). Ideally, this would be removed but it would require careful auditing as some users really require it and others use the flag to avoid lowmem reserves in }(hjLhhhNhNubjS)}(h ``ZONE_DMA``h]hZONE_DMA}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLubh: and treat the lowest zone as a type of emergency reserve.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhMThj+ubjM)}(h``GFP_DMA32`` is similar to ``GFP_DMA`` except that the caller requires a 32-bit address. Note that kmalloc(..., GFP_DMA32) does not return DMA32 memory because the DMA32 kmalloc cache array is not implemented. (Reason: there is no such user in kernel).h](jS)}(h ``GFP_DMA32``h]h GFP_DMA32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh is similar to }(hjhhhNhNubjS)}(h ``GFP_DMA``h]hGFP_DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh except that the caller requires a 32-bit address. Note that kmalloc(..., GFP_DMA32) does not return DMA32 memory because the DMA32 kmalloc cache array is not implemented. (Reason: there is no such user in kernel).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM[hj+ubjM)}(hX``GFP_HIGHUSER`` is for userspace allocations that may be mapped to userspace, do not need to be directly accessible by the kernel but that cannot move once in use. An example may be a hardware allocation that maps data directly into userspace but has no addressing limitations.h](jS)}(h``GFP_HIGHUSER``h]h GFP_HIGHUSER}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX is for userspace allocations that may be mapped to userspace, do not need to be directly accessible by the kernel but that cannot move once in use. An example may be a hardware allocation that maps data directly into userspace but has no addressing limitations.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhM`hj+ubjM)}(hX'``GFP_HIGHUSER_MOVABLE`` is for userspace allocations that the kernel does not need direct access to but can use kmap() when access is required. They are expected to be movable via page reclaim or page migration. Typically, pages on the LRU would also be allocated with ``GFP_HIGHUSER_MOVABLE``.h](jS)}(h``GFP_HIGHUSER_MOVABLE``h]hGFP_HIGHUSER_MOVABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh is for userspace allocations that the kernel does not need direct access to but can use kmap() when access is required. They are expected to be movable via page reclaim or page migration. Typically, pages on the LRU would also be allocated with }(hjhhhNhNubjS)}(h``GFP_HIGHUSER_MOVABLE``h]hGFP_HIGHUSER_MOVABLE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhMehj+ubjM)}(hXh``GFP_TRANSHUGE`` and ``GFP_TRANSHUGE_LIGHT`` are used for THP allocations. They are compound allocations that will generally fail quickly if memory is not available and will not wake kswapd/kcompactd on failure. The _LIGHT version does not attempt reclaim/compaction at all and is by default used in page fault path, while the non-light is used by khugepaged.h](jS)}(h``GFP_TRANSHUGE``h]h GFP_TRANSHUGE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh and }(hjhhhNhNubjS)}(h``GFP_TRANSHUGE_LIGHT``h]hGFP_TRANSHUGE_LIGHT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX; are used for THP allocations. They are compound allocations that will generally fail quickly if memory is not available and will not wake kswapd/kcompactd on failure. The _LIGHT version does not attempt reclaim/compaction at all and is by default used in page fault path, while the non-light is used by khugepaged.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:31: ./include/linux/gfp_types.hhMjhj+ubeh}(h]useful-gfp-flag-combinationsah ]h"]useful gfp flag combinationsah$]h&]uh1hhjIhhhNhNubeh}(h](memory-allocation-controlsj@eh ]h"](memory allocation controlsmm-api-gfp-flagseh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}jEj5sexpect_referenced_by_id}j@j5subh)}(hhh](h)}(hThe Slab Cacheh]hThe Slab Cache}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhhhhhK#ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hSLAB_HWCACHE_ALIGN (C macro)c.SLAB_HWCACHE_ALIGNhNtauh1hhjLhhhNhNubh)}(hhh](h)}(hSLAB_HWCACHE_ALIGNh]h)}(hSLAB_HWCACHE_ALIGNh]h)}(hSLAB_HWCACHE_ALIGNh]j)}(hjph]hSLAB_HWCACHE_ALIGN}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ](jjeh"]h$]h&]jjuh1hhjrhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKXubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjnhhhjhKXubah}(h]jiah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKXhjkhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjkhhhjhKXubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjLhNhNubjM)}(h``SLAB_HWCACHE_ALIGN``h]jS)}(hjh]hSLAB_HWCACHE_ALIGN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKZhjLhhubji)}(hX Align objects on cache line boundaries. **Description** Sufficiently large objects are aligned on cache line boundary. For object size smaller than a half of cache line size, the alignment is on the half of cache line size. In general, if object size is smaller than 1/2^n of cache line size, the alignment is adjusted to 1/2^n. If explicit alignment is also requested by the respective :c:type:`struct kmem_cache_args ` field, the greater of both is alignments is applied. h](ji)}(h(Align objects on cache line boundaries. h]jM)}(h'Align objects on cache line boundaries.h]h'Align objects on cache line boundaries.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKXhjubah}(h]h ]h"]h$]h&]uh1jhhjhKXhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKZhjubjM)}(hXSufficiently large objects are aligned on cache line boundary. For object size smaller than a half of cache line size, the alignment is on the half of cache line size. In general, if object size is smaller than 1/2^n of cache line size, the alignment is adjusted to 1/2^n.h]hXSufficiently large objects are aligned on cache line boundary. For object size smaller than a half of cache line size, the alignment is on the half of cache line size. In general, if object size is smaller than 1/2^n of cache line size, the alignment is adjusted to 1/2^n.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKYhjubjM)}(hIf explicit alignment is also requested by the respective :c:type:`struct kmem_cache_args ` field, the greater of both is alignments is applied.h](h:If explicit alignment is also requested by the respective }(hjhhhNhNubh)}(h2:c:type:`struct kmem_cache_args `h]jS)}(hjh]hstruct kmem_cache_args}(hjhhhNhNubah}(h]h ](xrefjAc-typeeh"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]refdoccore-api/mm-api refdomainjAreftypetype refexplicitrefwarnjpjs)}jv]sb reftargetkmem_cache_argsuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhK^hjubh5 field, the greater of both is alignments is applied.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj3hK^hjubeh}(h]h ]h"]h$]h&]uh1jhhjhKXhjLhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hSLAB_TYPESAFE_BY_RCU (C macro)c.SLAB_TYPESAFE_BY_RCUhNtauh1hhjLhhhNhNubh)}(hhh](h)}(hSLAB_TYPESAFE_BY_RCUh]h)}(hSLAB_TYPESAFE_BY_RCUh]h)}(hSLAB_TYPESAFE_BY_RCUh]j)}(hjWh]hSLAB_TYPESAFE_BY_RCU}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjYhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKlubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjUhhhjthKlubah}(h]jPah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjthKlhjRhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjRhhhjthKlubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjLhNhNubjM)}(h``SLAB_TYPESAFE_BY_RCU``h]jS)}(hjh]hSLAB_TYPESAFE_BY_RCU}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKnhjLhhubji)}(hX **WARNING** READ THIS! **Description** This delays freeing the SLAB page by a grace period, it does _NOT_ delay object freeing. This means that if you do kmem_cache_free() that memory location is free to be reused at any time. Thus it may be possible to see another object there in the same RCU grace period. This feature only ensures the memory location backing the object stays valid, the trick to using this is relying on an independent object validation pass. Something like: :: begin: rcu_read_lock(); obj = lockless_lookup(key); if (obj) { if (!try_get_ref(obj)) // might fail for free objects rcu_read_unlock(); goto begin; if (obj->key != key) { // not the object we expected put_ref(obj); rcu_read_unlock(); goto begin; } } rcu_read_unlock(); This is useful if we need to approach a kernel structure obliquely, from its address obtained without the usual locking. We can lock the structure to stabilize it and check it's still at the given address, only if we can be sure that the memory has not been meanwhile reused for some other kind of object (which our subsystem's lock might corrupt). rcu_read_lock before reading the address, then rcu_read_unlock after taking the spinlock within the structure expected at that address. Note that object identity check has to be done *after* acquiring a reference, therefore user has to ensure proper ordering for loads. Similarly, when initializing objects allocated with SLAB_TYPESAFE_BY_RCU, the newly allocated object has to be fully initialized *before* its refcount gets initialized and proper ordering for stores is required. refcount_{add|inc}_not_zero_acquire() and refcount_set_release() are designed with the proper fences required for reference counting objects allocated with SLAB_TYPESAFE_BY_RCU. Note that it is not possible to acquire a lock within a structure allocated with SLAB_TYPESAFE_BY_RCU without first acquiring a reference as described above. The reason is that SLAB_TYPESAFE_BY_RCU pages are not zeroed before being given to the slab, which means that any locks must be initialized after each and every kmem_struct_alloc(). Alternatively, make the ctor passed to kmem_cache_create() initialize the locks at page-allocation time, as is done in __i915_request_ctor(), sighand_ctor(), and anon_vma_ctor(). Such a ctor permits readers to safely acquire those ctor-initialized locks under rcu_read_lock() protection. Note that SLAB_TYPESAFE_BY_RCU was originally named SLAB_DESTROY_BY_RCU. h](ji)}(h**WARNING** READ THIS! h]jM)}(h**WARNING** READ THIS!h](j)}(h **WARNING**h]hWARNING}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh READ THIS!}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKlhjubah}(h]h ]h"]h$]h&]uh1jhhjhKlhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKnhjubjM)}(hX This delays freeing the SLAB page by a grace period, it does _NOT_ delay object freeing. This means that if you do kmem_cache_free() that memory location is free to be reused at any time. Thus it may be possible to see another object there in the same RCU grace period.h]hX This delays freeing the SLAB page by a grace period, it does _NOT_ delay object freeing. This means that if you do kmem_cache_free() that memory location is free to be reused at any time. Thus it may be possible to see another object there in the same RCU grace period.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKmhjubjM)}(hThis feature only ensures the memory location backing the object stays valid, the trick to using this is relying on an independent object validation pass. Something like:h]hThis feature only ensures the memory location backing the object stays valid, the trick to using this is relying on an independent object validation pass. Something like:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKrhjubh literal_block)}(hX3begin: rcu_read_lock(); obj = lockless_lookup(key); if (obj) { if (!try_get_ref(obj)) // might fail for free objects rcu_read_unlock(); goto begin; if (obj->key != key) { // not the object we expected put_ref(obj); rcu_read_unlock(); goto begin; } } rcu_read_unlock();h]hX3begin: rcu_read_lock(); obj = lockless_lookup(key); if (obj) { if (!try_get_ref(obj)) // might fail for free objects rcu_read_unlock(); goto begin; if (obj->key != key) { // not the object we expected put_ref(obj); rcu_read_unlock(); goto begin; } } rcu_read_unlock();}hj sbah}(h]h ]h"]h$]h&]jjuh1j hT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKxhjubjM)}(hX\This is useful if we need to approach a kernel structure obliquely, from its address obtained without the usual locking. We can lock the structure to stabilize it and check it's still at the given address, only if we can be sure that the memory has not been meanwhile reused for some other kind of object (which our subsystem's lock might corrupt).h]hX`This is useful if we need to approach a kernel structure obliquely, from its address obtained without the usual locking. We can lock the structure to stabilize it and check it’s still at the given address, only if we can be sure that the memory has not been meanwhile reused for some other kind of object (which our subsystem’s lock might corrupt).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubjM)}(hrcu_read_lock before reading the address, then rcu_read_unlock after taking the spinlock within the structure expected at that address.h]hrcu_read_lock before reading the address, then rcu_read_unlock after taking the spinlock within the structure expected at that address.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubjM)}(hX Note that object identity check has to be done *after* acquiring a reference, therefore user has to ensure proper ordering for loads. Similarly, when initializing objects allocated with SLAB_TYPESAFE_BY_RCU, the newly allocated object has to be fully initialized *before* its refcount gets initialized and proper ordering for stores is required. refcount_{add|inc}_not_zero_acquire() and refcount_set_release() are designed with the proper fences required for reference counting objects allocated with SLAB_TYPESAFE_BY_RCU.h](h/Note that object identity check has to be done }(hj9hhhNhNubhemphasis)}(h*after*h]hafter}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jAhj9ubh acquiring a reference, therefore user has to ensure proper ordering for loads. Similarly, when initializing objects allocated with SLAB_TYPESAFE_BY_RCU, the newly allocated object has to be fully initialized }(hj9hhhNhNubjB)}(h*before*h]hbefore}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhj9ubh its refcount gets initialized and proper ordering for stores is required. refcount_{add|inc}_not_zero_acquire() and refcount_set_release() are designed with the proper fences required for reference counting objects allocated with SLAB_TYPESAFE_BY_RCU.}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubjM)}(hXuNote that it is not possible to acquire a lock within a structure allocated with SLAB_TYPESAFE_BY_RCU without first acquiring a reference as described above. The reason is that SLAB_TYPESAFE_BY_RCU pages are not zeroed before being given to the slab, which means that any locks must be initialized after each and every kmem_struct_alloc(). Alternatively, make the ctor passed to kmem_cache_create() initialize the locks at page-allocation time, as is done in __i915_request_ctor(), sighand_ctor(), and anon_vma_ctor(). Such a ctor permits readers to safely acquire those ctor-initialized locks under rcu_read_lock() protection.h]hXuNote that it is not possible to acquire a lock within a structure allocated with SLAB_TYPESAFE_BY_RCU without first acquiring a reference as described above. The reason is that SLAB_TYPESAFE_BY_RCU pages are not zeroed before being given to the slab, which means that any locks must be initialized after each and every kmem_struct_alloc(). Alternatively, make the ctor passed to kmem_cache_create() initialize the locks at page-allocation time, as is done in __i915_request_ctor(), sighand_ctor(), and anon_vma_ctor(). Such a ctor permits readers to safely acquire those ctor-initialized locks under rcu_read_lock() protection.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubjM)}(hHNote that SLAB_TYPESAFE_BY_RCU was originally named SLAB_DESTROY_BY_RCU.h]hHNote that SLAB_TYPESAFE_BY_RCU was originally named SLAB_DESTROY_BY_RCU.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhhjhKlhjLhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hSLAB_ACCOUNT (C macro)c.SLAB_ACCOUNThNtauh1hhjLhhhNhNubh)}(hhh](h)}(h SLAB_ACCOUNTh]h)}(h SLAB_ACCOUNTh]h)}(h SLAB_ACCOUNTh]j)}(hjh]h SLAB_ACCOUNT}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjLhNhNubjM)}(h``SLAB_ACCOUNT``h]jS)}(hjh]h SLAB_ACCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjLhhubji)}(h Account allocations to memcg. **Description** All object allocations from this cache will be memcg accounted, regardless of __GFP_ACCOUNT being or not being passed to individual allocations. h](ji)}(hAccount allocations to memcg. h]jM)}(hAccount allocations to memcg.h]hAccount allocations to memcg.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubah}(h]h ]h"]h$]h&]uh1jhhj hKhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubjM)}(hAll object allocations from this cache will be memcg accounted, regardless of __GFP_ACCOUNT being or not being passed to individual allocations.h]hAll object allocations from this cache will be memcg accounted, regardless of __GFP_ACCOUNT being or not being passed to individual allocations.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhhj hKhjLhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hSLAB_RECLAIM_ACCOUNT (C macro)c.SLAB_RECLAIM_ACCOUNThNtauh1hhjLhhhNhNubh)}(hhh](h)}(hSLAB_RECLAIM_ACCOUNTh]h)}(hSLAB_RECLAIM_ACCOUNTh]h)}(hSLAB_RECLAIM_ACCOUNTh]j)}(hjTh]hSLAB_RECLAIM_ACCOUNT}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ](jjeh"]h$]h&]jjuh1hhjVhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjRhhhjqhKubah}(h]jMah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjqhKhjOhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjOhhhjqhKubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjLhNhNubjM)}(h``SLAB_RECLAIM_ACCOUNT``h]jS)}(hjh]hSLAB_RECLAIM_ACCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjLhhubji)}(hX  Objects are reclaimable. **Description** Use this flag for caches that have an associated shrinker. As a result, slab pages are allocated with __GFP_RECLAIMABLE, which affects grouping pages by mobility, and are accounted in SReclaimable counter in /proc/meminfo h](ji)}(hObjects are reclaimable. h]jM)}(hObjects are reclaimable.h]hObjects are reclaimable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubah}(h]h ]h"]h$]h&]uh1jhhjhKhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubjM)}(hUse this flag for caches that have an associated shrinker. As a result, slab pages are allocated with __GFP_RECLAIMABLE, which affects grouping pages by mobility, and are accounted in SReclaimable counter in /proc/meminfoh]hUse this flag for caches that have an associated shrinker. As a result, slab pages are allocated with __GFP_RECLAIMABLE, which affects grouping pages by mobility, and are accounted in SReclaimable counter in /proc/meminfo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhjubeh}(h]h ]h"]h$]h&]uh1jhhjhKhjLhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmem_cache_args (C struct)c.kmem_cache_argshNtauh1hhjLhhhNhNubh)}(hhh](h)}(hkmem_cache_argsh]h)}(hstruct kmem_cache_argsh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubh)}(hkmem_cache_argsh]j)}(hjh]hkmem_cache_args}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]jM)}(h-Less common arguments for kmem_cache_create()h]h-Less common arguments for kmem_cache_create()}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjHhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAstructeh"]h$]h&]jFjAjGjcjHjcjIjJjKuh1hhhhjLhNhNubj)}(hX **Definition**:: struct kmem_cache_args { unsigned int align; unsigned int useroffset; unsigned int usersize; unsigned int freeptr_offset; bool use_freeptr_offset; void (*ctor)(void *); unsigned int sheaf_capacity; }; **Members** ``align`` The required alignment for the objects. ``0`` means no specific alignment is requested. ``useroffset`` Usercopy region offset. ``0`` is a valid offset, when **usersize** is non-``0`` ``usersize`` Usercopy region size. ``0`` means no usercopy region is specified. ``freeptr_offset`` Custom offset for the free pointer in caches with :c:type:`SLAB_TYPESAFE_BY_RCU` or **ctor** By default, :c:type:`SLAB_TYPESAFE_BY_RCU` and **ctor** caches place the free pointer outside of the object. This might cause the object to grow in size. Cache creators that have a reason to avoid this can specify a custom free pointer offset in their data structure where the free pointer will be placed. For caches with :c:type:`SLAB_TYPESAFE_BY_RCU`, the caller must ensure that the free pointer does not overlay fields required to guard against object recycling (See :c:type:`SLAB_TYPESAFE_BY_RCU` for details). For caches with **ctor**, the caller must ensure that the free pointer does not overlay fields initialized by the constructor. Currently, only caches with :c:type:`SLAB_TYPESAFE_BY_RCU` or **ctor** may specify **freeptr_offset**. Using ``0`` as a value for **freeptr_offset** is valid. If **freeptr_offset** is specified, **use_freeptr_offset** must be set ``true``. ``use_freeptr_offset`` Whether a **freeptr_offset** is used. ``ctor`` A constructor for the objects. The constructor is invoked for each object in a newly allocated slab page. It is the cache user's responsibility to free object in the same state as after calling the constructor, or deal appropriately with any differences between a freshly constructed and a reallocated object. ``NULL`` means no constructor. ``sheaf_capacity`` Enable sheaves of given capacity for the cache. With a non-zero value, allocations from the cache go through caching arrays called sheaves. Each cpu has a main sheaf that's always present, and a spare sheaf that may be not present. When both become empty, there's an attempt to replace an empty sheaf with a full sheaf from the per-node barn. When no full sheaf is available, and gfp flags allow blocking, a sheaf is allocated and filled from slab(s) using bulk allocation. Otherwise the allocation falls back to the normal operation allocating a single object from a slab. Analogically when freeing and both percpu sheaves are full, the barn may replace it with an empty sheaf, unless it's over capacity. In that case a sheaf is bulk freed to slab pages. The sheaves do not enforce NUMA placement of objects, so allocations via kmem_cache_alloc_node() with a node specified other than NUMA_NO_NODE will bypass them. Bulk allocation and free operations also try to use the cpu sheaves and barn, but fallback to using slab pages directly. When slub_debug is enabled for the cache, the sheaf_capacity argument is ignored. ``0`` means no sheaves will be created.h](jM)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh:}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM"hjgubj )}(hstruct kmem_cache_args { unsigned int align; unsigned int useroffset; unsigned int usersize; unsigned int freeptr_offset; bool use_freeptr_offset; void (*ctor)(void *); unsigned int sheaf_capacity; };h]hstruct kmem_cache_args { unsigned int align; unsigned int useroffset; unsigned int usersize; unsigned int freeptr_offset; bool use_freeptr_offset; void (*ctor)(void *); unsigned int sheaf_capacity; };}hjsbah}(h]h ]h"]h$]h&]jjuh1j hT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM$hjgubjM)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM.hjgubj)}(hhh](j)}(hc``align`` The required alignment for the objects. ``0`` means no specific alignment is requested. h](j)}(h ``align``h]jS)}(hjh]halign}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM.hjubj)}(hhh](jM)}(h'The required alignment for the objects.h]h'The required alignment for the objects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM,hjubjM)}(h/``0`` means no specific alignment is requested.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh* means no specific alignment is requested.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhM.hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjubj)}(h```useroffset`` Usercopy region offset. ``0`` is a valid offset, when **usersize** is non-``0`` h](j)}(h``useroffset``h]jS)}(hjh]h useroffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM4hjubj)}(hhh](jM)}(hUsercopy region offset.h]hUsercopy region offset.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM2hj$ubjM)}(h7``0`` is a valid offset, when **usersize** is non-``0``h](jS)}(h``0``h]h0}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubh is a valid offset, when }(hj6hhhNhNubj)}(h **usersize**h]husersize}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh is non-}(hj6hhhNhNubjS)}(h``0``h]h0}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubeh}(h]h ]h"]h$]h&]uh1jLhj#hM4hj$ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#hM4hjubj)}(hQ``usersize`` Usercopy region size. ``0`` means no usercopy region is specified. h](j)}(h ``usersize``h]jS)}(hjh]husersize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM:hj~ubj)}(hhh](jM)}(hUsercopy region size.h]hUsercopy region size.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM8hjubjM)}(h,``0`` means no usercopy region is specified.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh' means no usercopy region is specified.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhM:hjubeh}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jhjhM:hjubj)}(hX``freeptr_offset`` Custom offset for the free pointer in caches with :c:type:`SLAB_TYPESAFE_BY_RCU` or **ctor** By default, :c:type:`SLAB_TYPESAFE_BY_RCU` and **ctor** caches place the free pointer outside of the object. This might cause the object to grow in size. Cache creators that have a reason to avoid this can specify a custom free pointer offset in their data structure where the free pointer will be placed. For caches with :c:type:`SLAB_TYPESAFE_BY_RCU`, the caller must ensure that the free pointer does not overlay fields required to guard against object recycling (See :c:type:`SLAB_TYPESAFE_BY_RCU` for details). For caches with **ctor**, the caller must ensure that the free pointer does not overlay fields initialized by the constructor. Currently, only caches with :c:type:`SLAB_TYPESAFE_BY_RCU` or **ctor** may specify **freeptr_offset**. Using ``0`` as a value for **freeptr_offset** is valid. If **freeptr_offset** is specified, **use_freeptr_offset** must be set ``true``. h](j)}(h``freeptr_offset``h]jS)}(hjh]hfreeptr_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMRhjubj)}(hhh](jM)}(h\Custom offset for the free pointer in caches with :c:type:`SLAB_TYPESAFE_BY_RCU` or **ctor**h](h2Custom offset for the free pointer in caches with }(hjhhhNhNubh)}(h:c:type:`SLAB_TYPESAFE_BY_RCU`h]jS)}(hjh]hSLAB_TYPESAFE_BY_RCU}(hjhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_TYPESAFE_BY_RCUuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM>hjubh or }(hjhhhNhNubj)}(h**ctor**h]hctor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhjhM>hjubjM)}(hX1By default, :c:type:`SLAB_TYPESAFE_BY_RCU` and **ctor** caches place the free pointer outside of the object. This might cause the object to grow in size. Cache creators that have a reason to avoid this can specify a custom free pointer offset in their data structure where the free pointer will be placed.h](h By default, }(hj3hhhNhNubh)}(h:c:type:`SLAB_TYPESAFE_BY_RCU`h]jS)}(hj=h]hSLAB_TYPESAFE_BY_RCU}(hj?hhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_TYPESAFE_BY_RCUuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMAhj3ubh and }(hj3hhhNhNubj)}(h**ctor**h]hctor}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh caches place the free pointer outside of the object. This might cause the object to grow in size. Cache creators that have a reason to avoid this can specify a custom free pointer offset in their data structure where the free pointer will be placed.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjZhMAhjubjM)}(hFor caches with :c:type:`SLAB_TYPESAFE_BY_RCU`, the caller must ensure that the free pointer does not overlay fields required to guard against object recycling (See :c:type:`SLAB_TYPESAFE_BY_RCU` for details).h](hFor caches with }(hjwhhhNhNubh)}(h:c:type:`SLAB_TYPESAFE_BY_RCU`h]jS)}(hjh]hSLAB_TYPESAFE_BY_RCU}(hjhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_TYPESAFE_BY_RCUuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMGhjwubhw, the caller must ensure that the free pointer does not overlay fields required to guard against object recycling (See }(hjwhhhNhNubh)}(h:c:type:`SLAB_TYPESAFE_BY_RCU`h]jS)}(hjh]hSLAB_TYPESAFE_BY_RCU}(hjhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_TYPESAFE_BY_RCUuh1hhjhMGhjwubh for details).}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMGhjubjM)}(h~For caches with **ctor**, the caller must ensure that the free pointer does not overlay fields initialized by the constructor.h](hFor caches with }(hjhhhNhNubj)}(h**ctor**h]hctor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf, the caller must ensure that the free pointer does not overlay fields initialized by the constructor.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMKhjubjM)}(hfCurrently, only caches with :c:type:`SLAB_TYPESAFE_BY_RCU` or **ctor** may specify **freeptr_offset**.h](hCurrently, only caches with }(hjhhhNhNubh)}(h:c:type:`SLAB_TYPESAFE_BY_RCU`h]jS)}(hjh]hSLAB_TYPESAFE_BY_RCU}(hjhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_TYPESAFE_BY_RCUuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMNhjubh or }(hjhhhNhNubj)}(h**ctor**h]hctor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh may specify }(hjhhhNhNubj)}(h**freeptr_offset**h]hfreeptr_offset}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMNhjubjM)}(hUsing ``0`` as a value for **freeptr_offset** is valid. If **freeptr_offset** is specified, **use_freeptr_offset** must be set ``true``.h](hUsing }(hjChhhNhNubjS)}(h``0``h]h0}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubh as a value for }(hjChhhNhNubj)}(h**freeptr_offset**h]hfreeptr_offset}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh is valid. If }(hjChhhNhNubj)}(h**freeptr_offset**h]hfreeptr_offset}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh is specified, }(hjChhhNhNubj)}(h**use_freeptr_offset**h]huse_freeptr_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh must be set }(hjChhhNhNubjS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubh.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMQhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMRhjubj)}(h=``use_freeptr_offset`` Whether a **freeptr_offset** is used. h](j)}(h``use_freeptr_offset``h]jS)}(hjh]huse_freeptr_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMVhjubj)}(hhh]jM)}(h%Whether a **freeptr_offset** is used.h](h Whether a }(hjhhhNhNubj)}(h**freeptr_offset**h]hfreeptr_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is used.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMVhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMVhjubj)}(hX```ctor`` A constructor for the objects. The constructor is invoked for each object in a newly allocated slab page. It is the cache user's responsibility to free object in the same state as after calling the constructor, or deal appropriately with any differences between a freshly constructed and a reallocated object. ``NULL`` means no constructor. h](j)}(h``ctor``h]jS)}(hj h]hctor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMbhjubj)}(hhh](jM)}(hA constructor for the objects.h]hA constructor for the objects.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMZhjubjM)}(hXThe constructor is invoked for each object in a newly allocated slab page. It is the cache user's responsibility to free object in the same state as after calling the constructor, or deal appropriately with any differences between a freshly constructed and a reallocated object.h]hXThe constructor is invoked for each object in a newly allocated slab page. It is the cache user’s responsibility to free object in the same state as after calling the constructor, or deal appropriately with any differences between a freshly constructed and a reallocated object.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM\hjubjM)}(h``NULL`` means no constructor.h](jS)}(h``NULL``h]hNULL}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubh means no constructor.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMbhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMbhjubj)}(hX``sheaf_capacity`` Enable sheaves of given capacity for the cache. With a non-zero value, allocations from the cache go through caching arrays called sheaves. Each cpu has a main sheaf that's always present, and a spare sheaf that may be not present. When both become empty, there's an attempt to replace an empty sheaf with a full sheaf from the per-node barn. When no full sheaf is available, and gfp flags allow blocking, a sheaf is allocated and filled from slab(s) using bulk allocation. Otherwise the allocation falls back to the normal operation allocating a single object from a slab. Analogically when freeing and both percpu sheaves are full, the barn may replace it with an empty sheaf, unless it's over capacity. In that case a sheaf is bulk freed to slab pages. The sheaves do not enforce NUMA placement of objects, so allocations via kmem_cache_alloc_node() with a node specified other than NUMA_NO_NODE will bypass them. Bulk allocation and free operations also try to use the cpu sheaves and barn, but fallback to using slab pages directly. When slub_debug is enabled for the cache, the sheaf_capacity argument is ignored. ``0`` means no sheaves will be created.h](j)}(h``sheaf_capacity``h]jS)}(hjnh]hsheaf_capacity}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjlubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjhubj)}(hhh](jM)}(h/Enable sheaves of given capacity for the cache.h]h/Enable sheaves of given capacity for the cache.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMfhjubjM)}(hX&With a non-zero value, allocations from the cache go through caching arrays called sheaves. Each cpu has a main sheaf that's always present, and a spare sheaf that may be not present. When both become empty, there's an attempt to replace an empty sheaf with a full sheaf from the per-node barn.h]hX*With a non-zero value, allocations from the cache go through caching arrays called sheaves. Each cpu has a main sheaf that’s always present, and a spare sheaf that may be not present. When both become empty, there’s an attempt to replace an empty sheaf with a full sheaf from the per-node barn.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhhjubjM)}(hWhen no full sheaf is available, and gfp flags allow blocking, a sheaf is allocated and filled from slab(s) using bulk allocation. Otherwise the allocation falls back to the normal operation allocating a single object from a slab.h]hWhen no full sheaf is available, and gfp flags allow blocking, a sheaf is allocated and filled from slab(s) using bulk allocation. Otherwise the allocation falls back to the normal operation allocating a single object from a slab.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMnhjubjM)}(hAnalogically when freeing and both percpu sheaves are full, the barn may replace it with an empty sheaf, unless it's over capacity. In that case a sheaf is bulk freed to slab pages.h]hAnalogically when freeing and both percpu sheaves are full, the barn may replace it with an empty sheaf, unless it’s over capacity. In that case a sheaf is bulk freed to slab pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMshjubjM)}(hThe sheaves do not enforce NUMA placement of objects, so allocations via kmem_cache_alloc_node() with a node specified other than NUMA_NO_NODE will bypass them.h]hThe sheaves do not enforce NUMA placement of objects, so allocations via kmem_cache_alloc_node() with a node specified other than NUMA_NO_NODE will bypass them.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMwhjubjM)}(hxBulk allocation and free operations also try to use the cpu sheaves and barn, but fallback to using slab pages directly.h]hxBulk allocation and free operations also try to use the cpu sheaves and barn, but fallback to using slab pages directly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM{hjubjM)}(hQWhen slub_debug is enabled for the cache, the sheaf_capacity argument is ignored.h]hQWhen slub_debug is enabled for the cache, the sheaf_capacity argument is ignored.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM~hjubjM)}(h'``0`` means no sheaves will be created.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh" means no sheaves will be created.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjubeh}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubjM)}(h**Description**h]j)}(hj(h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjLhhubjM)}(hX4Any uninitialized fields of the structure are interpreted as unused. The exception is **freeptr_offset** where ``0`` is a valid value, so **use_freeptr_offset** must be also set to ``true`` in order to interpret the field as used. For **useroffset** ``0`` is also valid, but only with non-``0`` **usersize**.h](hVAny uninitialized fields of the structure are interpreted as unused. The exception is }(hj>hhhNhNubj)}(h**freeptr_offset**h]hfreeptr_offset}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh where }(hj>hhhNhNubjS)}(h``0``h]h0}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubh is a valid value, so }(hj>hhhNhNubj)}(h**use_freeptr_offset**h]huse_freeptr_offset}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh must be also set to }(hj>hhhNhNubjS)}(h``true``h]htrue}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubh. in order to interpret the field as used. For }(hj>hhhNhNubj)}(h**useroffset**h]h useroffset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh }(hj>hhhNhNubjS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubh" is also valid, but only with non-}(hj>hhhNhNubjS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubh }(hj>hhhNhNubj)}(h **usersize**h]husersize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjLhhubjM)}(h[When ``NULL`` args is passed to kmem_cache_create(), it is equivalent to all fields unused.h](hWhen }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhN args is passed to kmem_cache_create(), it is equivalent to all fields unused.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM%hjLhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'kmem_cache_create_usercopy (C function)c.kmem_cache_create_usercopyhNtauh1hhjLhhhNhNubh)}(hhh](h)}(hstruct kmem_cache * kmem_cache_create_usercopy (const char *name, unsigned int size, unsigned int align, slab_flags_t flags, unsigned int useroffset, unsigned int usersize, void (*ctor)(void *))h]h)}(hstruct kmem_cache *kmem_cache_create_usercopy(const char *name, unsigned int size, unsigned int align, slab_flags_t flags, unsigned int useroffset, unsigned int usersize, void (*ctor)(void*))h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj$hMubh)}(hhh]j)}(h kmem_cacheh]h kmem_cache}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]jy)}jlkmem_cache_create_usercopysbc.kmem_cache_create_usercopyasbuh1hhjhhhj$hMubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj$hMubjF )}(hjI h]h*}(hjehhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj$hMubh)}(hkmem_cache_create_usercopyh]j)}(hjTh]hkmem_cache_create_usercopy}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj$hMubj )}(h(const char *name, unsigned int size, unsigned int align, slab_flags_t flags, unsigned int useroffset, unsigned int usersize, void (*ctor)(void*))h](j )}(hconst char *nameh](j5)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int sizeh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj' hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int alignh](j)}(hunsignedh]hunsigned}(hj@ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubj)}(h h]h }(hjN hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubj)}(hinth]hint}(hj\ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubj)}(h h]h }(hjj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubj)}(halignh]halign}(hjx hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj< ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hslab_flags_t flagsh](h)}(hhh]j)}(h slab_flags_th]h slab_flags_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jRc.kmem_cache_create_usercopyasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hflagsh]hflags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int useroffseth](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h useroffseth]h useroffset}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int usersizeh](j)}(hunsignedh]hunsigned}(hj*!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&!ubj)}(h h]h }(hj8!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&!ubj)}(hinth]hint}(hjF!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&!ubj)}(h h]h }(hjT!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&!ubj)}(husersizeh]husersize}(hjb!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hvoid (*ctor)(void*)h](j)}(hvoidh]hvoid}(hj{!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw!ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw!ubjF )}(h(h]h(}(hj!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw!ubjF )}(hjI h]h*}(hj!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw!ubj)}(hctorh]hctor}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw!ubjF )}(h)h]h)}(hj!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw!ubjF )}(hj!h]h(}(hj!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw!ubj)}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw!ubjF )}(hjI h]h*}(hj!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw!ubjF )}(hj!h]h)}(hj!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj$hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj$hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj$hMhj hhubj4)}(hhh]jM)}(hDCreate a kmem cache with a region suitable for copying to userspace.h]hDCreate a kmem cache with a region suitable for copying to userspace.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj"hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj$hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj7"jHj7"jIjJjKuh1hhhhjLhNhNubj)}(hX **Parameters** ``const char *name`` A string which is used in /proc/slabinfo to identify this cache. ``unsigned int size`` The size of objects to be created in this cache. ``unsigned int align`` The required alignment for the objects. ``slab_flags_t flags`` SLAB flags ``unsigned int useroffset`` Usercopy region offset ``unsigned int usersize`` Usercopy region size ``void (*ctor)(void *)`` A constructor for the objects, or ``NULL``. **Description** This is a legacy wrapper, new code should use either KMEM_CACHE_USERCOPY() if whitelisting a single field is sufficient, or kmem_cache_create() with the necessary parameters passed via the args parameter (see :c:type:`struct kmem_cache_args `) **Return** a pointer to the cache on success, NULL on failure.h](jM)}(h**Parameters**h]j)}(hjA"h]h Parameters}(hjC"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?"ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj;"ubj)}(hhh](j)}(hV``const char *name`` A string which is used in /proc/slabinfo to identify this cache. h](j)}(h``const char *name``h]jS)}(hj`"h]hconst char *name}(hjb"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^"ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjZ"ubj)}(hhh]jM)}(h@A string which is used in /proc/slabinfo to identify this cache.h]h@A string which is used in /proc/slabinfo to identify this cache.}(hjy"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhju"hMhjv"ubah}(h]h ]h"]h$]h&]uh1jhjZ"ubeh}(h]h ]h"]h$]h&]uh1jhju"hMhjW"ubj)}(hG``unsigned int size`` The size of objects to be created in this cache. h](j)}(h``unsigned int size``h]jS)}(hj"h]hunsigned int size}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj"ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj"ubj)}(hhh]jM)}(h0The size of objects to be created in this cache.h]h0The size of objects to be created in this cache.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMhjW"ubj)}(h?``unsigned int align`` The required alignment for the objects. h](j)}(h``unsigned int align``h]jS)}(hj"h]hunsigned int align}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj"ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj"ubj)}(hhh]jM)}(h'The required alignment for the objects.h]h'The required alignment for the objects.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"hMhjW"ubj)}(h"``slab_flags_t flags`` SLAB flags h](j)}(h``slab_flags_t flags``h]jS)}(hj #h]hslab_flags_t flags}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj #ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj#ubj)}(hhh]jM)}(h SLAB flagsh]h SLAB flags}(hj$#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj #hMhj!#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj #hMhjW"ubj)}(h3``unsigned int useroffset`` Usercopy region offset h](j)}(h``unsigned int useroffset``h]jS)}(hjD#h]hunsigned int useroffset}(hjF#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjB#ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj>#ubj)}(hhh]jM)}(hUsercopy region offseth]hUsercopy region offset}(hj]#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjY#hMhjZ#ubah}(h]h ]h"]h$]h&]uh1jhj>#ubeh}(h]h ]h"]h$]h&]uh1jhjY#hMhjW"ubj)}(h/``unsigned int usersize`` Usercopy region size h](j)}(h``unsigned int usersize``h]jS)}(hj}#h]hunsigned int usersize}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj{#ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjw#ubj)}(hhh]jM)}(hUsercopy region sizeh]hUsercopy region size}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhjw#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhjW"ubj)}(hE``void (*ctor)(void *)`` A constructor for the objects, or ``NULL``. h](j)}(h``void (*ctor)(void *)``h]jS)}(hj#h]hvoid (*ctor)(void *)}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj#ubj)}(hhh]jM)}(h+A constructor for the objects, or ``NULL``.h](h"A constructor for the objects, or }(hj#hhhNhNubjS)}(h``NULL``h]hNULL}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhjW"ubeh}(h]h ]h"]h$]h&]uh1jhj;"ubjM)}(h**Description**h]j)}(hj$h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj;"ubjM)}(hXThis is a legacy wrapper, new code should use either KMEM_CACHE_USERCOPY() if whitelisting a single field is sufficient, or kmem_cache_create() with the necessary parameters passed via the args parameter (see :c:type:`struct kmem_cache_args `)h](hThis is a legacy wrapper, new code should use either KMEM_CACHE_USERCOPY() if whitelisting a single field is sufficient, or kmem_cache_create() with the necessary parameters passed via the args parameter (see }(hj$hhhNhNubh)}(h2:c:type:`struct kmem_cache_args `h]jS)}(hj#$h]hstruct kmem_cache_args}(hj%$hhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhj!$ubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1kmem_cache_argsuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubh)}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj@$hMhj;"ubjM)}(h **Return**h]j)}(hjM$h]hReturn}(hjO$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK$ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj;"ubjM)}(h3a pointer to the cache on success, NULL on failure.h]h3a pointer to the cache on success, NULL on failure.}(hjc$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj;"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmem_cache_create (C macro)c.kmem_cache_createhNtauh1hhjLhhhNhNubh)}(hhh](h)}(hkmem_cache_createh]h)}(hkmem_cache_createh]h)}(hkmem_cache_createh]j)}(hj$h]hkmem_cache_create}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj$hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj$hhhj$hMubah}(h]j$ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj$hMhj$hhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hj$hhhj$hMubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGj$jHj$jIjJjKuh1hhhhjLhNhNubjM)}(h:``kmem_cache_create (__name, __object_size, __args, ...)``h]jS)}(hj$h]h6kmem_cache_create (__name, __object_size, __args, ...)}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj$ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjLhhubji)}(hCreate a kmem cache. h]jM)}(hCreate a kmem cache.h]hCreate a kmem cache.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubah}(h]h ]h"]h$]h&]uh1jhhj$hMhjLhhubj)}(hX**Parameters** ``__name`` A string which is used in /proc/slabinfo to identify this cache. ``__object_size`` The size of objects to be created in this cache. ``__args`` Optional arguments, see :c:type:`struct kmem_cache_args `. Passing ``NULL`` means defaults will be used for all the arguments. ``...`` variable arguments **Description** This is currently implemented as a macro using ``_Generic()`` to call either the new variant of the function, or a legacy one. The new variant has 4 parameters: ``kmem_cache_create(name, object_size, args, flags)`` See __kmem_cache_create_args() which implements this. The legacy variant has 5 parameters: ``kmem_cache_create(name, object_size, align, flags, ctor)`` The align and ctor parameters map to the respective fields of :c:type:`struct kmem_cache_args ` **Context** Cannot be called within a interrupt, but can be interrupted. **Return** a pointer to the cache on success, NULL on failure.h](jM)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubj)}(hhh](j)}(hL``__name`` A string which is used in /proc/slabinfo to identify this cache. h](j)}(h ``__name``h]jS)}(hj%h]h__name}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj%ubj)}(hhh]jM)}(h@A string which is used in /proc/slabinfo to identify this cache.h]h@A string which is used in /proc/slabinfo to identify this cache.}(hj5%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1%hMhj2%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj1%hMhj%ubj)}(hC``__object_size`` The size of objects to be created in this cache. h](j)}(h``__object_size``h]jS)}(hjU%h]h __object_size}(hjW%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjS%ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjO%ubj)}(hhh]jM)}(h0The size of objects to be created in this cache.h]h0The size of objects to be created in this cache.}(hjn%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjj%hMhjk%ubah}(h]h ]h"]h$]h&]uh1jhjO%ubeh}(h]h ]h"]h$]h&]uh1jhjj%hMhj%ubj)}(h``__args`` Optional arguments, see :c:type:`struct kmem_cache_args `. Passing ``NULL`` means defaults will be used for all the arguments. h](j)}(h ``__args``h]jS)}(hj%h]h__args}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj%ubj)}(hhh]jM)}(hOptional arguments, see :c:type:`struct kmem_cache_args `. Passing ``NULL`` means defaults will be used for all the arguments.h](hOptional arguments, see }(hj%hhhNhNubh)}(h2:c:type:`struct kmem_cache_args `h]jS)}(hj%h]hstruct kmem_cache_args}(hj%hhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1kmem_cache_argsuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj%ubh . Passing }(hj%hhhNhNubjS)}(h``NULL``h]hNULL}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubh3 means defaults will be used for all the arguments.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhj%ubj)}(h``...`` variable arguments h](j)}(h``...``h]jS)}(hj%h]h...}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhj%ubj)}(hhh]jM)}(hvariable argumentsh]hvariable arguments}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj&hKhj&ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj&hKhj%ubeh}(h]h ]h"]h$]h&]uh1jhj$ubjM)}(h**Description**h]j)}(hj8&h]h Description}(hj:&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6&ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhKhj$ubjM)}(h~This is currently implemented as a macro using ``_Generic()`` to call either the new variant of the function, or a legacy one.h](h/This is currently implemented as a macro using }(hjN&hhhNhNubjS)}(h``_Generic()``h]h _Generic()}(hjV&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjN&ubhA to call either the new variant of the function, or a legacy one.}(hjN&hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubjM)}(hWThe new variant has 4 parameters: ``kmem_cache_create(name, object_size, args, flags)``h](h"The new variant has 4 parameters: }(hjo&hhhNhNubjS)}(h5``kmem_cache_create(name, object_size, args, flags)``h]h1kmem_cache_create(name, object_size, args, flags)}(hjw&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjo&ubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubjM)}(h5See __kmem_cache_create_args() which implements this.h]h5See __kmem_cache_create_args() which implements this.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubjM)}(haThe legacy variant has 5 parameters: ``kmem_cache_create(name, object_size, align, flags, ctor)``h](h%The legacy variant has 5 parameters: }(hj&hhhNhNubjS)}(h<``kmem_cache_create(name, object_size, align, flags, ctor)``h]h8kmem_cache_create(name, object_size, align, flags, ctor)}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubjM)}(hpThe align and ctor parameters map to the respective fields of :c:type:`struct kmem_cache_args `h](h>The align and ctor parameters map to the respective fields of }(hj&hhhNhNubh)}(h2:c:type:`struct kmem_cache_args `h]jS)}(hj&h]hstruct kmem_cache_args}(hj&hhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1kmem_cache_argsuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj&ubeh}(h]h ]h"]h$]h&]uh1jLhj&hMhj$ubjM)}(h **Context**h]j)}(hj&h]hContext}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj$ubjM)}(h+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMBhj?)ubjM)}(hkIn any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes.h]hkIn any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes.}(hjM+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMFhj?)ubjM)}(h **Return**h]j)}(hj^+h]hReturn}(hj`+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\+ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMIhj?)ubjM)}(hvoid *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)h](j)}(hvoidh]hvoid}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMMubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhj+hMMubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj+hhhj+hMMubh)}(hkmem_cache_alloch]j)}(hkmem_cache_alloch]hkmem_cache_alloc}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj+hhhj+hMMubj )}(h((struct kmem_cache *cachep, gfp_t flags)h](j )}(hstruct kmem_cache *cacheph](j5)}(hj8h]hstruct}(hj+hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj+ubj)}(h h]h }(hj ,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(h kmem_cacheh]h kmem_cache}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj,modnameN classnameNjpjs)}jv]jy)}jlj+sbc.kmem_cache_allocasbuh1hhj+ubj)}(h h]h }(hj=,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubjF )}(hjI h]h*}(hjK,hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj+ubj)}(hcacheph]hcachep}(hjX,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj+ubj )}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjt,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq,ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjv,modnameN classnameNjpjs)}jv]j9,c.kmem_cache_allocasbuh1hhjm,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm,ubj)}(hflagsh]hflags}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj+ubeh}(h]h ]h"]h$]h&]jjuh1j hj+hhhj+hMMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj+hhhj+hMMubah}(h]j+ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj+hMMhj+hhubj4)}(hhh]jM)}(hAllocate an objecth]hAllocate an object}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMMhj,hhubah}(h]h ]h"]h$]h&]uh1j3hj+hhhj+hMMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj,jHj,jIjJjKuh1hhhhjLhNhNubj)}(hX-**Parameters** ``struct kmem_cache *cachep`` The cache to allocate from. ``gfp_t flags`` See kmalloc(). **Description** Allocate an object from this cache. See kmem_cache_zalloc() for a shortcut of adding __GFP_ZERO to flags. **Return** pointer to the new object or ``NULL`` in case of errorh](jM)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMQhj,ubj)}(hhh](j)}(h:``struct kmem_cache *cachep`` The cache to allocate from. h](j)}(h``struct kmem_cache *cachep``h]jS)}(hj -h]hstruct kmem_cache *cachep}(hj -hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj -ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMNhj-ubj)}(hhh]jM)}(hThe cache to allocate from.h]hThe cache to allocate from.}(hj$-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj -hMNhj!-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj -hMNhj-ubj)}(h``gfp_t flags`` See kmalloc(). h](j)}(h``gfp_t flags``h]jS)}(hjD-h]h gfp_t flags}(hjF-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjB-ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMOhj>-ubj)}(hhh]jM)}(hSee kmalloc().h]hSee kmalloc().}(hj]-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjY-hMOhjZ-ubah}(h]h ]h"]h$]h&]uh1jhj>-ubeh}(h]h ]h"]h$]h&]uh1jhjY-hMOhj-ubeh}(h]h ]h"]h$]h&]uh1jhj,ubjM)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}-ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMQhj,ubjM)}(hiAllocate an object from this cache. See kmem_cache_zalloc() for a shortcut of adding __GFP_ZERO to flags.h]hiAllocate an object from this cache. See kmem_cache_zalloc() for a shortcut of adding __GFP_ZERO to flags.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMPhj,ubjM)}(h **Return**h]j)}(hj-h]hReturn}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMShj,ubjM)}(h6pointer to the new object or ``NULL`` in case of errorh](hpointer to the new object or }(hj-hhhNhNubjS)}(h``NULL``h]hNULL}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj-ubh in case of error}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMThj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmem_cache_charge (C function)c.kmem_cache_chargehNtauh1hhjLhhhNhNubh)}(hhh](h)}(h3bool kmem_cache_charge (void *objp, gfp_t gfpflags)h]h)}(h2bool kmem_cache_charge(void *objp, gfp_t gfpflags)h](j)}(hboolh]hbool}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM_ubj)}(h h]h }(hj .hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj .hM_ubh)}(hkmem_cache_chargeh]j)}(hkmem_cache_chargeh]hkmem_cache_charge}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj-hhhj .hM_ubj )}(h(void *objp, gfp_t gfpflags)h](j )}(h void *objph](j)}(hvoidh]hvoid}(hj:.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6.ubj)}(h h]h }(hjH.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6.ubjF )}(hjI h]h*}(hjV.hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6.ubj)}(hobjph]hobjp}(hjc.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2.ubj )}(hgfp_t gfpflagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|.ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.modnameN classnameNjpjs)}jv]jy)}jlj .sbc.kmem_cache_chargeasbuh1hhjx.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx.ubj)}(hgfpflagsh]hgfpflags}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2.ubeh}(h]h ]h"]h$]h&]jjuh1j hj-hhhj .hM_ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj-hhhj .hM_ubah}(h]j-ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj .hM_hj-hhubj4)}(hhh]jM)}(h-memcg charge an already allocated slab memoryh]h-memcg charge an already allocated slab memory}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM_hj.hhubah}(h]h ]h"]h$]h&]uh1j3hj-hhhj .hM_ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj.jHj.jIjJjKuh1hhhhjLhNhNubj)}(hX**Parameters** ``void *objp`` address of the slab object to memcg charge ``gfp_t gfpflags`` describe the allocation context **Description** kmem_cache_charge allows charging a slab object to the current memcg, primarily in cases where charging at allocation time might not be possible because the target memcg is not known (i.e. softirq context) The objp should be pointer returned by the slab allocator functions like kmalloc (with __GFP_ACCOUNT in flags) or kmem_cache_alloc. The memcg charge behavior can be controlled through gfpflags parameter, which affects how the necessary internal metadata can be allocated. Including __GFP_NOFAIL denotes that overcharging is requested instead of failure, but is not applied for the internal metadata allocation. There are several cases where it will return true even if the charging was not done: More specifically: 1. For !CONFIG_MEMCG or cgroup_disable=memory systems. 2. Already charged slab objects. 3. For slab objects from KMALLOC_NORMAL caches - allocated by kmalloc() without __GFP_ACCOUNT 4. Allocating internal metadata has failed **Return** true if charge was successful otherwise false.h](jM)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMchj.ubj)}(hhh](j)}(h:``void *objp`` address of the slab object to memcg charge h](j)}(h``void *objp``h]jS)}(hj/h]h void *objp}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM`hj/ubj)}(hhh]jM)}(h*address of the slab object to memcg chargeh]h*address of the slab object to memcg charge}(hj1/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj-/hM`hj./ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj-/hM`hj/ubj)}(h3``gfp_t gfpflags`` describe the allocation context h](j)}(h``gfp_t gfpflags``h]jS)}(hjQ/h]hgfp_t gfpflags}(hjS/hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjO/ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMahjK/ubj)}(hhh]jM)}(hdescribe the allocation contexth]hdescribe the allocation context}(hjj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjf/hMahjg/ubah}(h]h ]h"]h$]h&]uh1jhjK/ubeh}(h]h ]h"]h$]h&]uh1jhjf/hMahj/ubeh}(h]h ]h"]h$]h&]uh1jhj.ubjM)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMchj.ubjM)}(hkmem_cache_charge allows charging a slab object to the current memcg, primarily in cases where charging at allocation time might not be possible because the target memcg is not known (i.e. softirq context)h]hkmem_cache_charge allows charging a slab object to the current memcg, primarily in cases where charging at allocation time might not be possible because the target memcg is not known (i.e. softirq context)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMbhj.ubjM)}(hXThe objp should be pointer returned by the slab allocator functions like kmalloc (with __GFP_ACCOUNT in flags) or kmem_cache_alloc. The memcg charge behavior can be controlled through gfpflags parameter, which affects how the necessary internal metadata can be allocated. Including __GFP_NOFAIL denotes that overcharging is requested instead of failure, but is not applied for the internal metadata allocation.h]hXThe objp should be pointer returned by the slab allocator functions like kmalloc (with __GFP_ACCOUNT in flags) or kmem_cache_alloc. The memcg charge behavior can be controlled through gfpflags parameter, which affects how the necessary internal metadata can be allocated. Including __GFP_NOFAIL denotes that overcharging is requested instead of failure, but is not applied for the internal metadata allocation.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMfhj.ubjM)}(hgThere are several cases where it will return true even if the charging was not done: More specifically:h]hgThere are several cases where it will return true even if the charging was not done: More specifically:}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMmhj.ubhenumerated_list)}(hhh](h list_item)}(h3For !CONFIG_MEMCG or cgroup_disable=memory systems.h]jM)}(hj/h]h3For !CONFIG_MEMCG or cgroup_disable=memory systems.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMqhj/ubah}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hAlready charged slab objects.h]jM)}(hj/h]hAlready charged slab objects.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMrhj/ubah}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hZFor slab objects from KMALLOC_NORMAL caches - allocated by kmalloc() without __GFP_ACCOUNTh]jM)}(hZFor slab objects from KMALLOC_NORMAL caches - allocated by kmalloc() without __GFP_ACCOUNTh]hZFor slab objects from KMALLOC_NORMAL caches - allocated by kmalloc() without __GFP_ACCOUNT}(hj 0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMshj0ubah}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(h(Allocating internal metadata has failed h]jM)}(h'Allocating internal metadata has failedh]h'Allocating internal metadata has failed}(hj#0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMuhj0ubah}(h]h ]h"]h$]h&]uh1j/hj/ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j/hj.ubjM)}(h **Return**h]j)}(hjE0h]hReturn}(hjG0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC0ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMwhj.ubjM)}(h.true if charge was successful otherwise false.h]h.true if charge was successful otherwise false.}(hj[0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMxhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmalloc (C function) c.kmallochNtauh1hhjLhhhNhNubh)}(hhh](h)}(h)void * kmalloc (size_t size, gfp_t flags)h]h)}(h'void *kmalloc(size_t size, gfp_t flags)h](j)}(hvoidh]hvoid}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0hhhj0hMubjF )}(hjI h]h*}(hj0hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0hhhj0hMubh)}(hkmalloch]j)}(hkmalloch]hkmalloc}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj0hhhj0hMubj )}(h(size_t size, gfp_t flags)h](j )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj0modnameN classnameNjpjs)}jv]jy)}jlj0sb c.kmallocasbuh1hhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hsizeh]hsize}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubj )}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj!1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj#1modnameN classnameNjpjs)}jv]j0 c.kmallocasbuh1hhj1ubj)}(h h]h }(hj?1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hflagsh]hflags}(hjM1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubeh}(h]h ]h"]h$]h&]jjuh1j hj0hhhj0hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj0hhhj0hMubah}(h]j}0ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj0hMhj0hhubj4)}(hhh]jM)}(hallocate kernel memoryh]hallocate kernel memory}(hjw1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjt1hhubah}(h]h ]h"]h$]h&]uh1j3hj0hhhj0hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj1jHj1jIjJjKuh1hhhhjLhNhNubj)}(hX**Parameters** ``size_t size`` how many bytes of memory are required. ``gfp_t flags`` describe the allocation context **Description** kmalloc is the normal method of allocating memory for objects smaller than page size in the kernel. The allocated object address is aligned to at least ARCH_KMALLOC_MINALIGN bytes. For **size** of power of two bytes, the alignment is also guaranteed to be at least to the size. For other sizes, the alignment is guaranteed to be at least the largest power-of-two divisor of **size**. The **flags** argument may be one of the GFP flags defined at include/linux/gfp_types.h and described at :ref:`Documentation/core-api/mm-api.rst ` The recommended usage of the **flags** is described at :ref:`Documentation/core-api/memory-allocation.rst ` Below is a brief outline of the most useful GFP flags ``GFP_KERNEL`` Allocate normal kernel ram. May sleep. ``GFP_NOWAIT`` Allocation will not sleep. ``GFP_ATOMIC`` Allocation will not sleep. May use emergency pools. Also it is possible to set different flags by OR'ing in one or more of the following additional **flags**: ``__GFP_ZERO`` Zero the allocated memory before returning. Also see kzalloc(). ``__GFP_HIGH`` This allocation has high priority and may use emergency pools. ``__GFP_NOFAIL`` Indicate that this allocation is in no way allowed to fail (think twice before using). ``__GFP_NORETRY`` If memory is not immediately available, then give up at once. ``__GFP_NOWARN`` If allocation fails, don't issue any warnings. ``__GFP_RETRY_MAYFAIL`` Try really hard to succeed the allocation but fail eventually.h](jM)}(h**Parameters**h]j)}(hj1h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubj)}(hhh](j)}(h7``size_t size`` how many bytes of memory are required. h](j)}(h``size_t size``h]jS)}(hj1h]h size_t size}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubj)}(hhh]jM)}(h&how many bytes of memory are required.h]h&how many bytes of memory are required.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhj1ubj)}(h0``gfp_t flags`` describe the allocation context h](j)}(h``gfp_t flags``h]jS)}(hj1h]h gfp_t flags}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubj)}(hhh]jM)}(hdescribe the allocation contexth]hdescribe the allocation context}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1ubjM)}(h**Description**h]j)}(hj,2h]h Description}(hj.2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*2ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubjM)}(hckmalloc is the normal method of allocating memory for objects smaller than page size in the kernel.h]hckmalloc is the normal method of allocating memory for objects smaller than page size in the kernel.}(hjB2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubjM)}(hXThe allocated object address is aligned to at least ARCH_KMALLOC_MINALIGN bytes. For **size** of power of two bytes, the alignment is also guaranteed to be at least to the size. For other sizes, the alignment is guaranteed to be at least the largest power-of-two divisor of **size**.h](hUThe allocated object address is aligned to at least ARCH_KMALLOC_MINALIGN bytes. For }(hjQ2hhhNhNubj)}(h**size**h]hsize}(hjY2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ2ubh of power of two bytes, the alignment is also guaranteed to be at least to the size. For other sizes, the alignment is guaranteed to be at least the largest power-of-two divisor of }(hjQ2hhhNhNubj)}(h**size**h]hsize}(hjk2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ2ubh.}(hjQ2hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubjM)}(hThe **flags** argument may be one of the GFP flags defined at include/linux/gfp_types.h and described at :ref:`Documentation/core-api/mm-api.rst `h](hThe }(hj2hhhNhNubj)}(h **flags**h]hflags}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh\ argument may be one of the GFP flags defined at include/linux/gfp_types.h and described at }(hj2hhhNhNubh)}(h;:ref:`Documentation/core-api/mm-api.rst `h]hinline)}(hj2h]h!Documentation/core-api/mm-api.rst}(hj2hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j2hj2ubah}(h]h ]h"]h$]h&]refdocj( refdomainj2reftyperef refexplicitrefwarnj1mm-api-gfp-flagsuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj2ubeh}(h]h ]h"]h$]h&]uh1jLhj2hMhj1ubjM)}(h~The recommended usage of the **flags** is described at :ref:`Documentation/core-api/memory-allocation.rst `h](hThe recommended usage of the }(hj2hhhNhNubj)}(h **flags**h]hflags}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh is described at }(hj2hhhNhNubh)}(hG:ref:`Documentation/core-api/memory-allocation.rst `h]j2)}(hj2h]h,Documentation/core-api/memory-allocation.rst}(hj2hhhNhNubah}(h]h ](jstdstd-refeh"]h$]h&]uh1j2hj2ubah}(h]h ]h"]h$]h&]refdocj( refdomainj2reftyperef refexplicitrefwarnj1memory_allocationuh1hhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj2ubeh}(h]h ]h"]h$]h&]uh1jLhj3hMhj1ubjM)}(h5Below is a brief outline of the most useful GFP flagsh]h5Below is a brief outline of the most useful GFP flags}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubj)}(hhh](j)}(h6``GFP_KERNEL`` Allocate normal kernel ram. May sleep. h](j)}(h``GFP_KERNEL``h]jS)}(hj 3h]h GFP_KERNEL}(hj"3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj3ubj)}(hhh]jM)}(h&Allocate normal kernel ram. May sleep.h]h&Allocate normal kernel ram. May sleep.}(hj93hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj53hMhj63ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj53hMhj3ubj)}(h*``GFP_NOWAIT`` Allocation will not sleep. h](j)}(h``GFP_NOWAIT``h]jS)}(hjY3h]h GFP_NOWAIT}(hj[3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjW3ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjS3ubj)}(hhh]jM)}(hAllocation will not sleep.h]hAllocation will not sleep.}(hjr3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjn3hMhjo3ubah}(h]h ]h"]h$]h&]uh1jhjS3ubeh}(h]h ]h"]h$]h&]uh1jhjn3hMhj3ubj)}(hD``GFP_ATOMIC`` Allocation will not sleep. May use emergency pools. h](j)}(h``GFP_ATOMIC``h]jS)}(hj3h]h GFP_ATOMIC}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj3ubj)}(hhh]jM)}(h4Allocation will not sleep. May use emergency pools.h]h4Allocation will not sleep. May use emergency pools.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj3ubeh}(h]h ]h"]h$]h&]uh1jhj1ubjM)}(hjAlso it is possible to set different flags by OR'ing in one or more of the following additional **flags**:h](hbAlso it is possible to set different flags by OR’ing in one or more of the following additional }(hj3hhhNhNubj)}(h **flags**h]hflags}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh:}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj1ubj)}(hhh](j)}(hO``__GFP_ZERO`` Zero the allocated memory before returning. Also see kzalloc(). h](j)}(h``__GFP_ZERO``h]jS)}(hj3h]h __GFP_ZERO}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM hj3ubj)}(hhh]jM)}(h?Zero the allocated memory before returning. Also see kzalloc().h]h?Zero the allocated memory before returning. Also see kzalloc().}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj 4hM hj 4ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj 4hM hj3ubj)}(hN``__GFP_HIGH`` This allocation has high priority and may use emergency pools. h](j)}(h``__GFP_HIGH``h]jS)}(hj.4h]h __GFP_HIGH}(hj04hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,4ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM hj(4ubj)}(hhh]jM)}(h>This allocation has high priority and may use emergency pools.h]h>This allocation has high priority and may use emergency pools.}(hjG4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjC4hM hjD4ubah}(h]h ]h"]h$]h&]uh1jhj(4ubeh}(h]h ]h"]h$]h&]uh1jhjC4hM hj3ubj)}(hh``__GFP_NOFAIL`` Indicate that this allocation is in no way allowed to fail (think twice before using). h](j)}(h``__GFP_NOFAIL``h]jS)}(hjg4h]h __GFP_NOFAIL}(hji4hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhje4ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhja4ubj)}(hhh]jM)}(hVIndicate that this allocation is in no way allowed to fail (think twice before using).h]hVIndicate that this allocation is in no way allowed to fail (think twice before using).}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj}4ubah}(h]h ]h"]h$]h&]uh1jhja4ubeh}(h]h ]h"]h$]h&]uh1jhj|4hMhj3ubj)}(hP``__GFP_NORETRY`` If memory is not immediately available, then give up at once. h](j)}(h``__GFP_NORETRY``h]jS)}(hj4h]h __GFP_NORETRY}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj4ubj)}(hhh]jM)}(h=If memory is not immediately available, then give up at once.h]h=If memory is not immediately available, then give up at once.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hMhj3ubj)}(h@``__GFP_NOWARN`` If allocation fails, don't issue any warnings. h](j)}(h``__GFP_NOWARN``h]jS)}(hj4h]h __GFP_NOWARN}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj4ubj)}(hhh]jM)}(h.If allocation fails, don't issue any warnings.h]h0If allocation fails, don’t issue any warnings.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj4hMhj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhj4hMhj3ubj)}(hV``__GFP_RETRY_MAYFAIL`` Try really hard to succeed the allocation but fail eventually.h](j)}(h``__GFP_RETRY_MAYFAIL``h]jS)}(hj5h]h__GFP_RETRY_MAYFAIL}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhj5ubj)}(hhh]jM)}(h>Try really hard to succeed the allocation but fail eventually.h]h>Try really hard to succeed the allocation but fail eventually.}(hj-5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)5hMhj*5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj)5hMhj3ubeh}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmalloc_nolock (C function)c.kmalloc_nolockhNtauh1hhjLhhhNhNubh)}(hhh](h)}(h>void * kmalloc_nolock (size_t size, gfp_t gfp_flags, int node)h]h)}(h;ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMKhj:;ubj)}(hhh]jM)}(h0how many **FAM** elements to allocate space for.h](h how many }(hjY;hhhNhNubj)}(h**FAM**h]hFAM}(hja;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY;ubh elements to allocate space for.}(hjY;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjU;hMKhjV;ubah}(h]h ]h"]h$]h&]uh1jhj:;ubeh}(h]h ]h"]h$]h&]uh1jhjU;hMKhjA:ubeh}(h]h ]h"]h$]h&]uh1jhj%:ubjM)}(h **Return**h]j)}(hj;h]hReturn}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMMhj%:ubjM)}(hNewly allocated pointer to **TYPE** with **COUNT**-many trailing **FAM** elements, or NULL on failure or if **COUNT** cannot be represented by the member of **TYPE** that counts the **FAM** elements (annotated via __counted_by()).h](hNewly allocated pointer to }(hj;hhhNhNubj)}(h**TYPE**h]hTYPE}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh with }(hj;hhhNhNubj)}(h **COUNT**h]hCOUNT}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh-many trailing }(hj;hhhNhNubj)}(h**FAM**h]hFAM}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh$ elements, or NULL on failure or if }(hj;hhhNhNubj)}(h **COUNT**h]hCOUNT}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh( cannot be represented by the member of }(hj;hhhNhNubj)}(h**TYPE**h]hTYPE}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh that counts the }(hj;hhhNhNubj)}(h**FAM**h]hFAM}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh) elements (annotated via __counted_by()).}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMMhj%:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmalloc_obj (C macro) c.kmalloc_objhNtauh1hhjLhhhNhNubh)}(hhh](h)}(h kmalloc_objh]h)}(h kmalloc_objh]h)}(h kmalloc_objh]j)}(hj8<h]h kmalloc_obj}(hjB<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj><ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj:<hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM]ubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj6<hhhjU<hM]ubah}(h]j1<ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjU<hM]hj3<hhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hj3<hhhjU<hM]ubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjn<jHjn<jIjJjKuh1hhhhjLhNhNubjM)}(h"``kmalloc_obj (VAR_OR_TYPE, ...)``h]jS)}(hjt<h]hkmalloc_obj (VAR_OR_TYPE, ...)}(hjv<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjr<ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM_hjLhhubji)}(h-Allocate a single instance of the given type h]jM)}(h,Allocate a single instance of the given typeh]h,Allocate a single instance of the given type}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM]hj<ubah}(h]h ]h"]h$]h&]uh1jhhj<hM]hjLhhubj)}(h**Parameters** ``VAR_OR_TYPE`` Variable or type to allocate. ``...`` optional GFP flags for the allocation (GFP_KERNEL when not specified). **Return** newly allocated pointer to a **VAR_OR_TYPE** on success, or NULL on failure.h](jM)}(h**Parameters**h]j)}(hj<h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMahj<ubj)}(hhh](j)}(h.``VAR_OR_TYPE`` Variable or type to allocate. h](j)}(h``VAR_OR_TYPE``h]jS)}(hj<h]h VAR_OR_TYPE}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM^hj<ubj)}(hhh]jM)}(hVariable or type to allocate.h]hVariable or type to allocate.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hM^hj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hM^hj<ubj)}(hO``...`` optional GFP flags for the allocation (GFP_KERNEL when not specified). h](j)}(h``...``h]jS)}(hj=h]h...}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM_hj<ubj)}(hhh]jM)}(hFoptional GFP flags for the allocation (GFP_KERNEL when not specified).h]hFoptional GFP flags for the allocation (GFP_KERNEL when not specified).}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hM_hj=ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj=hM_hj<ubeh}(h]h ]h"]h$]h&]uh1jhj<ubjM)}(h **Return**h]j)}(hj<=h]hReturn}(hj>=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:=ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMahj<ubjM)}(hLnewly allocated pointer to a **VAR_OR_TYPE** on success, or NULL on failure.h](hnewly allocated pointer to a }(hjR=hhhNhNubj)}(h**VAR_OR_TYPE**h]h VAR_OR_TYPE}(hjZ=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR=ubh on success, or NULL on failure.}(hjR=hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMahj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmalloc_objs (C macro)c.kmalloc_objshNtauh1hhjLhhhNhNubh)}(hhh](h)}(h kmalloc_objsh]h)}(h kmalloc_objsh]h)}(h kmalloc_objsh]j)}(hj=h]h kmalloc_objs}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj=hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj=hhhj=hMhubah}(h]j=ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj=hMhhj=hhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hj=hhhj=hMhubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGj=jHj=jIjJjKuh1hhhhjLhNhNubjM)}(h*``kmalloc_objs (VAR_OR_TYPE, COUNT, ...)``h]jS)}(hj=h]h&kmalloc_objs (VAR_OR_TYPE, COUNT, ...)}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj=ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMjhjLhhubji)}(h$Allocate an array of the given type h]jM)}(h#Allocate an array of the given typeh]h#Allocate an array of the given type}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhhj=ubah}(h]h ]h"]h$]h&]uh1jhhj=hMhhjLhhubj)}(hX+**Parameters** ``VAR_OR_TYPE`` Variable or type to allocate an array of. ``COUNT`` How many elements in the array. ``...`` optional GFP flags for the allocation (GFP_KERNEL when not specified). **Return** newly allocated pointer to array of **VAR_OR_TYPE** on success, or NULL on failure.h](jM)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMlhj=ubj)}(hhh](j)}(h:``VAR_OR_TYPE`` Variable or type to allocate an array of. h](j)}(h``VAR_OR_TYPE``h]jS)}(hj>h]h VAR_OR_TYPE}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMihj>ubj)}(hhh]jM)}(h)Variable or type to allocate an array of.h]h)Variable or type to allocate an array of.}(hj6>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2>hMihj3>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj2>hMihj>ubj)}(h*``COUNT`` How many elements in the array. h](j)}(h ``COUNT``h]jS)}(hjV>h]hCOUNT}(hjX>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjT>ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMjhjP>ubj)}(hhh]jM)}(hHow many elements in the array.h]hHow many elements in the array.}(hjo>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjk>hMjhjl>ubah}(h]h ]h"]h$]h&]uh1jhjP>ubeh}(h]h ]h"]h$]h&]uh1jhjk>hMjhj>ubj)}(hO``...`` optional GFP flags for the allocation (GFP_KERNEL when not specified). h](j)}(h``...``h]jS)}(hj>h]h...}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMkhj>ubj)}(hhh]jM)}(hFoptional GFP flags for the allocation (GFP_KERNEL when not specified).h]hFoptional GFP flags for the allocation (GFP_KERNEL when not specified).}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>hMkhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMkhj>ubeh}(h]h ]h"]h$]h&]uh1jhj=ubjM)}(h **Return**h]j)}(hj>h]hReturn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMmhj=ubjM)}(hSnewly allocated pointer to array of **VAR_OR_TYPE** on success, or NULL on failure.h](h$newly allocated pointer to array of }(hj>hhhNhNubj)}(h**VAR_OR_TYPE**h]h VAR_OR_TYPE}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh on success, or NULL on failure.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMmhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmalloc_flex (C macro)c.kmalloc_flexhNtauh1hhjLhhhNhNubh)}(hhh](h)}(h kmalloc_flexh]h)}(h kmalloc_flexh]h)}(h kmalloc_flexh]j)}(hj?h]h kmalloc_flex}(hj%?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!?ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj?hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMtubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj?hhhj8?hMtubah}(h]j?ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj8?hMthj?hhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hj?hhhj8?hMtubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjQ?jHjQ?jIjJjKuh1hhhhjLhNhNubjM)}(h/``kmalloc_flex (VAR_OR_TYPE, FAM, COUNT, ...)``h]jS)}(hjW?h]h+kmalloc_flex (VAR_OR_TYPE, FAM, COUNT, ...)}(hjY?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjU?ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMvhjLhhubji)}(h;Allocate a single instance of the given flexible structure h]jM)}(h:Allocate a single instance of the given flexible structureh]h:Allocate a single instance of the given flexible structure}(hjq?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMthjm?ubah}(h]h ]h"]h$]h&]uh1jhhj?hMthjLhhubj)}(hX3**Parameters** ``VAR_OR_TYPE`` Variable or type to allocate (with its flex array). ``FAM`` The name of the flexible array member of the structure. ``COUNT`` How many flexible array member elements are desired. ``...`` optional GFP flags for the allocation (GFP_KERNEL when not specified). **Return** newly allocated pointer to **VAR_OR_TYPE** on success, NULL on failure. If **FAM** has been annotated with __counted_by(), the allocation will immediately fail if **COUNT** is larger than what the type of the struct's counter variable can represent.h](jM)}(h**Parameters**h]j)}(hj?h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMxhj?ubj)}(hhh](j)}(hD``VAR_OR_TYPE`` Variable or type to allocate (with its flex array). h](j)}(h``VAR_OR_TYPE``h]jS)}(hj?h]h VAR_OR_TYPE}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMuhj?ubj)}(hhh]jM)}(h3Variable or type to allocate (with its flex array).h]h3Variable or type to allocate (with its flex array).}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj?hMuhj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMuhj?ubj)}(h@``FAM`` The name of the flexible array member of the structure. h](j)}(h``FAM``h]jS)}(hj?h]hFAM}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMvhj?ubj)}(hhh]jM)}(h7The name of the flexible array member of the structure.h]h7The name of the flexible array member of the structure.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj?hMvhj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hMvhj?ubj)}(h?``COUNT`` How many flexible array member elements are desired. h](j)}(h ``COUNT``h]jS)}(hj@h]hCOUNT}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMwhj@ubj)}(hhh]jM)}(h4How many flexible array member elements are desired.h]h4How many flexible array member elements are desired.}(hj6@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2@hMwhj3@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj2@hMwhj?ubj)}(hO``...`` optional GFP flags for the allocation (GFP_KERNEL when not specified). h](j)}(h``...``h]jS)}(hjV@h]h...}(hjX@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjT@ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMxhjP@ubj)}(hhh]jM)}(hFoptional GFP flags for the allocation (GFP_KERNEL when not specified).h]hFoptional GFP flags for the allocation (GFP_KERNEL when not specified).}(hjo@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjk@hMxhjl@ubah}(h]h ]h"]h$]h&]uh1jhjP@ubeh}(h]h ]h"]h$]h&]uh1jhjk@hMxhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?ubjM)}(h **Return**h]j)}(hj@h]hReturn}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMzhj?ubjM)}(hnewly allocated pointer to **VAR_OR_TYPE** on success, NULL on failure. If **FAM** has been annotated with __counted_by(), the allocation will immediately fail if **COUNT** is larger than what the type of the struct's counter variable can represent.h](hnewly allocated pointer to }(hj@hhhNhNubj)}(h**VAR_OR_TYPE**h]h VAR_OR_TYPE}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh! on success, NULL on failure. If }(hj@hhhNhNubj)}(h**FAM**h]hFAM}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubhQ has been annotated with __counted_by(), the allocation will immediately fail if }(hj@hhhNhNubj)}(h **COUNT**h]hCOUNT}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubhO is larger than what the type of the struct’s counter variable can represent.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMzhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmalloc_array (C function)c.kmalloc_arrayhNtauh1hhjLhhhNhNubh)}(hhh](h)}(h9void * kmalloc_array (size_t n, size_t size, gfp_t flags)h]h)}(h7void *kmalloc_array(size_t n, size_t size, gfp_t flags)h](j)}(hvoidh]hvoid}(hj AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjAhMubjF )}(hjI h]h*}(hj)AhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjAhhhjAhMubh)}(h kmalloc_arrayh]j)}(h kmalloc_arrayh]h kmalloc_array}(hj:AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6Aubah}(h]h ](jjeh"]h$]h&]jjuh1hhjAhhhjAhMubj )}(h$(size_t n, size_t size, gfp_t flags)h](j )}(hsize_t nh](h)}(hhh]j)}(hsize_th]hsize_t}(hjYAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVAubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj[AmodnameN classnameNjpjs)}jv]jy)}jljhjJubjM)}(hGFP_NOWAIT and GFP_ATOMIC are supported, the __GFP_NORETRY modifier is not. __GFP_RETRY_MAYFAIL is supported, and it should be used only if kmalloc is preferable to the vmalloc fallback, due to visible performance drawbacks.h]hGFP_NOWAIT and GFP_ATOMIC are supported, the __GFP_NORETRY modifier is not. __GFP_RETRY_MAYFAIL is supported, and it should be used only if kmalloc is preferable to the vmalloc fallback, due to visible performance drawbacks.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMAhjJubjM)}(h **Return**h]j)}(hjKh]hReturn}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMEhjJubjM)}(h>pointer to the allocated memory of ``NULL`` in case of failureh](h#pointer to the allocated memory of }(hjKhhhNhNubjS)}(h``NULL``h]hNULL}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjKubh in case of failure}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMFhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!kvrealloc_node_align (C function)c.kvrealloc_node_alignhNtauh1hhjLhhhNhNubh)}(hhh](h)}(hcvoid * kvrealloc_node_align (const void *p, size_t size, unsigned long align, gfp_t flags, int nid)h]h)}(havoid *kvrealloc_node_align(const void *p, size_t size, unsigned long align, gfp_t flags, int nid)h](j)}(hvoidh]hvoid}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj LhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMmubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj LhhhjLhMmubjF )}(hjI h]h*}(hj-LhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj LhhhjLhMmubh)}(hkvrealloc_node_alignh]j)}(hkvrealloc_node_alignh]hkvrealloc_node_align}(hj>LhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:Lubah}(h]h ](jjeh"]h$]h&]jjuh1hhj LhhhjLhMmubj )}(hG(const void *p, size_t size, unsigned long align, gfp_t flags, int nid)h](j )}(h const void *ph](j5)}(hjh]hconst}(hjZLhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjVLubj)}(h h]h }(hjgLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVLubj)}(hvoidh]hvoid}(hjuLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVLubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVLubjF )}(hjI h]h*}(hjLhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjVLubj)}(hjR h]hp}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRLubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjLmodnameN classnameNjpjs)}jv]jy)}jlj@Lsbc.kvrealloc_node_alignasbuh1hhjLubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hsizeh]hsize}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRLubj )}(hunsigned long alignh](j)}(hunsignedh]hunsigned}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hlongh]hlong}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(h h]h }(hj*MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(halignh]halign}(hj8MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRLubj )}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjTMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQMubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjVMmodnameN classnameNjpjs)}jv]jLc.kvrealloc_node_alignasbuh1hhjMMubj)}(h h]h }(hjrMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMMubj)}(hflagsh]hflags}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMMubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRLubj )}(hint nidh](j)}(hinth]hint}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hnidh]hnid}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjRLubeh}(h]h ]h"]h$]h&]jjuh1j hj LhhhjLhMmubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjLhhhjLhMmubah}(h]jLah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjLhMmhjLhhubj4)}(hhh]jM)}(h,reallocate memory; contents remain unchangedh]h,reallocate memory; contents remain unchanged}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMmhjMhhubah}(h]h ]h"]h$]h&]uh1j3hjLhhhjLhMmubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjMjHjMjIjJjKuh1hhhhjLhNhNubj)}(hX\**Parameters** ``const void *p`` object to reallocate memory for ``size_t size`` the size to reallocate ``unsigned long align`` desired alignment ``gfp_t flags`` the flags for the page level allocator ``int nid`` NUMA node id **Description** If **p** is ``NULL``, kvrealloc() behaves exactly like kvmalloc(). If **size** is 0 and **p** is not a ``NULL`` pointer, the object pointed to is freed. Only alignments up to those guaranteed by kmalloc() will be honored. Please see Documentation/core-api/memory-allocation.rst for more details. If __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API. In any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes. This function must not be called concurrently with itself or kvfree() for the same memory allocation. **Return** pointer to the allocated memory or ``NULL`` in case of errorh](jM)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMqhjMubj)}(hhh](j)}(h2``const void *p`` object to reallocate memory for h](j)}(h``const void *p``h]jS)}(hj Nh]h const void *p}(hj"NhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjNubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMnhjNubj)}(hhh]jM)}(hobject to reallocate memory forh]hobject to reallocate memory for}(hj9NhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5NhMnhj6Nubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhj5NhMnhjNubj)}(h'``size_t size`` the size to reallocate h](j)}(h``size_t size``h]jS)}(hjYNh]h size_t size}(hj[NhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjWNubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMohjSNubj)}(hhh]jM)}(hthe size to reallocateh]hthe size to reallocate}(hjrNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnNhMohjoNubah}(h]h ]h"]h$]h&]uh1jhjSNubeh}(h]h ]h"]h$]h&]uh1jhjnNhMohjNubj)}(h*``unsigned long align`` desired alignment h](j)}(h``unsigned long align``h]jS)}(hjNh]hunsigned long align}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjNubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMphjNubj)}(hhh]jM)}(hdesired alignmenth]hdesired alignment}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjNhMphjNubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMphjNubj)}(h7``gfp_t flags`` the flags for the page level allocator h](j)}(h``gfp_t flags``h]jS)}(hjNh]h gfp_t flags}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjNubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMqhjNubj)}(hhh]jM)}(h&the flags for the page level allocatorh]h&the flags for the page level allocator}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjNhMqhjNubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjNhMqhjNubj)}(h``int nid`` NUMA node id h](j)}(h ``int nid``h]jS)}(hjOh]hint nid}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjOubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMrhjNubj)}(hhh]jM)}(h NUMA node idh]h NUMA node id}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjOhMrhjOubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjOhMrhjNubeh}(h]h ]h"]h$]h&]uh1jhjMubjM)}(h**Description**h]j)}(hj?Oh]h Description}(hjAOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Oubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMthjMubjM)}(hIf **p** is ``NULL``, kvrealloc() behaves exactly like kvmalloc(). If **size** is 0 and **p** is not a ``NULL`` pointer, the object pointed to is freed.h](hIf }(hjUOhhhNhNubj)}(h**p**h]hp}(hj]OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUOubh is }(hjUOhhhNhNubjS)}(h``NULL``h]hNULL}(hjoOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUOubh2, kvrealloc() behaves exactly like kvmalloc(). If }(hjUOhhhNhNubj)}(h**size**h]hsize}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUOubh is 0 and }(hjUOhhhNhNubj)}(h**p**h]hp}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUOubh is not a }(hjUOhhhNhNubjS)}(h``NULL``h]hNULL}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUOubh) pointer, the object pointed to is freed.}(hjUOhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMshjMubjM)}(hOnly alignments up to those guaranteed by kmalloc() will be honored. Please see Documentation/core-api/memory-allocation.rst for more details.h]hOnly alignments up to those guaranteed by kmalloc() will be honored. Please see Documentation/core-api/memory-allocation.rst for more details.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMvhjMubjM)}(hXIf __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API.h]hXIf __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMyhjMubjM)}(hkIn any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes.h]hkIn any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhM~hjMubjM)}(heThis function must not be called concurrently with itself or kvfree() for the same memory allocation.h]heThis function must not be called concurrently with itself or kvfree() for the same memory allocation.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjMubjM)}(h **Return**h]j)}(hjOh]hReturn}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:37: ./include/linux/slab.hhMhjMubjM)}(hFree an object which was previously allocated from this cache.h]h>Free an object which was previously allocated from this cache.}(hjqVhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hksize (C function)c.ksizehNtauh1hhjLhhhNhNubh)}(hhh](h)}(hsize_t ksize (const void *objp)h]h)}(hsize_t ksize(const void *objp)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjVmodnameN classnameNjpjs)}jv]jy)}jlksizesbc.ksizeasbuh1hhjVhhhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM&ubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhjVhM&ubh)}(hksizeh]j)}(hjVh]hksize}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1hhjVhhhjVhM&ubj )}(h(const void *objp)h]j )}(hconst void *objph](j5)}(hjh]hconst}(hjVhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjVubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(hvoidh]hvoid}(hj WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubjF )}(hjI h]h*}(hj)WhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjVubj)}(hobjph]hobjp}(hj6WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubah}(h]h ]h"]h$]h&]jjuh1j hjVhhhjVhM&ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjVhhhjVhM&ubah}(h]jVah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjVhM&hjVhhubj4)}(hhh]h bullet_list)}(hhh]j/)}(h)Report full size of underlying allocationh]jM)}(hjgWh]h)Report full size of underlying allocation}(hjiWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM&hjeWubah}(h]h ]h"]h$]h&]uh1j/hjbWhhhjvWhNubah}(h]h ]h"]h$]h&]bullet-uh1j`WhjvWhM&hj]Whhubah}(h]h ]h"]h$]h&]uh1j3hjVhhhjVhM&ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjWjHjWjIjJjKuh1hhhhjLhNhNubj)}(hX**Parameters** ``const void *objp`` pointer to the object **Description** This should only be used internally to query the true size of allocations. It is not meant to be a way to discover the usable size of an allocation after the fact. Instead, use kmalloc_size_roundup(). Using memory beyond the originally requested allocation size may trigger KASAN, UBSAN_BOUNDS, and/or FORTIFY_SOURCE. **Return** size of the actual memory used by **objp** in bytesh](jM)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM*hjWubj)}(hhh]j)}(h+``const void *objp`` pointer to the object h](j)}(h``const void *objp``h]jS)}(hjWh]hconst void *objp}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjWubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM'hjWubj)}(hhh]jM)}(hpointer to the objecth]hpointer to the object}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjWhM'hjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjWhM'hjWubah}(h]h ]h"]h$]h&]uh1jhjWubjM)}(h**Description**h]j)}(hjWh]h Description}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM)hjWubjM)}(hX=This should only be used internally to query the true size of allocations. It is not meant to be a way to discover the usable size of an allocation after the fact. Instead, use kmalloc_size_roundup(). Using memory beyond the originally requested allocation size may trigger KASAN, UBSAN_BOUNDS, and/or FORTIFY_SOURCE.h]hX=This should only be used internally to query the true size of allocations. It is not meant to be a way to discover the usable size of an allocation after the fact. Instead, use kmalloc_size_roundup(). Using memory beyond the originally requested allocation size may trigger KASAN, UBSAN_BOUNDS, and/or FORTIFY_SOURCE.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM(hjWubjM)}(h **Return**h]j)}(hjXh]hReturn}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM.hjWubjM)}(h3size of the actual memory used by **objp** in bytesh](h"size of the actual memory used by }(hj/XhhhNhNubj)}(h**objp**h]hobjp}(hj7XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/Xubh in bytes}(hj/XhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM/hjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkfree (C function)c.kfreehNtauh1hhjLhhhNhNubh)}(hhh](h)}(hvoid kfree (const void *object)h]h)}(hvoid kfree(const void *object)h](j)}(hvoidh]hvoid}(hjpXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlXhhhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMwubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlXhhhj~XhMwubh)}(hkfreeh]j)}(hkfreeh]hkfree}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ](jjeh"]h$]h&]jjuh1hhjlXhhhj~XhMwubj )}(h(const void *object)h]j )}(hconst void *objecth](j5)}(hjh]hconst}(hjXhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hvoidh]hvoid}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF )}(hjI h]h*}(hjXhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjXubj)}(hobjecth]hobject}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjXubah}(h]h ]h"]h$]h&]jjuh1j hjlXhhhj~XhMwubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhXhhhj~XhMwubah}(h]jcXah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj~XhMwhjeXhhubj4)}(hhh]jM)}(h free previously allocated memoryh]h free previously allocated memory}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMwhjYhhubah}(h]h ]h"]h$]h&]uh1j3hjeXhhhj~XhMwubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj3YjHj3YjIjJjKuh1hhhhjLhNhNubj)}(h**Parameters** ``const void *object`` pointer returned by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc() **Description** If **object** is NULL, no operation is performed.h](jM)}(h**Parameters**h]j)}(hj=Yh]h Parameters}(hj?YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;Yubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM{hj7Yubj)}(hhh]j)}(h^``const void *object`` pointer returned by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc() h](j)}(h``const void *object``h]jS)}(hj\Yh]hconst void *object}(hj^YhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZYubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMxhjVYubj)}(hhh]jM)}(hFpointer returned by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc()h]hFpointer returned by kmalloc(), kmalloc_nolock(), or kmem_cache_alloc()}(hjuYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjqYhMxhjrYubah}(h]h ]h"]h$]h&]uh1jhjVYubeh}(h]h ]h"]h$]h&]uh1jhjqYhMxhjSYubah}(h]h ]h"]h$]h&]uh1jhj7YubjM)}(h**Description**h]j)}(hjYh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMzhj7YubjM)}(h1If **object** is NULL, no operation is performed.h](hIf }(hjYhhhNhNubj)}(h **object**h]hobject}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh$ is NULL, no operation is performed.}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMyhj7Yubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkvfree (C function)c.kvfreehNtauh1hhjLhhhNhNubh)}(hhh](h)}(hvoid kvfree (const void *addr)h]h)}(hvoid kvfree(const void *addr)h](j)}(hvoidh]hvoid}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhjYhMubh)}(hkvfreeh]j)}(hkvfreeh]hkvfree}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Zubah}(h]h ](jjeh"]h$]h&]jjuh1hhjYhhhjYhMubj )}(h(const void *addr)h]j )}(hconst void *addrh](j5)}(hjh]hconst}(hj+ZhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj'Zubj)}(h h]h }(hj8ZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Zubj)}(hvoidh]hvoid}(hjFZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Zubj)}(h h]h }(hjTZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ZubjF )}(hjI h]h*}(hjbZhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj'Zubj)}(haddrh]haddr}(hjoZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Zubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#Zubah}(h]h ]h"]h$]h&]jjuh1j hjYhhhjYhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjYhhhjYhMubah}(h]jYah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjYhMhjYhhubj4)}(hhh]jM)}(h Free memory.h]h Free memory.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZhhubah}(h]h ]h"]h$]h&]uh1j3hjYhhhjYhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjZjHjZjIjJjKuh1hhhhjLhNhNubj)}(hXP**Parameters** ``const void *addr`` Pointer to allocated memory. **Description** kvfree frees memory allocated by any of vmalloc(), kmalloc() or kvmalloc(). It is slightly more efficient to use kfree() or vfree() if you are certain that you know which one to use. **Context** Either preemptible task context or not-NMI interrupt.h](jM)}(h**Parameters**h]j)}(hjZh]h Parameters}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZubj)}(hhh]j)}(h2``const void *addr`` Pointer to allocated memory. h](j)}(h``const void *addr``h]jS)}(hjZh]hconst void *addr}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZubj)}(hhh]jM)}(hPointer to allocated memory.h]hPointer to allocated memory.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhMhjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhMhjZubah}(h]h ]h"]h$]h&]uh1jhjZubjM)}(h**Description**h]j)}(hj[h]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZubjM)}(hkvfree frees memory allocated by any of vmalloc(), kmalloc() or kvmalloc(). It is slightly more efficient to use kfree() or vfree() if you are certain that you know which one to use.h]hkvfree frees memory allocated by any of vmalloc(), kmalloc() or kvmalloc(). It is slightly more efficient to use kfree() or vfree() if you are certain that you know which one to use.}(hj+[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZubjM)}(h **Context**h]j)}(hj<[h]hContext}(hj>[hhhNhNubah}(h]h ]h"]h$]h&>]uh1jhj:[ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZubjM)}(h5Either preemptible task context or not-NMI interrupt.h]h5Either preemptible task context or not-NMI interrupt.}(hjR[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkvfree_atomic (C function)c.kvfree_atomichNtauh1hhjLhhhNhNubh)}(hhh](h)}(h%void kvfree_atomic (const void *addr)h]h)}(h$void kvfree_atomic(const void *addr)h](j)}(hvoidh]hvoid}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}[hhhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}[hhhj[hMubh)}(h kvfree_atomich]j)}(h kvfree_atomich]h kvfree_atomic}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj}[hhhj[hMubj )}(h(const void *addr)h]j )}(hconst void *addrh](j5)}(hjh]hconst}(hj[hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj[ubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hvoidh]hvoid}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubjF )}(hjI h]h*}(hj[hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj[ubj)}(haddrh]haddr}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj[ubah}(h]h ]h"]h$]h&]jjuh1j hj}[hhhj[hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjy[hhhj[hMubah}(h]jt[ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj[hMhjv[hhubj4)}(hhh]jM)}(h Free memory.h]h Free memory.}(hj,\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhj)\hhubah}(h]h ]h"]h$]h&]uh1j3hjv[hhhj[hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjD\jHjD\jIjJjKuh1hhhhjLhNhNubj)}(h**Parameters** ``const void *addr`` Pointer to allocated memory. **Description** Same as kvfree(), but uses vfree_atomic() for vmalloc backed memory. Must not be called from NMI context.h](jM)}(h**Parameters**h]j)}(hjN\h]h Parameters}(hjP\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL\ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjH\ubj)}(hhh]j)}(h2``const void *addr`` Pointer to allocated memory. h](j)}(h``const void *addr``h]jS)}(hjm\h]hconst void *addr}(hjo\hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjk\ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjg\ubj)}(hhh]jM)}(hPointer to allocated memory.h]hPointer to allocated memory.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1jhjg\ubeh}(h]h ]h"]h$]h&]uh1jhj\hMhjd\ubah}(h]h ]h"]h$]h&]uh1jhjH\ubjM)}(h**Description**h]j)}(hj\h]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjH\ubjM)}(hiSame as kvfree(), but uses vfree_atomic() for vmalloc backed memory. Must not be called from NMI context.h]hiSame as kvfree(), but uses vfree_atomic() for vmalloc backed memory. Must not be called from NMI context.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjH\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkvfree_sensitive (C function)c.kvfree_sensitivehNtauh1hhjLhhhNhNubh)}(hhh](h)}(h4void kvfree_sensitive (const void *addr, size_t len)h]h)}(h3void kvfree_sensitive(const void *addr, size_t len)h](j)}(hvoidh]hvoid}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\hhhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\hhhj\hMubh)}(hkvfree_sensitiveh]j)}(hkvfree_sensitiveh]hkvfree_sensitive}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ]ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj\hhhj\hMubj )}(h(const void *addr, size_t len)h](j )}(hconst void *addrh](j5)}(hjh]hconst}(hj*]hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj&]ubj)}(h h]h }(hj7]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&]ubj)}(hvoidh]hvoid}(hjE]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&]ubj)}(h h]h }(hjS]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&]ubjF )}(hjI h]h*}(hja]hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj&]ubj)}(haddrh]haddr}(hjn]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&]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&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]modnameN classnameNjpjs)}jv]jy)}jlj]sbc.kvfree_sensitiveasbuh1hhj]ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj)}(hlenh]hlen}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj"]ubeh}(h]h ]h"]h$]h&]jjuh1j hj\hhhj\hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj\hhhj\hMubah}(h]j\ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj\hMhj\hhubj4)}(hhh]jM)}(h4Free a data object containing sensitive information.h]h4Free a data object containing sensitive information.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhj]hhubah}(h]h ]h"]h$]h&]uh1j3hj\hhhj\hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj]jHj]jIjJjKuh1hhhhjLhNhNubj)}(hXE**Parameters** ``const void *addr`` address of the data object to be freed. ``size_t len`` length of the data object. **Description** Use the special memzero_explicit() function to clear the content of a kvmalloc'ed object containing sensitive data to make sure that the compiler won't optimize out the data clearing.h](jM)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhj]ubj)}(hhh](j)}(h=``const void *addr`` address of the data object to be freed. h](j)}(h``const void *addr``h]jS)}(hj#^h]hconst void *addr}(hj%^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj!^ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhj^ubj)}(hhh]jM)}(h'address of the data object to be freed.h]h'address of the data object to be freed.}(hj<^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj8^hMhj9^ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj8^hMhj^ubj)}(h*``size_t len`` length of the data object. h](j)}(h``size_t len``h]jS)}(hj\^h]h size_t len}(hj^^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZ^ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhjV^ubj)}(hhh]jM)}(hlength of the data object.h]hlength of the data object.}(hju^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjq^hMhjr^ubah}(h]h ]h"]h$]h&]uh1jhjV^ubeh}(h]h ]h"]h$]h&]uh1jhjq^hMhj^ubeh}(h]h ]h"]h$]h&]uh1jhj]ubjM)}(h**Description**h]j)}(hj^h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhj]ubjM)}(hUse the special memzero_explicit() function to clear the content of a kvmalloc'ed object containing sensitive data to make sure that the compiler won't optimize out the data clearing.h]hUse the special memzero_explicit() function to clear the content of a kvmalloc’ed object containing sensitive data to make sure that the compiler won’t optimize out the data clearing.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chMhj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjLhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"kmem_cache_alloc_bulk (C function)c.kmem_cache_alloc_bulkhNtauh1hhjLhhhNhNubh)}(hhh](h)}(hUbool kmem_cache_alloc_bulk (struct kmem_cache *s, gfp_t flags, size_t size, void **p)h]h)}(hTbool kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, void **p)h](j)}(hj-h]hbool}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM+ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhj^hM+ubh)}(hkmem_cache_alloc_bulkh]j)}(hkmem_cache_alloc_bulkh]hkmem_cache_alloc_bulk}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj^hhhj^hM+ubj )}(h:(struct kmem_cache *s, gfp_t flags, size_t size, void **p)h](j )}(hstruct kmem_cache *sh](j5)}(hj8h]hstruct}(hj_hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj_ubj)}(h h]h }(hj%_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubh)}(hhh]j)}(h kmem_cacheh]h kmem_cache}(hj6_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8_modnameN classnameNjpjs)}jv]jy)}jlj^sbc.kmem_cache_alloc_bulkasbuh1hhj_ubj)}(h h]h }(hjV_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubjF )}(hjI h]h*}(hjd_hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj_ubj)}(hjRh]hs}(hjq_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj_ubj )}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj_modnameN classnameNjpjs)}jv]jR_c.kmem_cache_alloc_bulkasbuh1hhj_ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hflagsh]hflags}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj_ubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj_modnameN classnameNjpjs)}jv]jR_c.kmem_cache_alloc_bulkasbuh1hhj_ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hsizeh]hsize}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj_ubj )}(hvoid **ph](j)}(hvoidh]hvoid}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(h h]h }(hj'`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubjF )}(hjI h]h*}(hj5`hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj`ubjF )}(hjI h]h*}(hjB`hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj`ubj)}(hjR h]hp}(hjO`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj_ubeh}(h]h ]h"]h$]h&]jjuh1j hj^hhhj^hM+ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj^hhhj^hM+ubah}(h]j^ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj^hM+hj^hhubj4)}(hhh]jM)}(hAllocate multiple objectsh]hAllocate multiple objects}(hjx`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM+hju`hhubah}(h]h ]h"]h$]h&]uh1j3hj^hhhj^hM+ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj`jHj`jIjJjKuh1hhhhjLhNhNubj)}(hXY**Parameters** ``struct kmem_cache *s`` The cache to allocate from ``gfp_t flags`` GFP_* flags. See kmalloc(). ``size_t size`` Number of objects to allocate ``void **p`` Array of allocated objects **Description** Allocate **size** objects from **s** and places them into **p**. **size** must be larger than 0. Interrupts must be enabled when calling this function. Unlike alloc_pages_bulk(), this function does not check for already allocated objects in **p**, and thus the caller does not need to zero it. **Return** ``true`` if the allocation succeeded, or ``false`` if it failed.h](jM)}(h**Parameters**h]j)}(hj`h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM/hj`ubj)}(hhh](j)}(h4``struct kmem_cache *s`` The cache to allocate from h](j)}(h``struct kmem_cache *s``h]jS)}(hj`h]hstruct kmem_cache *s}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM,hj`ubj)}(hhh]jM)}(hThe cache to allocate fromh]hThe cache to allocate from}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`hM,hj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hM,hj`ubj)}(h,``gfp_t flags`` GFP_* flags. See kmalloc(). h](j)}(h``gfp_t flags``h]jS)}(hj`h]h gfp_t flags}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM-hj`ubj)}(hhh]jM)}(hGFP_* flags. See kmalloc().h]hGFP_* flags. See kmalloc().}(hj ahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjahM-hjaubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhjahM-hj`ubj)}(h.``size_t size`` Number of objects to allocate h](j)}(h``size_t size``h]jS)}(hj+ah]h size_t size}(hj-ahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)aubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM.hj%aubj)}(hhh]jM)}(hNumber of objects to allocateh]hNumber of objects to allocate}(hjDahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@ahM.hjAaubah}(h]h ]h"]h$]h&]uh1jhj%aubeh}(h]h ]h"]h$]h&]uh1jhj@ahM.hj`ubj)}(h(``void **p`` Array of allocated objects h](j)}(h ``void **p``h]jS)}(hjdah]hvoid **p}(hjfahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbaubah}(h]h ]h"]h$]h&]uh1jhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM/hj^aubj)}(hhh]jM)}(hArray of allocated objectsh]hArray of allocated objects}(hj}ahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyahM/hjzaubah}(h]h ]h"]h$]h&]uh1jhj^aubeh}(h]h ]h"]h$]h&]uh1jhjyahM/hj`ubeh}(h]h ]h"]h$]h&]uh1jhj`ubjM)}(h**Description**h]j)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM1hj`ubjM)}(haAllocate **size** objects from **s** and places them into **p**. **size** must be larger than 0.h](h Allocate }(hjahhhNhNubj)}(h**size**h]hsize}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh objects from }(hjahhhNhNubj)}(h**s**h]hs}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh and places them into }(hjahhhNhNubj)}(h**p**h]hp}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh. }(hjahhhNhNubj)}(h**size**h]hsize}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh must be larger than 0.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM0hj`ubjM)}(h6Interrupts must be enabled when calling this function.h]h6Interrupts must be enabled when calling this function.}(hj bhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM3hj`ubjM)}(hUnlike alloc_pages_bulk(), this function does not check for already allocated objects in **p**, and thus the caller does not need to zero it.h](hYUnlike alloc_pages_bulk(), this function does not check for already allocated objects in }(hjbhhhNhNubj)}(h**p**h]hp}(hj#bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh/, and thus the caller does not need to zero it.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhI/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:40: ./mm/slub.chM5hj`ubjM)}(h **Return**h]j)}(hj>bh]hReturn}(hj@bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;dubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@dmodnameN classnameNjpjs)}jv]jbc.__kmem_cache_create_argsasbuh1hhj7dubj)}(h h]h }(hj\dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7dubj)}(hflagsh]hflags}(hjjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7dubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcubeh}(h]h ]h"]h$]h&]jjuh1j hjbhhhjbhM$ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjbhhhjbhM$ubah}(h]jbah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjbhM$hjbhhubj4)}(hhh]jM)}(hCreate a kmem cache.h]hCreate a kmem cache.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM$hjdhhubah}(h]h ]h"]h$]h&]uh1j3hjbhhhjbhM$ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjdjHjdjIjJjKuh1hhhhjLhNhNubj)}(hX**Parameters** ``const char *name`` A string which is used in /proc/slabinfo to identify this cache. ``unsigned int object_size`` The size of objects to be created in this cache. ``struct kmem_cache_args *args`` Additional arguments for the cache creation (see :c:type:`struct kmem_cache_args `). ``slab_flags_t flags`` See the descriptions of individual flags. The common ones are listed in the description below. **Description** Not to be called directly, use the kmem_cache_create() wrapper with the same parameters. Commonly used **flags**: :c:type:`SLAB_ACCOUNT` - Account allocations to memcg. :c:type:`SLAB_HWCACHE_ALIGN` - Align objects on cache line boundaries. :c:type:`SLAB_RECLAIM_ACCOUNT` - Objects are reclaimable. :c:type:`SLAB_TYPESAFE_BY_RCU` - Slab page (not individual objects) freeing delayed by a grace period - see the full description before using. **Context** Cannot be called within a interrupt, but can be interrupted. **Return** a pointer to the cache on success, NULL on failure.h](jM)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM(hjdubj)}(hhh](j)}(hV``const char *name`` A string which is used in /proc/slabinfo to identify this cache. h](j)}(h``const char *name``h]jS)}(hjdh]hconst char *name}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjdubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM%hjdubj)}(hhh]jM)}(h@A string which is used in /proc/slabinfo to identify this cache.h]h@A string which is used in /proc/slabinfo to identify this cache.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdhM%hjdubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjdhM%hjdubj)}(hN``unsigned int object_size`` The size of objects to be created in this cache. h](j)}(h``unsigned int object_size``h]jS)}(hjeh]hunsigned int object_size}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj eubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM&hjeubj)}(hhh]jM)}(h0The size of objects to be created in this cache.h]h0The size of objects to be created in this cache.}(hj'ehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#ehM&hj$eubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhj#ehM&hjdubj)}(h``struct kmem_cache_args *args`` Additional arguments for the cache creation (see :c:type:`struct kmem_cache_args `). h](j)}(h ``struct kmem_cache_args *args``h]jS)}(hjGeh]hstruct kmem_cache_args *args}(hjIehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjEeubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM(hjAeubj)}(hhh]jM)}(heAdditional arguments for the cache creation (see :c:type:`struct kmem_cache_args `).h](h1Additional arguments for the cache creation (see }(hj`ehhhNhNubh)}(h2:c:type:`struct kmem_cache_args `h]jS)}(hjjeh]hstruct kmem_cache_args}(hjlehhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjheubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1kmem_cache_argsuh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM'hj`eubh).}(hj`ehhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjehM'hj]eubah}(h]h ]h"]h$]h&]uh1jhjAeubeh}(h]h ]h"]h$]h&]uh1jhj\ehM(hjdubj)}(hv``slab_flags_t flags`` See the descriptions of individual flags. The common ones are listed in the description below. h](j)}(h``slab_flags_t flags``h]jS)}(hjeh]hslab_flags_t flags}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM*hjeubj)}(hhh]jM)}(h^See the descriptions of individual flags. The common ones are listed in the description below.h]h^See the descriptions of individual flags. The common ones are listed in the description below.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM)hjeubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjehM*hjdubeh}(h]h ]h"]h$]h&]uh1jhjdubjM)}(h**Description**h]j)}(hjeh]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM,hjdubjM)}(hXNot to be called directly, use the kmem_cache_create() wrapper with the same parameters.h]hXNot to be called directly, use the kmem_cache_create() wrapper with the same parameters.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM+hjdubjM)}(hCommonly used **flags**:h](hCommonly used }(hjfhhhNhNubj)}(h **flags**h]hflags}(hj fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh:}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM.hjdubjM)}(h6:c:type:`SLAB_ACCOUNT` - Account allocations to memcg.h](h)}(h:c:type:`SLAB_ACCOUNT`h]jS)}(hj,fh]h SLAB_ACCOUNT}(hj.fhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhj*fubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1 SLAB_ACCOUNTuh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM0hj&fubh - Account allocations to memcg.}(hj&fhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjIfhM0hjdubjM)}(hF:c:type:`SLAB_HWCACHE_ALIGN` - Align objects on cache line boundaries.h](h)}(h:c:type:`SLAB_HWCACHE_ALIGN`h]jS)}(hjZfh]hSLAB_HWCACHE_ALIGN}(hj\fhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjXfubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_HWCACHE_ALIGNuh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM2hjTfubh* - Align objects on cache line boundaries.}(hjTfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjwfhM2hjdubjM)}(h9:c:type:`SLAB_RECLAIM_ACCOUNT` - Objects are reclaimable.h](h)}(h:c:type:`SLAB_RECLAIM_ACCOUNT`h]jS)}(hjfh]hSLAB_RECLAIM_ACCOUNT}(hjfhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjfubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_RECLAIM_ACCOUNTuh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM4hjfubh - Objects are reclaimable.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjfhM4hjdubjM)}(h:c:type:`SLAB_TYPESAFE_BY_RCU` - Slab page (not individual objects) freeing delayed by a grace period - see the full description before using.h](h)}(h:c:type:`SLAB_TYPESAFE_BY_RCU`h]jS)}(hjfh]hSLAB_TYPESAFE_BY_RCU}(hjfhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjfubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1SLAB_TYPESAFE_BY_RCUuh1hhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM6hjfubhp - Slab page (not individual objects) freeing delayed by a grace period - see the full description before using.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjfhM6hjdubjM)}(h **Context**h]j)}(hjfh]hContext}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chM9hjdubjM)}(hohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(h h]h }(hjLohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubjF )}(hjI h]h*}(hjZohhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjoubj)}(hjR h]hp}(hjgohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubah}(h]h ]h"]h$]h&]jjuh1j hjnhhhjnhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjnhhhjnhMubah}(h]jnah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjnhMhjnhhubj4)}(hhh]jM)}(h4Clear sensitive information in memory before freeingh]h4Clear sensitive information in memory before freeing}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chMhjohhubah}(h]h ]h"]h$]h&]uh1j3hjnhhhjnhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjojHjojIjJjKuh1hhhhjLhNhNubj)}(hX**Parameters** ``const void *p`` object to free memory of **Description** The memory of the object **p** points to is zeroed before freed. If **p** is ``NULL``, kfree_sensitive() does nothing. **Note** this function zeroes the whole allocated buffer which can be a good deal bigger than the requested buffer size passed to kmalloc(). So be careful when using this function in performance sensitive code.h](jM)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chMhjoubj)}(hhh]j)}(h+``const void *p`` object to free memory of h](j)}(h``const void *p``h]jS)}(hjoh]h const void *p}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chMhjoubj)}(hhh]jM)}(hobject to free memory ofh]hobject to free memory of}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjohMhjoubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjohMhjoubah}(h]h ]h"]h$]h&]uh1jhjoubjM)}(h**Description**h]j)}(hj ph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhj pubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:43: ./mm/slab_common.chMhjoubjM)}(hvThe memory of the object **p** points to is zeroed before freed. If **p** is ``NULL``, kfree_sensitive() does nothing.h](hThe memory of the object }(hj"phhhNhNubj)}(h**p**h]hp}(hj*phhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"pubh& points to is zeroed before freed. If }(hj"phhhNhNubj)}(h**p**h]hp}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hcounth]hcount}(hjLvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjuubj )}(hint nodeh](j)}(hinth]hint}(hjevhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjavubj)}(h h]h }(hjsvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjavubj)}(hnodeh]hnode}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjavubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjuubeh}(h]h ]h"]h$]h&]jjuh1j hjGuhhhjYuhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjCuhhhjYuhM ubah}(h]j>uah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjYuhM hj@uhhubj4)}(hhh]jM)}(h>map pages linearly into kernel virtual address (vmalloc space)h]h>map pages linearly into kernel virtual address (vmalloc space)}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvhhubah}(h]h ]h"]h$]h&]uh1j3hj@uhhhjYuhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjvjHjvjIjJjKuh1hhhhjrhNhNubj)}(hX**Parameters** ``struct page **pages`` an array of pointers to the pages to be mapped ``unsigned int count`` number of pages ``int node`` prefer to allocate data structures on this node **Description** If you use this function for less than VMAP_MAX_ALLOC pages, it could be faster than vmap so it's good. But if you mix long-life and short-life objects with vm_map_ram(), it could consume lots of address space through fragmentation (especially on a 32bit machine). You could see failures in the end. Please use this function for short-lived objects. **Return** a pointer to the address that has been mapped, or ``NULL`` on failureh](jM)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvubj)}(hhh](j)}(hG``struct page **pages`` an array of pointers to the pages to be mapped h](j)}(h``struct page **pages``h]jS)}(hjvh]hstruct page **pages}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvubj)}(hhh]jM)}(h.an array of pointers to the pages to be mappedh]h.an array of pointers to the pages to be mapped}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjwhM hjwubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjwhM hjvubj)}(h'``unsigned int count`` number of pages h](j)}(h``unsigned int count``h]jS)}(hj%wh]hunsigned int count}(hj'whhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#wubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjwubj)}(hhh]jM)}(hnumber of pagesh]hnumber of pages}(hj>whhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:whM hj;wubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhj:whM hjvubj)}(h=``int node`` prefer to allocate data structures on this node h](j)}(h ``int node``h]jS)}(hj^wh]hint node}(hj`whhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\wubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjXwubj)}(hhh]jM)}(h/prefer to allocate data structures on this nodeh]h/prefer to allocate data structures on this node}(hjwwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjswhM hjtwubah}(h]h ]h"]h$]h&]uh1jhjXwubeh}(h]h ]h"]h$]h&]uh1jhjswhM hjvubeh}(h]h ]h"]h$]h&]uh1jhjvubjM)}(h**Description**h]j)}(hjwh]h Description}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvubjM)}(hX`If you use this function for less than VMAP_MAX_ALLOC pages, it could be faster than vmap so it's good. But if you mix long-life and short-life objects with vm_map_ram(), it could consume lots of address space through fragmentation (especially on a 32bit machine). You could see failures in the end. Please use this function for short-lived objects.h]hXbIf you use this function for less than VMAP_MAX_ALLOC pages, it could be faster than vmap so it’s good. But if you mix long-life and short-life objects with vm_map_ram(), it could consume lots of address space through fragmentation (especially on a 32bit machine). You could see failures in the end. Please use this function for short-lived objects.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvubjM)}(h **Return**h]j)}(hjwh]hReturn}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvubjM)}(hEa pointer to the address that has been mapped, or ``NULL`` on failureh](h2a pointer to the address that has been mapped, or }(hjwhhhNhNubjS)}(h``NULL``h]hNULL}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjwubh on failure}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvfree (C function)c.vfreehNtauh1hhjrhhhNhNubh)}(hhh](h)}(hvoid vfree (const void *addr)h]h)}(hvoid vfree(const void *addr)h](j)}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM ubj)}(h h]h }(hj&xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxhhhj%xhM ubh)}(hvfreeh]j)}(hvfreeh]hvfree}(hj8xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4xubah}(h]h ](jjeh"]h$]h&]jjuh1hhjxhhhj%xhM ubj )}(h(const void *addr)h]j )}(hconst void *addrh](j5)}(hjh]hconst}(hjTxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjPxubj)}(h h]h }(hjaxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPxubj)}(hvoidh]hvoid}(hjoxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPxubj)}(h h]h }(hj}xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPxubjF )}(hjI h]h*}(hjxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjPxubj)}(haddrh]haddr}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPxubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLxubah}(h]h ]h"]h$]h&]jjuh1j hjxhhhj%xhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjxhhhj%xhM ubah}(h]j xah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%xhM hj xhhubj4)}(hhh]jM)}(h%Release memory allocated by vmalloc()h]h%Release memory allocated by vmalloc()}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjxhhubah}(h]h ]h"]h$]h&]uh1j3hj xhhhj%xhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjxjHjxjIjJjKuh1hhhhjrhNhNubj)}(hX**Parameters** ``const void *addr`` Memory base address **Description** Free the virtually continuous memory area starting at **addr**, as obtained from one of the vmalloc() family of APIs. This will usually also free the physical memory underlying the virtual allocation, but that memory is reference counted, so it will not be freed until the last user goes away. If **addr** is NULL, no operation is performed. **Context** May sleep if called *not* from interrupt context. Must not be called in NMI context (strictly speaking, it could be if we have CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG, but making the calling conventions for vfree() arch-dependent would be a really bad idea).h](jM)}(h**Parameters**h]j)}(hjxh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjxubj)}(hhh]j)}(h)``const void *addr`` Memory base address h](j)}(h``const void *addr``h]jS)}(hjyh]hconst void *addr}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjyubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjxubj)}(hhh]jM)}(hMemory base addressh]hMemory base address}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhM hjyubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jhjyhM hjxubah}(h]h ]h"]h$]h&]uh1jhjxubjM)}(h**Description**h]j)}(hj>yh]h Description}(hj@yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjflags ``pgprot_t prot`` page protection for the mapping **Description** Maps **count** pages from **pages** into contiguous kernel virtual space. If **flags** contains ``VM_MAP_PUT_PAGES`` the ownership of the pages array itself (which must be kmalloc or vmalloc memory) and one reference per pages in it are transferred from the caller to vmap(), and will be freed / dropped when vfree() is called on the return value. **Return** the address of the area or ``NULL`` on failureh](jM)}(h**Parameters**h]j)}(hjb}h]h Parameters}(hjd}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`}ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj\}ubj)}(hhh](j)}(h/``struct page **pages`` array of page pointers h](j)}(h``struct page **pages``h]jS)}(hj}h]hstruct page **pages}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj{}ubj)}(hhh]jM)}(harray of page pointersh]harray of page pointers}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj}hM hj}ubah}(h]h ]h"]h$]h&]uh1jhj{}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM hjx}ubj)}(h.``unsigned int count`` number of pages to map h](j)}(h``unsigned int count``h]jS)}(hj}h]hunsigned int count}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj}ubj)}(hhh]jM)}(hnumber of pages to maph]hnumber of pages to map}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj}hM hj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM hjx}ubj)}(h'``unsigned long flags`` vm_area->flags h](j)}(h``unsigned long flags``h]jS)}(hj}h]hunsigned long flags}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj}ubj)}(hhh]jM)}(hvm_area->flagsh]hvm_area->flags}(hj ~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~hM hj ~ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj~hM hjx}ubj)}(h2``pgprot_t prot`` page protection for the mapping h](j)}(h``pgprot_t prot``h]jS)}(hj,~h]h pgprot_t prot}(hj.~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj*~ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj&~ubj)}(hhh]jM)}(hpage protection for the mappingh]hpage protection for the mapping}(hjE~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjA~hM hjB~ubah}(h]h ]h"]h$]h&]uh1jhj&~ubeh}(h]h ]h"]h$]h&]uh1jhjA~hM hjx}ubeh}(h]h ]h"]h$]h&]uh1jhj\}ubjM)}(h**Description**h]j)}(hjg~h]h Description}(hji~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje~ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj\}ubjM)}(hX[Maps **count** pages from **pages** into contiguous kernel virtual space. If **flags** contains ``VM_MAP_PUT_PAGES`` the ownership of the pages array itself (which must be kmalloc or vmalloc memory) and one reference per pages in it are transferred from the caller to vmap(), and will be freed / dropped when vfree() is called on the return value.h](hMaps }(hj}~hhhNhNubj)}(h **count**h]hcount}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}~ubh pages from }(hj}~hhhNhNubj)}(h **pages**h]hpages}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}~ubh* into contiguous kernel virtual space. If }(hj}~hhhNhNubj)}(h **flags**h]hflags}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}~ubh contains }(hj}~hhhNhNubjS)}(h``VM_MAP_PUT_PAGES``h]hVM_MAP_PUT_PAGES}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}~ubh the ownership of the pages array itself (which must be kmalloc or vmalloc memory) and one reference per pages in it are transferred from the caller to vmap(), and will be freed / dropped when vfree() is called on the return value.}(hj}~hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj\}ubjM)}(h **Return**h]j)}(hj~h]hReturn}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj\}ubjM)}(h.the address of the area or ``NULL`` on failureh](hthe address of the area or }(hj~hhhNhNubjS)}(h``NULL``h]hNULL}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~ubh on failure}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hj\}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmap_pfn (C function) c.vmap_pfnhNtauh1hhjrhhhNhNubh)}(hhh](h)}(hHvoid * vmap_pfn (unsigned long *pfns, unsigned int count, pgprot_t prot)h]h)}(hFvoid *vmap_pfn(unsigned long *pfns, unsigned int count, pgprot_t prot)h](j)}(hvoidh]hvoid}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM)ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhj;hM)ubjF )}(hjI h]h*}(hjJhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj)hhhj;hM)ubh)}(hvmap_pfnh]j)}(hvmap_pfnh]hvmap_pfn}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ](jjeh"]h$]h&]jjuh1hhj)hhhj;hM)ubj )}(h8(unsigned long *pfns, unsigned int count, pgprot_t prot)h](j )}(hunsigned long *pfnsh](j)}(hunsignedh]hunsigned}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjsubj)}(hpfnsh]hpfns}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubj )}(hunsigned int counth](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcounth]hcount}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubj )}(h pgprot_t proth](h)}(hhh]j)}(hpgprot_th]hpgprot_t}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj+modnameN classnameNjpjs)}jv]jy)}jlj]sb c.vmap_pfnasbuh1hhj"ubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hproth]hprot}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubeh}(h]h ]h"]h$]h&]jjuh1j hj)hhhj;hM)ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj%hhhj;hM)ubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj;hM)hj"hhubj4)}(hhh]jM)}(h4map an array of PFNs into virtually contiguous spaceh]h4map an array of PFNs into virtually contiguous space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM)hj~hhubah}(h]h ]h"]h$]h&]uh1j3hj"hhhj;hM)ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(hX$**Parameters** ``unsigned long *pfns`` array of PFNs ``unsigned int count`` number of pages to map ``pgprot_t prot`` page protection for the mapping **Description** Maps **count** PFNs from **pfns** into contiguous kernel virtual space and returns the start address of the mapping.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM-hjubj)}(hhh](j)}(h&``unsigned long *pfns`` array of PFNs h](j)}(h``unsigned long *pfns``h]jS)}(hj€h]hunsigned long *pfns}(hjĀhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM*hjubj)}(hhh]jM)}(h array of PFNsh]h array of PFNs}(hjۀhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj׀hM*hj؀ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj׀hM*hjubj)}(h.``unsigned int count`` number of pages to map h](j)}(h``unsigned int count``h]jS)}(hjh]hunsigned int count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM+hjubj)}(hhh]jM)}(hnumber of pages to maph]hnumber of pages to map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjubj)}(h2``pgprot_t prot`` page protection for the mapping h](j)}(h``pgprot_t prot``h]jS)}(hj4h]h pgprot_t prot}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM,hj.ubj)}(hhh]jM)}(hpage protection for the mappingh]hpage protection for the mapping}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhM,hjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhM,hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM.hjubjM)}(htMaps **count** PFNs from **pfns** into contiguous kernel virtual space and returns the start address of the mapping.h](hMaps }(hjhhhNhNubj)}(h **count**h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh PFNs from }(hjhhhNhNubj)}(h**pfns**h]hpfns}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhS into contiguous kernel virtual space and returns the start address of the mapping.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM-hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__vmalloc_node (C function)c.__vmalloc_nodehNtauh1hhjrhhhNhNubh)}(hhh](h)}(hmvoid * __vmalloc_node (unsigned long size, unsigned long align, gfp_t gfp_mask, int node, const void *caller)h]h)}(hkvoid *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask, int node, const void *caller)h](j)}(hvoidh]hvoid}(hj؁hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԁhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM3ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԁhhhjhM3ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjԁhhhjhM3ubh)}(h__vmalloc_nodeh]j)}(h__vmalloc_nodeh]h__vmalloc_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjԁhhhjhM3ubj )}(hW(unsigned long size, unsigned long align, gfp_t gfp_mask, int node, const void *caller)h](j )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long alignh](j)}(hunsignedh]hunsigned}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(halignh]halign}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjǂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjĂubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjɂmodnameN classnameNjpjs)}jv]jy)}jljsbc.__vmalloc_nodeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hint nodeh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hnodeh]hnode}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst void *callerh](j5)}(hjh]hconst}(hjChhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj?ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubjF )}(hjI h]h*}(hjzhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj?ubj)}(hcallerh]hcaller}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjԁhhhjhM3ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjЁhhhjhM3ubah}(h]jˁah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM3hj́hhubj4)}(hhh]jM)}(h$allocate virtually contiguous memoryh]h$allocate virtually contiguous memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM3hjhhubah}(h]h ]h"]h$]h&]uh1j3hj́hhhjhM3ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjɃjHjɃjIjJjKuh1hhhhjrhNhNubj)}(hXt**Parameters** ``unsigned long size`` allocation size ``unsigned long align`` desired alignment ``gfp_t gfp_mask`` flags for the page level allocator ``int node`` node to use for allocation or NUMA_NO_NODE ``const void *caller`` caller's return address **Description** Allocate enough pages to cover **size** from the page level allocator with **gfp_mask** flags. Map them into contiguous kernel virtual space. Semantics of **gfp_mask** (including reclaim/retry modifiers such as __GFP_NOFAIL) are the same as in __vmalloc_node_range_noprof(). **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjӃh]h Parameters}(hjՃhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjуubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM7hj̓ubj)}(hhh](j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM4hjubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM4hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM4hjubj)}(h*``unsigned long align`` desired alignment h](j)}(h``unsigned long align``h]jS)}(hj+h]hunsigned long align}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM5hj%ubj)}(hhh]jM)}(hdesired alignmenth]hdesired alignment}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hM5hjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hM5hjubj)}(h6``gfp_t gfp_mask`` flags for the page level allocator h](j)}(h``gfp_t gfp_mask``h]jS)}(hjdh]hgfp_t gfp_mask}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM6hj^ubj)}(hhh]jM)}(h"flags for the page level allocatorh]h"flags for the page level allocator}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhM6hjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhM6hjubj)}(h8``int node`` node to use for allocation or NUMA_NO_NODE h](j)}(h ``int node``h]jS)}(hjh]hint node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM7hjubj)}(hhh]jM)}(h*node to use for allocation or NUMA_NO_NODEh]h*node to use for allocation or NUMA_NO_NODE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM7hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM7hjubj)}(h/``const void *caller`` caller's return address h](j)}(h``const void *caller``h]jS)}(hjքh]hconst void *caller}(hj؄hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjԄubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM8hjЄubj)}(hhh]jM)}(hcaller's return addressh]hcaller’s return address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM8hjubah}(h]h ]h"]h$]h&]uh1jhjЄubeh}(h]h ]h"]h$]h&]uh1jhjhM8hjubeh}(h]h ]h"]h$]h&]uh1jhj̓ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM:hj̓ubjM)}(hAllocate enough pages to cover **size** from the page level allocator with **gfp_mask** flags. Map them into contiguous kernel virtual space.h](hAllocate enough pages to cover }(hj'hhhNhNubj)}(h**size**h]hsize}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh$ from the page level allocator with }(hj'hhhNhNubj)}(h **gfp_mask**h]hgfp_mask}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh7 flags. Map them into contiguous kernel virtual space.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM9hj̓ubjM)}(hSemantics of **gfp_mask** (including reclaim/retry modifiers such as __GFP_NOFAIL) are the same as in __vmalloc_node_range_noprof().h](h Semantics of }(hjZhhhNhNubj)}(h **gfp_mask**h]hgfp_mask}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubhk (including reclaim/retry modifiers such as __GFP_NOFAIL) are the same as in __vmalloc_node_range_noprof().}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM<hj̓ubjM)}(h **Return**h]j)}(hj}h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM?hj̓ubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh on error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM@hj̓ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmalloc (C function) c.vmallochNtauh1hhjrhhhNhNubh)}(hhh](h)}(h#void * vmalloc (unsigned long size)h]h)}(h!void *vmalloc(unsigned long size)h](j)}(hvoidh]hvoid}(hjԅhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЅhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM[ubj)}(h h]h }( hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЅhhhjhM[ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjЅhhhjhM[ubh)}(hvmalloch]j)}(hvmalloch]hvmalloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjЅhhhjhM[ubj )}(h(unsigned long size)h]j )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjЅhhhjhM[ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj̅hhhjhM[ubah}(h]jDžah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM[hjɅhhubj4)}(hhh]jM)}(h$allocate virtually contiguous memoryh]h$allocate virtually contiguous memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM[hj}hhubah}(h]h ]h"]h$]h&]uh1j3hjɅhhhjhM[ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(hX`**Parameters** ``unsigned long size`` allocation size **Description** Allocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. For tight control over page level allocator and protection flags use __vmalloc() instead. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM_hjubj)}(hhh]j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjÆhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM\hjubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hjچhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjֆhM\hj׆ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjֆhM\hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM^hjubjM)}(hxAllocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space.h](hAllocate enough pages to cover }(hjhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ from the page level allocator and map them into contiguous kernel virtual space.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM]hjubjM)}(hYFor tight control over page level allocator and protection flags use __vmalloc() instead.h]hYFor tight control over page level allocator and protection flags use __vmalloc() instead.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM`hjubjM)}(h **Return**h]j)}(hjDh]hReturn}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMchjubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjZhhhNhNubjS)}(h``NULL``h]hNULL}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubh on error}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMdhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmalloc_huge_node (C function)c.vmalloc_huge_nodehNtauh1hhjrhhhNhNubh)}(hhh](h)}(hGvoid * vmalloc_huge_node (unsigned long size, gfp_t gfp_mask, int node)h]h)}(hEvoid *vmalloc_huge_node(unsigned long size, gfp_t gfp_mask, int node)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMnubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMnubh)}(hvmalloc_huge_nodeh]j)}(hvmalloc_huge_nodeh]hvmalloc_huge_node}(hjɇhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŇubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMnubj )}(h.(unsigned long size, gfp_t gfp_mask, int node)h](j )}(hunsigned long sizeh](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)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj݇ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj;modnameN classnameNjpjs)}jv]jy)}jljˇsbc.vmalloc_huge_nodeasbuh1hhj2ubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hgfp_maskh]hgfp_mask}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj݇ubj )}(hint nodeh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj݇ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMnubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMnubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMnhjhhubj4)}(hhh]jM)}(h6allocate virtually contiguous memory, allow huge pagesh]h6allocate virtually contiguous memory, allow huge pages}(hjƈhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMnhjÈhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMnubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjވjHjވjIjJjKuh1hhhhjrhNhNubj)}(hX**Parameters** ``unsigned long size`` allocation size ``gfp_t gfp_mask`` flags for the page level allocator ``int node`` node to use for allocation or NUMA_NO_NODE **Description** Allocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. If **size** is greater than or equal to PMD_SIZE, allow using huge pages for the memory **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMrhjubj)}(hhh](j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMohjubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMohjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMohjubj)}(h6``gfp_t gfp_mask`` flags for the page level allocator h](j)}(h``gfp_t gfp_mask``h]jS)}(hj@h]hgfp_t gfp_mask}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMphj:ubj)}(hhh]jM)}(h"flags for the page level allocatorh]h"flags for the page level allocator}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjUhMphjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhjUhMphjubj)}(h8``int node`` node to use for allocation or NUMA_NO_NODE h](j)}(h ``int node``h]jS)}(hjyh]hint node}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjwubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMqhjsubj)}(hhh]jM)}(h*node to use for allocation or NUMA_NO_NODEh]h*node to use for allocation or NUMA_NO_NODE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMqhjubah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhjhMqhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMshjubjM)}(hAllocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. If **size** is greater than or equal to PMD_SIZE, allow using huge pages for the memoryh](hAllocate enough pages to cover }(hjʉhhhNhNubj)}(h**size**h]hsize}(hj҉hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʉubhU from the page level allocator and map them into contiguous kernel virtual space. If }(hjʉhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʉubhL is greater than or equal to PMD_SIZE, allow using huge pages for the memory}(hjʉhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMrhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMwhjubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh on error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMxhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvzalloc (C function) c.vzallochNtauh1hhjrhhhNhNubh)}(hhh](h)}(h#void * vzalloc (unsigned long size)h]h)}(h!void *vzalloc(unsigned long size)h](j)}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjdhMubjF )}(hjI h]h*}(hjshhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjRhhhjdhMubh)}(hvzalloch]j)}(hvzalloch]hvzalloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjRhhhjdhMubj )}(h(unsigned long size)h]j )}(hunsigned long sizeh](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)}(hsizeh]hsize}(hj؊hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjRhhhjdhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjNhhhjdhMubah}(h]jIah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjdhMhjKhhubj4)}(hhh]jM)}(h3allocate virtually contiguous memory with zero fillh]h3allocate virtually contiguous memory with zero fill}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjKhhhjdhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(hX**Parameters** ``unsigned long size`` allocation size **Description** Allocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. The memory allocated is set to zero. For tight control over page level allocator and protection flags use __vmalloc() instead. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjCh]hunsigned long size}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjAubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj=ubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjXhMhjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhMhj:ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(hAllocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. The memory allocated is set to zero.h](hAllocate enough pages to cover }(hjhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhv from the page level allocator and map them into contiguous kernel virtual space. The memory allocated is set to zero.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(hYFor tight control over page level allocator and protection flags use __vmalloc() instead.h]hYFor tight control over page level allocator and protection flags use __vmalloc() instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h **Return**h]j)}(hjƋh]hReturn}(hjȋhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjċubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hj܋hhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj܋ubh on error}(hj܋hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmalloc_user (C function)c.vmalloc_userhNtauh1hhjrhhhNhNubh)}(hhh](h)}(h(void * vmalloc_user (unsigned long size)h]h)}(h&void *vmalloc_user(unsigned long size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj+hMubjF )}(hjI h]h*}(hj:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj+hMubh)}(h vmalloc_userh]j)}(h vmalloc_userh]h vmalloc_user}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj+hMubj )}(h(unsigned long size)h]j )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj_ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj+hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj+hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj+hMhjhhubj4)}(hhh]jM)}(h9allocate zeroed virtually contiguous memory for userspaceh]h9allocate zeroed virtually contiguous memory for userspace}(hjɌhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjƌhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj+hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(h**Parameters** ``unsigned long size`` allocation size **Description** The resulting memory area is zeroed so it can be mapped to userspace without leaking data. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hj h]hunsigned long size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjEh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(hZThe resulting memory area is zeroed so it can be mapped to userspace without leaking data.h]hZThe resulting memory area is zeroed so it can be mapped to userspace without leaking data.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h **Return**h]j)}(hjlh]hReturn}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh on error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmalloc_node (C function)c.vmalloc_nodehNtauh1hhjrhhhNhNubh)}(hhh](h)}(h2void * vmalloc_node (unsigned long size, int node)h]h)}(h0void *vmalloc_node(unsigned long size, int node)h](j)}(hvoidh]hvoid}(hjÍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hjҍhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjэhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjэhMubh)}(h vmalloc_nodeh]j)}(h vmalloc_nodeh]h vmalloc_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjэhMubj )}(h(unsigned long size, int node)h](j )}(hunsigned long sizeh](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)}(hsizeh]hsize}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hint nodeh](j)}(hinth]hint}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hnodeh]hnode}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjэhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjэhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjэhMhjhhubj4)}(hhh]jM)}(h"allocate memory on a specific nodeh]h"allocate memory on a specific node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjэhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(hXz**Parameters** ``unsigned long size`` allocation size ``int node`` numa node **Description** Allocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. For tight control over page level allocator and protection flags use __vmalloc() instead. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjƎh]h Parameters}(hjȎhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjĎubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh](j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjߎubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjߎubeh}(h]h ]h"]h$]h&]uh1jhjhMhj܎ubj)}(h``int node`` numa node h](j)}(h ``int node``h]jS)}(hjh]hint node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]jM)}(h numa nodeh]h numa node}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj܎ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjYh]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(hxAllocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space.h](hAllocate enough pages to cover }(hjohhhNhNubj)}(h**size**h]hsize}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubhQ from the page level allocator and map them into contiguous kernel virtual space.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(hYFor tight control over page level allocator and protection flags use __vmalloc() instead.h]hYFor tight control over page level allocator and protection flags use __vmalloc() instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh on error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvzalloc_node (C function)c.vzalloc_nodehNtauh1hhjrhhhNhNubh)}(hhh](h)}(h2void * vzalloc_node (unsigned long size, int node)h]h)}(h0void *vzalloc_node(unsigned long size, int node)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMubh)}(h vzalloc_nodeh]j)}(h vzalloc_nodeh]h vzalloc_node}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(unsigned long size, int node)h](j )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hlongh]hlong}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hsizeh]hsize}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubj )}(hint nodeh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h1allocate memory on a specific node with zero fillh]h1allocate memory on a specific node with zero fill}(hjِhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj֐hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(hXD**Parameters** ``unsigned long size`` allocation size ``int node`` numa node **Description** Allocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. The memory allocated is set to zero. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh](j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/hMhjubj)}(h``int node`` numa node h](j)}(h ``int node``h]jS)}(hjSh]hint node}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjMubj)}(hhh]jM)}(h numa nodeh]h numa node}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhMhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(hAllocate enough pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. The memory allocated is set to zero.h](hAllocate enough pages to cover }(hjhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhv from the page level allocator and map them into contiguous kernel virtual space. The memory allocated is set to zero.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h **Return**h]j)}(hjǑh]hReturn}(hjɑhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjőubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjݑhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjݑubh on error}(hjݑhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h vrealloc_node_align (C function)c.vrealloc_node_alignhNtauh1hhjrhhhNhNubh)}(hhh](h)}(hbvoid * vrealloc_node_align (const void *p, size_t size, unsigned long align, gfp_t flags, int nid)h]h)}(h`void *vrealloc_node_align(const void *p, size_t size, unsigned long align, gfp_t flags, int nid)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj,hMubjF )}(hjI h]h*}(hj;hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj,hMubh)}(hvrealloc_node_alignh]j)}(hvrealloc_node_alignh]hvrealloc_node_align}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj,hMubj )}(hG(const void *p, size_t size, unsigned long align, gfp_t flags, int nid)h](j )}(h const void *ph](j5)}(hjh]hconst}(hjhhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjdubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjdubj)}(hjR h]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj`ubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjǒhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjĒubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjɒmodnameN classnameNjpjs)}jv]jy)}jljNsbc.vrealloc_node_alignasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj`ubj )}(hunsigned long alignh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(halignh]halign}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj`ubj )}(h gfp_t flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjdmodnameN classnameNjpjs)}jv]jc.vrealloc_node_alignasbuh1hhj[ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj`ubj )}(hint nidh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnidh]hnid}(hjÓhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj`ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj,hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj,hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj,hMhjhhubj4)}(hhh]jM)}(hAreallocate virtually contiguous memory; contents remain unchangedh]hAreallocate virtually contiguous memory; contents remain unchanged}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj,hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjrhNhNubj)}(hX'**Parameters** ``const void *p`` object to reallocate memory for ``size_t size`` the size to reallocate ``unsigned long align`` requested alignment ``gfp_t flags`` the flags for the page level allocator ``int nid`` node number of the target node **Description** If **p** is ``NULL``, vrealloc_XXX() behaves exactly like vmalloc_XXX(). If **size** is 0 and **p** is not a ``NULL`` pointer, the object pointed to is freed. If the caller wants the new memory to be on specific node *only*, __GFP_THISNODE flag should be set, otherwise the function will try to avoid reallocation and possibly disregard the specified **nid**. If __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API. Requesting an alignment that is bigger than the alignment of the existing allocation will fail. In any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes. This function must not be called concurrently with itself or vfree() for the same memory allocation. **Return** pointer to the allocated memory; ``NULL`` if **size** is zero or in case of failureh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubj)}(hhh](j)}(h2``const void *p`` object to reallocate memory for h](j)}(h``const void *p``h]jS)}(hj.h]h const void *p}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj(ubj)}(hhh]jM)}(hobject to reallocate memory forh]hobject to reallocate memory for}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChMhjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhj%ubj)}(h'``size_t size`` the size to reallocate h](j)}(h``size_t size``h]jS)}(hjgh]h size_t size}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjaubj)}(hhh]jM)}(hthe size to reallocateh]hthe size to reallocate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj%ubj)}(h,``unsigned long align`` requested alignment h](j)}(h``unsigned long align``h]jS)}(hjh]hunsigned long align}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]jM)}(hrequested alignmenth]hrequested alignment}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubj)}(h7``gfp_t flags`` the flags for the page level allocator h](j)}(h``gfp_t flags``h]jS)}(hjٔh]h gfp_t flags}(hj۔hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjהubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjӔubj)}(hhh]jM)}(h&the flags for the page level allocatorh]h&the flags for the page level allocator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjӔubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubj)}(h+``int nid`` node number of the target node h](j)}(h ``int nid``h]jS)}(hjh]hint nid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubj)}(hhh]jM)}(hnode number of the target nodeh]hnode number of the target node}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'hMhj(ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj'hMhj%ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjMh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(hIf **p** is ``NULL``, vrealloc_XXX() behaves exactly like vmalloc_XXX(). If **size** is 0 and **p** is not a ``NULL`` pointer, the object pointed to is freed.h](hIf }(hjchhhNhNubj)}(h**p**h]hp}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh is }(hjchhhNhNubjS)}(h``NULL``h]hNULL}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubh8, vrealloc_XXX() behaves exactly like vmalloc_XXX(). If }(hjchhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh is 0 and }(hjchhhNhNubj)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubh is not a }(hjchhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubh) pointer, the object pointed to is freed.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(hIf the caller wants the new memory to be on specific node *only*, __GFP_THISNODE flag should be set, otherwise the function will try to avoid reallocation and possibly disregard the specified **nid**.h](h:If the caller wants the new memory to be on specific node }(hj̕hhhNhNubjB)}(h*only*h]honly}(hjԕhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhj̕ubh, __GFP_THISNODE flag should be set, otherwise the function will try to avoid reallocation and possibly disregard the specified }(hj̕hhhNhNubj)}(h**nid**h]hnid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̕ubh.}(hj̕hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(hXIf __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API.h]hXIf __GFP_ZERO logic is requested, callers must ensure that, starting with the initial memory allocation, every subsequent call to this API for the same memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that __GFP_ZERO is not fully honored by this API.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(h_Requesting an alignment that is bigger than the alignment of the existing allocation will fail.h]h_Requesting an alignment that is bigger than the alignment of the existing allocation will fail.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(hkIn any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes.h]hkIn any case, the contents of the object pointed to are preserved up to the lesser of the new and old sizes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(hdThis function must not be called concurrently with itself or vfree() for the same memory allocation.h]hdThis function must not be called concurrently with itself or vfree() for the same memory allocation.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(h **Return**h]j)}(hj=h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubjM)}(hSpointer to the allocated memory; ``NULL`` if **size** is zero or in case of failureh](h!pointer to the allocated memory; }(hjShhhNhNubjS)}(h``NULL``h]hNULL}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjSubh if }(hjShhhNhNubj)}(h**size**h]hsize}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh is zero or in case of failure}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmalloc_32 (C function) c.vmalloc_32hNtauh1hhjrhhhNhNubh)}(hhh](h)}(h&void * vmalloc_32 (unsigned long size)h]h)}(h$void *vmalloc_32(unsigned long size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM}ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM}ubjF )}(hjI h]h*}(hjÖhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhM}ubh)}(h vmalloc_32h]j)}(h vmalloc_32h]h vmalloc_32}(hjԖhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЖubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM}ubj )}(h(unsigned long size)h]j )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM}ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM}ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM}hjhhubj4)}(hhh]jM)}(h8allocate virtually contiguous memory (32bit addressable)h]h8allocate virtually contiguous memory (32bit addressable)}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM}hjOhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM}ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjjHjjjIjJjKuh1hhhhjrhNhNubj)}(hX**Parameters** ``unsigned long size`` allocation size **Description** Allocate enough 32bit PA addressable pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hjth]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjnubj)}(hhh]j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM~hjubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM~hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM~hjubah}(h]h ]h"]h$]h&]uh1jhjnubjM)}(h**Description**h]j)}(hjΗh]h Description}(hjЗhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̗ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjnubjM)}(hAllocate enough 32bit PA addressable pages to cover **size** from the page level allocator and map them into contiguous kernel virtual space.h](h4Allocate enough 32bit PA addressable pages to cover }(hjhhhNhNubj)}(h**size**h]hsize}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ from the page level allocator and map them into contiguous kernel virtual space.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjnubjM)}(h **Return**h]j)}(hjh]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjnubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh on error}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmalloc_32_user (C function)c.vmalloc_32_userhNtauh1hhjrhhhNhNubh)}(hhh](h)}(h+void * vmalloc_32_user (unsigned long size)h]h)}(h)void *vmalloc_32_user(unsigned long size)h](j)}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjlhMubjF )}(hjI h]h*}(hj{hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjZhhhjlhMubh)}(hvmalloc_32_userh]j)}(hvmalloc_32_userh]hvmalloc_32_user}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjZhhhjlhMubj )}(h(unsigned long size)h]j )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hjĘhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjҘhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjZhhhjlhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjVhhhjlhMubah}(h]jQah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjlhMhjShhubj4)}(hhh]jM)}(h1allocate zeroed virtually contiguous 32bit memoryh]h1allocate zeroed virtually contiguous 32bit memory}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjShhhjlhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj"jHj"jIjJjKuh1hhhhjrhNhNubj)}(h**Parameters** ``unsigned long size`` allocation size **Description** The resulting memory area is 32bit addressable and zeroed so it can be mapped to userspace without leaking data. **Return** pointer to the allocated memory or ``NULL`` on errorh](jM)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj&ubj)}(hhh]j)}(h'``unsigned long size`` allocation size h](j)}(h``unsigned long size``h]jS)}(hjKh]hunsigned long size}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjIubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjEubj)}(hhh]jM)}(hallocation sizeh]hallocation size}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`hMhjaubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhj`hMhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj&ubjM)}(hpThe resulting memory area is 32bit addressable and zeroed so it can be mapped to userspace without leaking data.h]hpThe resulting memory area is 32bit addressable and zeroed so it can be mapped to userspace without leaking data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj&ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj&ubjM)}(h4pointer to the allocated memory or ``NULL`` on errorh](h#pointer to the allocated memory or }(hjÙhhhNhNubjS)}(h``NULL``h]hNULL}(hj˙hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjÙubh on error}(hjÙhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h remap_vmalloc_range (C function)c.remap_vmalloc_rangehNtauh1hhjrhhhNhNubh)}(hhh](h)}(hUint remap_vmalloc_range (struct vm_area_struct *vma, void *addr, unsigned long pgoff)h]h)}(hTint remap_vmalloc_range(struct vm_area_struct *vma, void *addr, unsigned long pgoff)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hremap_vmalloc_rangeh]j)}(hremap_vmalloc_rangeh]hremap_vmalloc_range}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h=(struct vm_area_struct *vma, void *addr, unsigned long pgoff)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjAhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj=ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjamodnameN classnameNjpjs)}jv]jy)}jlj'sbc.remap_vmalloc_rangeasbuh1hhj=ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj=ubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj9ubj )}(h void *addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjϚhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(haddrh]haddr}(hjܚhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj9ubj )}(hunsigned long pgoffh](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)}(hpgoffh]hpgoff}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj9ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hmap vmalloc pages to userspaceh]hmap vmalloc pages to userspace}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjThhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjojHjojIjJjKuh1hhhhjrhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` vma to cover (map full range of vma) ``void *addr`` vmalloc memory ``unsigned long pgoff`` number of pages into addr before first page to map **Return** 0 for success, -Exxx on failure **Description** This function checks that addr is a valid vmalloc'ed area, and that it is big enough to cover the vma. Will return failure if that criteria isn't met. Similar to remap_pfn_range() (see mm/memory.c)h](jM)}(h**Parameters**h]j)}(hjyh]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjsubj)}(hhh](j)}(hD``struct vm_area_struct *vma`` vma to cover (map full range of vma) h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]jM)}(h$vma to cover (map full range of vma)h]h$vma to cover (map full range of vma)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``void *addr`` vmalloc memory h](j)}(h``void *addr``h]jS)}(hjћh]h void *addr}(hjӛhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjϛubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhj˛ubj)}(hhh]jM)}(hvmalloc memoryh]hvmalloc memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj˛ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hK``unsigned long pgoff`` number of pages into addr before first page to map h](j)}(h``unsigned long pgoff``h]jS)}(hj h]hunsigned long pgoff}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjubj)}(hhh]jM)}(h2number of pages into addr before first page to maph]h2number of pages into addr before first page to map}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjsubjM)}(h **Return**h]j)}(hjEh]hReturn}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjsubjM)}(h0 for success, -Exxx on failureh]h0 for success, -Exxx on failure}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjsubjM)}(h**Description**h]j)}(hjlh]h Description}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjsubjM)}(hThis function checks that addr is a valid vmalloc'ed area, and that it is big enough to cover the vma. Will return failure if that criteria isn't met.h]hThis function checks that addr is a valid vmalloc’ed area, and that it is big enough to cover the vma. Will return failure if that criteria isn’t met.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chMhjsubjM)}(h.Similar to remap_pfn_range() (see mm/memory.c)h]h.Similar to remap_pfn_range() (see mm/memory.c)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:52: ./mm/vmalloc.chM hjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjrhhhNhNubeh}(h]virtually-contiguous-mappingsah ]h"]virtually contiguous mappingsah$]h&]uh1hhhhhhhhK2ubh)}(hhh](h)}(hFile Mapping and Page Cacheh]hFile Mapping and Page Cache}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK8ubh)}(hhh](h)}(hFilemaph]hFilemap}(hjÜhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK;ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%filemap_fdatawrite_range (C function)c.filemap_fdatawrite_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hVint filemap_fdatawrite_range (struct address_space *mapping, loff_t start, loff_t end)h]h)}(hUint filemap_fdatawrite_range(struct address_space *mapping, loff_t start, loff_t end)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfilemap_fdatawrite_rangeh]j)}(hfilemap_fdatawrite_rangeh]hfilemap_fdatawrite_range}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h9(struct address_space *mapping, loff_t start, loff_t end)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(h address_spaceh]h address_space}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]jy)}jlj sbc.filemap_fdatawrite_rangeasbuh1hhj#ubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hjshhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t starth](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jac.filemap_fdatawrite_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstarth]hstart}(hjȝhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t endh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jac.filemap_fdatawrite_rangeasbuh1hhjݝubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjݝubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjݝubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jݜah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjߜhhubj4)}(hhh]jM)}(h/start writeback on mapping dirty pages in rangeh]h/start writeback on mapping dirty pages in range}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj7hhubah}(h]h ]h"]h$]h&]uh1j3hjߜhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjRjHjRjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address space structure to write ``loff_t start`` offset in bytes where the range starts ``loff_t end`` offset in bytes where the range ends (inclusive) **Description** Start writeback against all of a mapping's dirty pages that lie within the byte offsets inclusive. This is a data integrity operation that waits upon dirty or in writeback pages. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hj\h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjVubj)}(hhh](j)}(hC``struct address_space *mapping`` address space structure to write h](j)}(h!``struct address_space *mapping``h]jS)}(hj{h]hstruct address_space *mapping}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjyubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjuubj)}(hhh]jM)}(h address space structure to writeh]h address space structure to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jhjhMhjrubj)}(h8``loff_t start`` offset in bytes where the range starts h](j)}(h``loff_t start``h]jS)}(hjh]h loff_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hj͞hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjɞhMhjʞubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjɞhMhjrubj)}(h@``loff_t end`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t end``h]jS)}(hjh]h loff_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjrubeh}(h]h ]h"]h$]h&]uh1jhjVubjM)}(h**Description**h]j)}(hj(h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjVubjM)}(hoStart writeback against all of a mapping's dirty pages that lie within the byte offsets inclusive.h]hqStart writeback against all of a mapping’s dirty pages that lie within the byte offsets inclusive.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjVubjM)}(hOThis is a data integrity operation that waits upon dirty or in writeback pages.h]hOThis is a data integrity operation that waits upon dirty or in writeback pages.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjVubjM)}(h **Return**h]j)}(hj^h]hReturn}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjVubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjtubh+ on success, negative error code otherwise.}(hjthhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h filemap_flush_range (C function)c.filemap_flush_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hQint filemap_flush_range (struct address_space *mapping, loff_t start, loff_t end)h]h)}(hPint filemap_flush_range(struct address_space *mapping, loff_t start, loff_t end)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfilemap_flush_rangeh]j)}(hfilemap_flush_rangeh]hfilemap_flush_range}(hjҟhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΟubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h9(struct address_space *mapping, loff_t start, loff_t end)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljԟsbc.filemap_flush_rangeasbuh1hhjubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t starth](h)}(hhh]j)}(hloff_th]hloff_t}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjemodnameN classnameNjpjs)}jv]j(c.filemap_flush_rangeasbuh1hhj\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t endh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j(c.filemap_flush_rangeasbuh1hhjubj)}(h h]h }(hjɠhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hendh]hend}(hjנhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hstart writeback on a rangeh]hstart writeback on a range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX_**Parameters** ``struct address_space *mapping`` target address_space ``loff_t start`` index to start writeback on ``loff_t end`` last (inclusive) index for writeback **Description** This is a non-integrity writeback helper, to start writing back folios for the indicated range. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(h7``struct address_space *mapping`` target address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjBh]hstruct address_space *mapping}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj<ubj)}(hhh]jM)}(htarget address_spaceh]htarget address_space}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjWhMhjXubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhMhj9ubj)}(h-``loff_t start`` index to start writeback on h](j)}(h``loff_t start``h]jS)}(hj{h]h loff_t start}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjyubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjuubj)}(hhh]jM)}(hindex to start writeback onh]hindex to start writeback on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jhjhMhj9ubj)}(h4``loff_t end`` last (inclusive) index for writeback h](j)}(h``loff_t end``h]jS)}(hjh]h loff_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h$last (inclusive) index for writebackh]h$last (inclusive) index for writeback}(hj͡hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjɡhMhjʡubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjɡhMhj9ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h_This is a non-integrity writeback helper, to start writing back folios for the indicated range.h]h_This is a non-integrity writeback helper, to start writing back folios for the indicated range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubh+ on success, negative error code otherwise.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfilemap_flush (C function)c.filemap_flushhNtauh1hhjhhhNhNubh)}(hhh](h)}(h1int filemap_flush (struct address_space *mapping)h]h)}(h0int filemap_flush(struct address_space *mapping)h](j)}(hinth]hint}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhjwhMubh)}(h filemap_flushh]j)}(h filemap_flushh]h filemap_flush}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjehhhjwhMubj )}(h(struct address_space *mapping)h]j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjĢhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjƢmodnameN classnameNjpjs)}jv]jy)}jljsbc.filemap_flushasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjehhhjwhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjahhhjwhMubah}(h]j\ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjwhMhj^hhubj4)}(hhh]jM)}(hmostly a non-blocking flushh]hmostly a non-blocking flush}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj&hhubah}(h]h ]h"]h$]h&]uh1j3hj^hhhjwhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjAjHjAjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` target address_space **Description** This is a mostly non-blocking flush. Not suitable for data-integrity purposes - I/O may not be started against all dirty pages. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjKh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubj)}(hhh]j)}(h7``struct address_space *mapping`` target address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjjh]hstruct address_space *mapping}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjdubj)}(hhh]jM)}(htarget address_spaceh]htarget address_space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjhMhjaubah}(h]h ]h"]h$]h&]uh1jhjEubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubjM)}(hThis is a mostly non-blocking flush. Not suitable for data-integrity purposes - I/O may not be started against all dirty pages.h]hThis is a mostly non-blocking flush. Not suitable for data-integrity purposes - I/O may not be started against all dirty pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubjM)}(h **Return**h]j)}(hj̣h]hReturn}(hjΣhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʣubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh+ on success, negative error code otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#filemap_range_has_page (C function)c.filemap_range_has_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(h_bool filemap_range_has_page (struct address_space *mapping, loff_t start_byte, loff_t end_byte)h]h)}(h^bool filemap_range_has_page(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj,hMubh)}(hfilemap_range_has_pageh]j)}(hfilemap_range_has_pageh]hfilemap_range_has_page}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj,hMubj )}(hC(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj[hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjWubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubh)}(hhh]j)}(h address_spaceh]h address_space}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj{modnameN classnameNjpjs)}jv]jy)}jljAsbc.filemap_range_has_pageasbuh1hhjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjWubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjSubj )}(hloff_t start_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjФhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjͤubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjҤmodnameN classnameNjpjs)}jv]jc.filemap_range_has_pageasbuh1hhjɤubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɤubj)}(h start_byteh]h start_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɤubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjSubj )}(hloff_t end_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_range_has_pageasbuh1hhjubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hend_byteh]hend_byte}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjSubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj,hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj,hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj,hMhjhhubj4)}(hhh]jM)}(h check if a page exists in range.h]h check if a page exists in range.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjkhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj,hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address space within which to check ``loff_t start_byte`` offset in bytes where the range starts ``loff_t end_byte`` offset in bytes where the range ends (inclusive) **Description** Find at least one page in the range supplied, usually used to check if direct writing in this range will trigger a writeback. **Return** ``true`` if at least one page exists in the specified range, ``false`` otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(hF``struct address_space *mapping`` address space within which to check h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h#address space within which to checkh]h#address space within which to check}(hjȥhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjĥhMhjťubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjĥhMhjubj)}(h=``loff_t start_byte`` offset in bytes where the range starts h](j)}(h``loff_t start_byte``h]jS)}(hjh]hloff_t start_byte}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hE``loff_t end_byte`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t end_byte``h]jS)}(hj!h]hloff_t end_byte}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h}Find at least one page in the range supplied, usually used to check if direct writing in this range will trigger a writeback.h]h}Find at least one page in the range supplied, usually used to check if direct writing in this range will trigger a writeback.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hQ``true`` if at least one page exists in the specified range, ``false`` otherwise.h](jS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh5 if at least one page exists in the specified range, }(hjhhhNhNubjS)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$filemap_fdatawait_range (C function)c.filemap_fdatawait_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(h_int filemap_fdatawait_range (struct address_space *mapping, loff_t start_byte, loff_t end_byte)h]h)}(h^int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfilemap_fdatawait_rangeh]j)}(hfilemap_fdatawait_rangeh]hfilemap_fdatawait_range}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hC(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj%hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj!ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubh)}(hhh]j)}(h address_spaceh]h address_space}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jy)}jlj sbc.filemap_fdatawait_rangeasbuh1hhj!ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj!ubj)}(hmappingh]hmapping}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t start_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j_c.filemap_fdatawait_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h start_byteh]h start_byte}(hjƧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t end_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߧubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j_c.filemap_fdatawait_rangeasbuh1hhjۧubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjۧubj)}(hend_byteh]hend_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjۧubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jۦah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjݦhhubj4)}(hhh]jM)}(hwait for writeback to completeh]hwait for writeback to complete}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj5hhubah}(h]h ]h"]h$]h&]uh1j3hjݦhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjPjHjPjIjJjKuh1hhhhjhNhNubj)}(hXq**Parameters** ``struct address_space *mapping`` address space structure to wait for ``loff_t start_byte`` offset in bytes where the range starts ``loff_t end_byte`` offset in bytes where the range ends (inclusive) **Description** Walk the list of under-writeback pages of the given address space in the given range and wait for all of them. Check error status of the address space and return it. Since the error status of the address space is cleared by this function, callers are responsible for checking the return value and handling and/or reporting the error. **Return** error status of the address space.h](jM)}(h**Parameters**h]j)}(hjZh]h Parameters}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjTubj)}(hhh](j)}(hF``struct address_space *mapping`` address space structure to wait for h](j)}(h!``struct address_space *mapping``h]jS)}(hjyh]hstruct address_space *mapping}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjwubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjsubj)}(hhh]jM)}(h#address space structure to wait forh]h#address space structure to wait for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhjhMhjpubj)}(h=``loff_t start_byte`` offset in bytes where the range starts h](j)}(h``loff_t start_byte``h]jS)}(hjh]hloff_t start_byte}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hj˨hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjǨhMhjȨubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjǨhMhjpubj)}(hE``loff_t end_byte`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t end_byte``h]jS)}(hjh]hloff_t end_byte}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjpubeh}(h]h ]h"]h$]h&]uh1jhjTubjM)}(h**Description**h]j)}(hj&h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM!hjTubjM)}(hWalk the list of under-writeback pages of the given address space in the given range and wait for all of them. Check error status of the address space and return it.h]hWalk the list of under-writeback pages of the given address space in the given range and wait for all of them. Check error status of the address space and return it.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjTubjM)}(hSince the error status of the address space is cleared by this function, callers are responsible for checking the return value and handling and/or reporting the error.h]hSince the error status of the address space is cleared by this function, callers are responsible for checking the return value and handling and/or reporting the error.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM$hjTubjM)}(h **Return**h]j)}(hj\h]hReturn}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM(hjTubjM)}(h"error status of the address space.h]h"error status of the address space.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM)hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h0filemap_fdatawait_range_keep_errors (C function)%c.filemap_fdatawait_range_keep_errorshNtauh1hhjhhhNhNubh)}(hhh](h)}(hkint filemap_fdatawait_range_keep_errors (struct address_space *mapping, loff_t start_byte, loff_t end_byte)h]h)}(hjint filemap_fdatawait_range_keep_errors(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM4ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM4ubh)}(h#filemap_fdatawait_range_keep_errorsh]j)}(h#filemap_fdatawait_range_keep_errorsh]h#filemap_fdatawait_range_keep_errors}(hj©hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM4ubj )}(hC(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjީhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjکubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjکubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljĩsb%c.filemap_fdatawait_range_keep_errorsasbuh1hhjکubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjکubjF )}(hjI h]h*}(hj*hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjکubj)}(hmappingh]hmapping}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjکubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj֩ubj )}(hloff_t start_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjUmodnameN classnameNjpjs)}jv]j%c.filemap_fdatawait_range_keep_errorsasbuh1hhjLubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(h start_byteh]h start_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj֩ubj )}(hloff_t end_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j%c.filemap_fdatawait_range_keep_errorsasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hend_byteh]hend_byte}(hjǪhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj֩ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM4ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM4ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM4hjhhubj4)}(hhh]jM)}(hwait for writeback to completeh]hwait for writeback to complete}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM4hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM4ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hXa**Parameters** ``struct address_space *mapping`` address space structure to wait for ``loff_t start_byte`` offset in bytes where the range starts ``loff_t end_byte`` offset in bytes where the range ends (inclusive) **Description** Walk the list of under-writeback pages of the given address space in the given range and wait for all of them. Unlike filemap_fdatawait_range(), this function does not clear error status of the address space. Use this function if callers don't handle errors themselves. Expected call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), fsfreeze(8)h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM8hj ubj)}(hhh](j)}(hF``struct address_space *mapping`` address space structure to wait for h](j)}(h!``struct address_space *mapping``h]jS)}(hj2h]hstruct address_space *mapping}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM5hj,ubj)}(hhh]jM)}(h#address space structure to wait forh]h#address space structure to wait for}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjGhM5hjHubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhM5hj)ubj)}(h=``loff_t start_byte`` offset in bytes where the range starts h](j)}(h``loff_t start_byte``h]jS)}(hjkh]hloff_t start_byte}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM6hjeubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM6hjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjhM6hj)ubj)}(hE``loff_t end_byte`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t end_byte``h]jS)}(hjh]hloff_t end_byte}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM7hjubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM7hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM7hj)ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj߫h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݫubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM9hj ubjM)}(hWalk the list of under-writeback pages of the given address space in the given range and wait for all of them. Unlike filemap_fdatawait_range(), this function does not clear error status of the address space.h]hWalk the list of under-writeback pages of the given address space in the given range and wait for all of them. Unlike filemap_fdatawait_range(), this function does not clear error status of the address space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM8hj ubjM)}(hUse this function if callers don't handle errors themselves. Expected call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), fsfreeze(8)h]hUse this function if callers don’t handle errors themselves. Expected call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), fsfreeze(8)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM<hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!file_fdatawait_range (C function)c.file_fdatawait_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hPint file_fdatawait_range (struct file *file, loff_t start_byte, loff_t end_byte)h]h)}(hOint file_fdatawait_range(struct file *file, loff_t start_byte, loff_t end_byte)h](j)}(hinth]hint}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMJubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhjAhMJubh)}(hfile_fdatawait_rangeh]j)}(hfile_fdatawait_rangeh]hfile_fdatawait_range}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]jjuh1hhj/hhhjAhMJubj )}(h7(struct file *file, loff_t start_byte, loff_t end_byte)h](j )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjphhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjlubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljVsbc.file_fdatawait_rangeasbuh1hhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjlubj)}(hfileh]hfile}(hjɬhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hloff_t start_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.file_fdatawait_rangeasbuh1hhjެubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjެubj)}(h start_byteh]h start_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjެubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hloff_t end_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj/modnameN classnameNjpjs)}jv]jc.file_fdatawait_rangeasbuh1hhj&ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hend_byteh]hend_byte}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubeh}(h]h ]h"]h$]h&]jjuh1j hj/hhhjAhMJubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj+hhhjAhMJubah}(h]j&ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjAhMJhj(hhubj4)}(hhh]jM)}(hwait for writeback to completeh]hwait for writeback to complete}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMJhjhhubah}(h]h ]h"]h$]h&]uh1j3hj(hhhjAhMJubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct file *file`` file pointing to address space structure to wait for ``loff_t start_byte`` offset in bytes where the range starts ``loff_t end_byte`` offset in bytes where the range ends (inclusive) **Description** Walk the list of under-writeback pages of the address space that file refers to, in the given range and wait for all of them. Check error status of the address space vs. the file->f_wb_err cursor and return it. Since the error status of the file is advanced by this function, callers are responsible for checking the return value and handling and/or reporting the error. **Return** error status of the address space vs. the file->f_wb_err cursor.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMNhjubj)}(hhh](j)}(hK``struct file *file`` file pointing to address space structure to wait for h](j)}(h``struct file *file``h]jS)}(hjĭh]hstruct file *file}(hjƭhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj­ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMKhjubj)}(hhh]jM)}(h4file pointing to address space structure to wait forh]h4file pointing to address space structure to wait for}(hjݭhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj٭hMKhjڭubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj٭hMKhjubj)}(h=``loff_t start_byte`` offset in bytes where the range starts h](j)}(h``loff_t start_byte``h]jS)}(hjh]hloff_t start_byte}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMLhjubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMLhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMLhjubj)}(hE``loff_t end_byte`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t end_byte``h]jS)}(hj6h]hloff_t end_byte}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMMhj0ubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjKhMMhjLubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhjKhMMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjqh]h Description}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMOhjubjM)}(hWalk the list of under-writeback pages of the address space that file refers to, in the given range and wait for all of them. Check error status of the address space vs. the file->f_wb_err cursor and return it.h]hWalk the list of under-writeback pages of the address space that file refers to, in the given range and wait for all of them. Check error status of the address space vs. the file->f_wb_err cursor and return it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMNhjubjM)}(hSince the error status of the file is advanced by this function, callers are responsible for checking the return value and handling and/or reporting the error.h]hSince the error status of the file is advanced by this function, callers are responsible for checking the return value and handling and/or reporting the error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMRhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMVhjubjM)}(h@error status of the address space vs. the file->f_wb_err cursor.h]h@error status of the address space vs. the file->f_wb_err cursor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMWhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*filemap_fdatawait_keep_errors (C function)c.filemap_fdatawait_keep_errorshNtauh1hhjhhhNhNubh)}(hhh](h)}(hAint filemap_fdatawait_keep_errors (struct address_space *mapping)h]h)}(h@int filemap_fdatawait_keep_errors(struct address_space *mapping)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMcubh)}(hfilemap_fdatawait_keep_errorsh]j)}(hfilemap_fdatawait_keep_errorsh]hfilemap_fdatawait_keep_errors}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMcubj )}(h(struct address_space *mapping)h]j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj)hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj%ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hhh]j)}(h address_spaceh]h address_space}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjImodnameN classnameNjpjs)}jv]jy)}jljsbc.filemap_fdatawait_keep_errorsasbuh1hhj%ubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjF )}(hjI h]h*}(hjuhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj%ubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj!ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMcubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMcubah}(h]j߮ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMchjhhubj4)}(hhh]jM)}(h*wait for writeback without clearing errorsh]h*wait for writeback without clearing errors}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMchjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMcubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjįjHjįjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address space structure to wait for **Description** Walk the list of under-writeback pages of the given address space and wait for all of them. Unlike filemap_fdatawait(), this function does not clear error status of the address space. Use this function if callers don't handle errors themselves. Expected call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), fsfreeze(8) **Return** error status of the address space.h](jM)}(h**Parameters**h]j)}(hjίh]h Parameters}(hjЯhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̯ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMghjȯubj)}(hhh]j)}(hF``struct address_space *mapping`` address space structure to wait for h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMdhjubj)}(hhh]jM)}(h#address space structure to wait forh]h#address space structure to wait for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjȯubjM)}(h**Description**h]j)}(hj(h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMfhjȯubjM)}(hWalk the list of under-writeback pages of the given address space and wait for all of them. Unlike filemap_fdatawait(), this function does not clear error status of the address space.h]hWalk the list of under-writeback pages of the given address space and wait for all of them. Unlike filemap_fdatawait(), this function does not clear error status of the address space.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMehjȯubjM)}(hUse this function if callers don't handle errors themselves. Expected call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), fsfreeze(8)h]hUse this function if callers don’t handle errors themselves. Expected call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), fsfreeze(8)}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMihjȯubjM)}(h **Return**h]j)}(hj^h]hReturn}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMmhjȯubjM)}(h"error status of the address space.h]h"error status of the address space.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMnhjȯubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)filemap_write_and_wait_range (C function)c.filemap_write_and_wait_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(h\int filemap_write_and_wait_range (struct address_space *mapping, loff_t lstart, loff_t lend)h]h)}(h[int filemap_write_and_wait_range(struct address_space *mapping, loff_t lstart, loff_t lend)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfilemap_write_and_wait_rangeh]j)}(hfilemap_write_and_wait_rangeh]hfilemap_write_and_wait_range}(hjİhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h;(struct address_space *mapping, loff_t lstart, loff_t lend)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjܰubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܰubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljưsbc.filemap_write_and_wait_rangeasbuh1hhjܰubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܰubjF )}(hjI h]h*}(hj,hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjܰubj)}(hmappingh]hmapping}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܰubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjذubj )}(h loff_t lstarth](h)}(hhh]j)}(hloff_th]hloff_t}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjWmodnameN classnameNjpjs)}jv]jc.filemap_write_and_wait_rangeasbuh1hhjNubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hlstarth]hlstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjذubj )}(h loff_t lendh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_write_and_wait_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlendh]hlend}(hjɱhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjذubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h write out & wait on a file rangeh]h write out & wait on a file range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` the address_space for the pages ``loff_t lstart`` offset in bytes where the range starts ``loff_t lend`` offset in bytes where the range ends (inclusive) **Description** Write out and wait upon file offsets lstart->lend, inclusive. Note that **lend** is inclusive (describes the last byte to be written) so that this function can be used to write to the very end-of-file (end = -1). **Return** error status of the address space.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(hB``struct address_space *mapping`` the address_space for the pages h](j)}(h!``struct address_space *mapping``h]jS)}(hj4h]hstruct address_space *mapping}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj.ubj)}(hhh]jM)}(hthe address_space for the pagesh]hthe address_space for the pages}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhMhjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhj+ubj)}(h9``loff_t lstart`` offset in bytes where the range starts h](j)}(h``loff_t lstart``h]jS)}(hjmh]h loff_t lstart}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjgubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjhMhj+ubj)}(hA``loff_t lend`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t lend``h]jS)}(hjh]h loff_t lend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj+ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj߲ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h=Write out and wait upon file offsets lstart->lend, inclusive.h]h=Write out and wait upon file offsets lstart->lend, inclusive.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hNote that **lend** is inclusive (describes the last byte to be written) so that this function can be used to write to the very end-of-file (end = -1).h](h Note that }(hjhhhNhNubj)}(h**lend**h]hlend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is inclusive (describes the last byte to be written) so that this function can be used to write to the very end-of-file (end = -1).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hj)h]hReturn}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h"error status of the address space.h]h"error status of the address space.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*file_check_and_advance_wb_err (C function)c.file_check_and_advance_wb_errhNtauh1hhjhhhNhNubh)}(hhh](h)}(h5int file_check_and_advance_wb_err (struct file *file)h]h)}(h4int file_check_and_advance_wb_err(struct file *file)h](j)}(hinth]hint}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjhhhj|hMubh)}(hfile_check_and_advance_wb_errh]j)}(hfile_check_and_advance_wb_errh]hfile_check_and_advance_wb_err}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjjhhhj|hMubj )}(h(struct file *file)h]j )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hjɳhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƳubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj˳modnameN classnameNjpjs)}jv]jy)}jljsbc.file_check_and_advance_wb_errasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjjhhhj|hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjfhhhj|hMubah}(h]jaah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj|hMhjchhubj4)}(hhh]jM)}(hNreport wb error (if any) that was previously and advance wb_err to current oneh]hNreport wb error (if any) that was previously and advance wb_err to current one}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj+hhubah}(h]h ]h"]h$]h&]uh1j3hjchhhj|hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjFjHjFjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct file *file`` struct file on which the error is being reported **Description** When userland calls fsync (or something like nfsd does the equivalent), we want to report any writeback errors that occurred since the last fsync (or since the file was opened if there haven't been any). Grab the wb_err from the mapping. If it matches what we have in the file, then just quickly return 0. The file is all caught up. If it doesn't match, then take the mapping value, set the "seen" flag in it and try to swap it into place. If it works, or another task beat us to it with the new value, then update the f_wb_err and return the error portion. The error at this point must be reported via proper channels (a'la fsync, or NFS COMMIT operation, etc.). While we handle mapping->wb_err with atomic operations, the f_wb_err value is protected by the f_lock since we must ensure that it reflects the latest value swapped in for this file descriptor. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubj)}(hhh]j)}(hG``struct file *file`` struct file on which the error is being reported h](j)}(h``struct file *file``h]jS)}(hjoh]hstruct file *file}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjmubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjiubj)}(hhh]jM)}(h0struct file on which the error is being reportedh]h0struct file on which the error is being reported}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubah}(h]h ]h"]h$]h&]uh1jhjJubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubjM)}(hWhen userland calls fsync (or something like nfsd does the equivalent), we want to report any writeback errors that occurred since the last fsync (or since the file was opened if there haven't been any).h]hWhen userland calls fsync (or something like nfsd does the equivalent), we want to report any writeback errors that occurred since the last fsync (or since the file was opened if there haven’t been any).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubjM)}(hGrab the wb_err from the mapping. If it matches what we have in the file, then just quickly return 0. The file is all caught up.h]hGrab the wb_err from the mapping. If it matches what we have in the file, then just quickly return 0. The file is all caught up.}(hjϴhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubjM)}(hXJIf it doesn't match, then take the mapping value, set the "seen" flag in it and try to swap it into place. If it works, or another task beat us to it with the new value, then update the f_wb_err and return the error portion. The error at this point must be reported via proper channels (a'la fsync, or NFS COMMIT operation, etc.).h]hXRIf it doesn’t match, then take the mapping value, set the “seen” flag in it and try to swap it into place. If it works, or another task beat us to it with the new value, then update the f_wb_err and return the error portion. The error at this point must be reported via proper channels (a’la fsync, or NFS COMMIT operation, etc.).}(hj޴hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubjM)}(hWhile we handle mapping->wb_err with atomic operations, the f_wb_err value is protected by the f_lock since we must ensure that it reflects the latest value swapped in for this file descriptor.h]hWhile we handle mapping->wb_err with atomic operations, the f_wb_err value is protected by the f_lock since we must ensure that it reflects the latest value swapped in for this file descriptor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh+ on success, negative error code otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&file_write_and_wait_range (C function)c.file_write_and_wait_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hMint file_write_and_wait_range (struct file *file, loff_t lstart, loff_t lend)h]h)}(hLint file_write_and_wait_range(struct file *file, loff_t lstart, loff_t lend)h](j)}(hinth]hint}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhj_hMubh)}(hfile_write_and_wait_rangeh]j)}(hfile_write_and_wait_rangeh]hfile_write_and_wait_range}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1hhjMhhhj_hMubj )}(h/(struct file *file, loff_t lstart, loff_t lend)h](j )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljtsbc.file_write_and_wait_rangeasbuh1hhjubj)}(h h]h }(hj̵hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjڵhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t lstarth](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jȵc.file_write_and_wait_rangeasbuh1hhjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlstarth]hlstart}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t lendh](h)}(hhh]j)}(hloff_th]hloff_t}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjMmodnameN classnameNjpjs)}jv]jȵc.file_write_and_wait_rangeasbuh1hhjDubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(hlendh]hlend}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjMhhhj_hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjIhhhj_hMubah}(h]jDah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj_hMhjFhhubj4)}(hhh]jM)}(h write out & wait on a file rangeh]h write out & wait on a file range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjFhhhj_hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct file *file`` file pointing to address_space with pages ``loff_t lstart`` offset in bytes where the range starts ``loff_t lend`` offset in bytes where the range ends (inclusive) **Description** Write out and wait upon file offsets lstart->lend, inclusive. Note that **lend** is inclusive (describes the last byte to be written) so that this function can be used to write to the very end-of-file (end = -1). After writing out and waiting on the data, we check and advance the f_wb_err cursor to the latest value, and return any errors detected there. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjöh]h Parameters}(hjŶhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(h@``struct file *file`` file pointing to address_space with pages h](j)}(h``struct file *file``h]jS)}(hjh]hstruct file *file}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjܶubj)}(hhh]jM)}(h)file pointing to address_space with pagesh]h)file pointing to address_space with pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjܶubeh}(h]h ]h"]h$]h&]uh1jhjhMhjٶubj)}(h9``loff_t lstart`` offset in bytes where the range starts h](j)}(h``loff_t lstart``h]jS)}(hjh]h loff_t lstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj0hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMhjٶubj)}(hA``loff_t lend`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t lend``h]jS)}(hjTh]h loff_t lend}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjRubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjNubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjihMhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihMhjٶubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h=Write out and wait upon file offsets lstart->lend, inclusive.h]h=Write out and wait upon file offsets lstart->lend, inclusive.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hNote that **lend** is inclusive (describes the last byte to be written) so that this function can be used to write to the very end-of-file (end = -1).h](h Note that }(hjhhhNhNubj)}(h**lend**h]hlend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is inclusive (describes the last byte to be written) so that this function can be used to write to the very end-of-file (end = -1).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hAfter writing out and waiting on the data, we check and advance the f_wb_err cursor to the latest value, and return any errors detected there.h]hAfter writing out and waiting on the data, we check and advance the f_wb_err cursor to the latest value, and return any errors detected there.}(hjշhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh+ on success, negative error code otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%replace_page_cache_folio (C function)c.replace_page_cache_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hDvoid replace_page_cache_folio (struct folio *old, struct folio *new)h]h)}(hCvoid replace_page_cache_folio(struct folio *old, struct folio *new)h](j)}(hvoidh]hvoid}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5hhhjGhMubh)}(hreplace_page_cache_folioh]j)}(hreplace_page_cache_folioh]hreplace_page_cache_folio}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1hhj5hhhjGhMubj )}(h&(struct folio *old, struct folio *new)h](j )}(hstruct folio *oldh](j5)}(hj8h]hstruct}(hjvhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj\sbc.replace_page_cache_folioasbuh1hhjrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubjF )}(hjI h]h*}(hj¸hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjrubj)}(holdh]hold}(hjϸhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(hstruct folio *newh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.replace_page_cache_folioasbuh1hhjubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj2hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hnewh]hnew}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubeh}(h]h ]h"]h$]h&]jjuh1j hj5hhhjGhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj1hhhjGhMubah}(h]j,ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjGhMhj.hhubj4)}(hhh]jM)}(h(replace a pagecache folio with a new oneh]h(replace a pagecache folio with a new one}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjfhhubah}(h]h ]h"]h$]h&]uh1j3hj.hhhjGhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *old`` folio to be replaced ``struct folio *new`` folio to replace with **Description** This function replaces a folio in the pagecache with a new one. On success it acquires the pagecache reference for the new folio and drops it for the old folio. Both the old and new folios must be locked. This function does not add the new folio to the LRU, the caller must do that. The remove + add is atomic. This function cannot fail.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM#hjubj)}(hhh](j)}(h+``struct folio *old`` folio to be replaced h](j)}(h``struct folio *old``h]jS)}(hjh]hstruct folio *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hfolio to be replacedh]hfolio to be replaced}(hjùhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h,``struct folio *new`` folio to replace with h](j)}(h``struct folio *new``h]jS)}(hjh]hstruct folio *new}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM!hjݹubj)}(hhh]jM)}(hfolio to replace withh]hfolio to replace with}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjݹubeh}(h]h ]h"]h$]h&]uh1jhjhM!hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM#hjubjM)}(hXThis function replaces a folio in the pagecache with a new one. On success it acquires the pagecache reference for the new folio and drops it for the old folio. Both the old and new folios must be locked. This function does not add the new folio to the LRU, the caller must do that.h]hXThis function replaces a folio in the pagecache with a new one. On success it acquires the pagecache reference for the new folio and drops it for the old folio. Both the old and new folios must be locked. This function does not add the new folio to the LRU, the caller must do that.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM"hjubjM)}(h7The remove + add is atomic. This function cannot fail.h]h7The remove + add is atomic. This function cannot fail.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM(hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_unlock (C function)c.folio_unlockhNtauh1hhjhhhNhNubh)}(hhh](h)}(h'void folio_unlock (struct folio *folio)h]h)}(h&void folio_unlock(struct folio *folio)h](j)}(hvoidh]hvoid}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnhhhjhMubh)}(h folio_unlockh]j)}(h folio_unlockh]h folio_unlock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjnhhhjhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjͺhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʺubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjϺmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_unlockasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjnhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjjhhhjhMubah}(h]jeah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjghhubj4)}(hhh]jM)}(hUnlock a locked folio.h]hUnlock a locked folio.}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj/hhubah}(h]h ]h"]h$]h&]uh1j3hjghhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjJjHjJjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio. **Description** Unlocks the folio and wakes up any thread sleeping on the page lock. **Context** May be called from interrupt or process context. May not be called from NMI context.h](jM)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjNubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjsh]hstruct folio *folio}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjqubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjmubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhMhjjubah}(h]h ]h"]h$]h&]uh1jhjNubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjNubjM)}(hDUnlocks the folio and wakes up any thread sleeping on the page lock.h]hDUnlocks the folio and wakes up any thread sleeping on the page lock.}(hjĻhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjNubjM)}(h **Context**h]j)}(hjջh]hContext}(hj׻hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӻubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjNubjM)}(hUMay be called from interrupt or process context. May not be called from NMI context.h]hUMay be called from interrupt or process context. May not be called from NMI context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_end_read (C function)c.folio_end_readhNtauh1hhjhhhNhNubh)}(hhh](h)}(h7void folio_end_read (struct folio *folio, bool success)h]h)}(h6void folio_end_read(struct folio *folio, bool success)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMubh)}(hfolio_end_readh]j)}(hfolio_end_readh]hfolio_end_read}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj(hMubj )}(h#(struct folio *folio, bool success)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjWhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(hfolioh]hfolio}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jy)}jlj=sbc.folio_end_readasbuh1hhjSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(h bool successh](j)}(hj-h]hbool}(hjɼhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjżubj)}(h h]h }(hjּhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjżubj)}(hsuccessh]hsuccess}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjżubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj(hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj(hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj(hMhjhhubj4)}(hhh]jM)}(hEnd read on a folio.h]hEnd read on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj(hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj&jHj&jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio. ``bool success`` True if all reads completed successfully. **Description** When all reads against a folio have completed, filesystems should call this function to let the pagecache know that no more reads are outstanding. This will unlock the folio and wake up any thread sleeping on the lock. The folio will also be marked uptodate if all reads succeeded. **Context** May be called from interrupt or process context. May not be called from NMI context.h](jM)}(h**Parameters**h]j)}(hj0h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj*ubj)}(hhh](j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjOh]hstruct folio *folio}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjMubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjIubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdhMhjeubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjdhMhjFubj)}(h;``bool success`` True if all reads completed successfully. h](j)}(h``bool success``h]jS)}(hjh]h bool success}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h)True if all reads completed successfully.h]h)True if all reads completed successfully.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjFubeh}(h]h ]h"]h$]h&]uh1jhj*ubjM)}(h**Description**h]j)}(hjýh]h Description}(hjŽhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj*ubjM)}(hXWhen all reads against a folio have completed, filesystems should call this function to let the pagecache know that no more reads are outstanding. This will unlock the folio and wake up any thread sleeping on the lock. The folio will also be marked uptodate if all reads succeeded.h]hXWhen all reads against a folio have completed, filesystems should call this function to let the pagecache know that no more reads are outstanding. This will unlock the folio and wake up any thread sleeping on the lock. The folio will also be marked uptodate if all reads succeeded.}(hjٽhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj*ubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj*ubjM)}(hUMay be called from interrupt or process context. May not be called from NMI context.h]hUMay be called from interrupt or process context. May not be called from NMI context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h folio_end_private_2 (C function)c.folio_end_private_2hNtauh1hhjhhhNhNubh)}(hhh](h)}(h.void folio_end_private_2 (struct folio *folio)h]h)}(h-void folio_end_private_2(struct folio *folio)h](j)}(hvoidh]hvoid}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+hhhj=hMubh)}(hfolio_end_private_2h]j)}(hfolio_end_private_2h]hfolio_end_private_2}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1hhj+hhhj=hMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjlhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljRsbc.folio_end_private_2asbuh1hhjhubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhubj)}(hfolioh]hfolio}(hjžhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdubah}(h]h ]h"]h$]h&]jjuh1j hj+hhhj=hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj'hhhj=hMubah}(h]j"ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj=hMhj$hhubj4)}(hhh]jM)}(h(Clear PG_private_2 and wake any waiters.h]h(Clear PG_private_2 and wake any waiters.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj$hhhj=hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXx**Parameters** ``struct folio *folio`` The folio. **Description** Clear the PG_private_2 bit on a folio and wake up any sleepers waiting for it. The folio reference held for PG_private_2 being set is released. This is, for example, used when a netfs folio is being written to a local disk cache, thereby allowing writes to the cache for the same folio to be serialised.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hj0h]hstruct folio *folio}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj*ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjEhMhjFubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhMhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjkh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubjM)}(hClear the PG_private_2 bit on a folio and wake up any sleepers waiting for it. The folio reference held for PG_private_2 being set is released.h]hClear the PG_private_2 bit on a folio and wake up any sleepers waiting for it. The folio reference held for PG_private_2 being set is released.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubjM)}(hThis is, for example, used when a netfs folio is being written to a local disk cache, thereby allowing writes to the cache for the same folio to be serialised.h]hThis is, for example, used when a netfs folio is being written to a local disk cache, thereby allowing writes to the cache for the same folio to be serialised.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!folio_wait_private_2 (C function)c.folio_wait_private_2hNtauh1hhjhhhNhNubh)}(hhh](h)}(h/void folio_wait_private_2 (struct folio *folio)h]h)}(h.void folio_wait_private_2(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM$ubj)}(h h]h }(hjοhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjͿhM$ubh)}(hfolio_wait_private_2h]j)}(hfolio_wait_private_2h]hfolio_wait_private_2}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܿubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjͿhM$ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_wait_private_2asbuh1hhjubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjHhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjͿhM$ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjͿhM$ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjͿhM$hjhhubj4)}(hhh]jM)}(h/Wait for PG_private_2 to be cleared on a folio.h]h/Wait for PG_private_2 to be cleared on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM$hj|hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjͿhM$ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio to wait on. **Description** Wait for PG_private_2 to be cleared on a folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM(hjubj)}(hhh]j)}(h.``struct folio *folio`` The folio to wait on. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM%hjubj)}(hhh]jM)}(hThe folio to wait on.h]hThe folio to wait on.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM'hjubjM)}(h/Wait for PG_private_2 to be cleared on a folio.h]h/Wait for PG_private_2 to be cleared on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM&hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*folio_wait_private_2_killable (C function)c.folio_wait_private_2_killablehNtauh1hhjhhhNhNubh)}(hhh](h)}(h7int folio_wait_private_2_killable (struct folio *folio)h]h)}(h6int folio_wait_private_2_killable(struct folio *folio)h](j)}(hinth]hint}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM1ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhjNhM1ubh)}(hfolio_wait_private_2_killableh]j)}(hfolio_wait_private_2_killableh]hfolio_wait_private_2_killable}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj<hhhjNhM1ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj}hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjyubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljcsbc.folio_wait_private_2_killableasbuh1hhjyubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjyubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjuubah}(h]h ]h"]h$]h&]jjuh1j hj<hhhjNhM1ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj8hhhjNhM1ubah}(h]j3ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjNhM1hj5hhubj4)}(hhh]jM)}(h/Wait for PG_private_2 to be cleared on a folio.h]h/Wait for PG_private_2 to be cleared on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM1hjhhubah}(h]h ]h"]h$]h&]uh1j3hj5hhhjNhM1ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to wait on. **Description** Wait for PG_private_2 to be cleared on a folio or until a fatal signal is received by the calling task. **Return** - 0 if successful. - -EINTR if a fatal signal was encountered.h](jM)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM5hjubj)}(hhh]j)}(h.``struct folio *folio`` The folio to wait on. h](j)}(h``struct folio *folio``h]jS)}(hjAh]hstruct folio *folio}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM2hj;ubj)}(hhh]jM)}(hThe folio to wait on.h]hThe folio to wait on.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVhM2hjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhM2hj8ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj|h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM4hjubjM)}(hgWait for PG_private_2 to be cleared on a folio or until a fatal signal is received by the calling task.h]hgWait for PG_private_2 to be cleared on a folio or until a fatal signal is received by the calling task.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM3hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM6hjubjaW)}(hhh](j/)}(h0 if successful.h]jM)}(hjh]h0 if successful.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM7hjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h)-EINTR if a fatal signal was encountered.h]jM)}(hjh]h)-EINTR if a fatal signal was encountered.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM8hjubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjWuh1j`WhjhM7hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h.folio_end_writeback_no_dropbehind (C function)#c.folio_end_writeback_no_dropbehindhNtauh1hhjhhhNhNubh)}(hhh](h)}(hubj)}(hhh]j)}(h)``struct folio *folio`` The folio to lockh](j)}(h``struct folio *folio``h]jS)}(hjch]hstruct folio *folio}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjaubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj]ubj)}(hhh]jM)}(hThe folio to lockh]hThe folio to lock}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjyubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhMhjZubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!page_cache_next_miss (C function)c.page_cache_next_misshNtauh1hhjhhhNhNubh)}(hhh](h)}(hcpgoff_t page_cache_next_miss (struct address_space *mapping, pgoff_t index, unsigned long max_scan)h]h)}(hbpgoff_t page_cache_next_miss(struct address_space *mapping, pgoff_t index, unsigned long max_scan)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlpage_cache_next_misssbc.page_cache_next_missasbuh1hhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hpage_cache_next_missh]j)}(hjh]hpage_cache_next_miss}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hF(struct address_space *mapping, pgoff_t index, unsigned long max_scan)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj/modnameN classnameNjpjs)}jv]jc.page_cache_next_missasbuh1hhj ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjYhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hmappingh]hmapping}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.page_cache_next_missasbuh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long max_scanh](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)}(hmax_scanh]hmax_scan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h$Find the next gap in the page cache.h]h$Find the next gap in the page cache.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj&hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjAjHjAjIjJjKuh1hhhhjhNhNubj)}(hX **Parameters** ``struct address_space *mapping`` Mapping. ``pgoff_t index`` Index. ``unsigned long max_scan`` Maximum range to search. **Description** Search the range [index, min(index + max_scan - 1, ULONG_MAX)] for the gap with the lowest index. This function may be called under the rcu_read_lock. However, this will not atomically search a snapshot of the cache at a single point in time. For example, if a gap is created at index 5, then subsequently a gap is created at index 10, page_cache_next_miss covering both indices may return 10 if called under the rcu_read_lock. **Return** The index of the gap if found, otherwise an index outside the range specified (in which case 'return - index >= max_scan' will be true). In the rare case of index wrap-around, 0 will be returned.h](jM)}(h**Parameters**h]j)}(hjKh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubj)}(hhh](j)}(h+``struct address_space *mapping`` Mapping. h](j)}(h!``struct address_space *mapping``h]jS)}(hjjh]hstruct address_space *mapping}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjdubj)}(hhh]jM)}(hMapping.h]hMapping.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjhMhjaubj)}(h``pgoff_t index`` Index. h](j)}(h``pgoff_t index``h]jS)}(hjh]h pgoff_t index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hIndex.h]hIndex.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjaubj)}(h4``unsigned long max_scan`` Maximum range to search. h](j)}(h``unsigned long max_scan``h]jS)}(hjh]hunsigned long max_scan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hMaximum range to search.h]hMaximum range to search.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjaubeh}(h]h ]h"]h$]h&]uh1jhjEubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubjM)}(haSearch the range [index, min(index + max_scan - 1, ULONG_MAX)] for the gap with the lowest index.h]haSearch the range [index, min(index + max_scan - 1, ULONG_MAX)] for the gap with the lowest index.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubjM)}(hXJThis function may be called under the rcu_read_lock. However, this will not atomically search a snapshot of the cache at a single point in time. For example, if a gap is created at index 5, then subsequently a gap is created at index 10, page_cache_next_miss covering both indices may return 10 if called under the rcu_read_lock.h]hXJThis function may be called under the rcu_read_lock. However, this will not atomically search a snapshot of the cache at a single point in time. For example, if a gap is created at index 5, then subsequently a gap is created at index 10, page_cache_next_miss covering both indices may return 10 if called under the rcu_read_lock.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjEubjM)}(h **Return**h]j)}(hjMh]hReturn}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubjM)}(hThe index of the gap if found, otherwise an index outside the range specified (in which case 'return - index >= max_scan' will be true). In the rare case of index wrap-around, 0 will be returned.h]hThe index of the gap if found, otherwise an index outside the range specified (in which case ‘return - index >= max_scan’ will be true). In the rare case of index wrap-around, 0 will be returned.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!page_cache_prev_miss (C function)c.page_cache_prev_misshNtauh1hhjhhhNhNubh)}(hhh](h)}(hcpgoff_t page_cache_prev_miss (struct address_space *mapping, pgoff_t index, unsigned long max_scan)h]h)}(hbpgoff_t page_cache_prev_miss(struct address_space *mapping, pgoff_t index, unsigned long max_scan)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlpage_cache_prev_misssbc.page_cache_prev_missasbuh1hhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM'ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM'ubh)}(hpage_cache_prev_missh]j)}(hjh]hpage_cache_prev_miss}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM'ubj )}(hF(struct address_space *mapping, pgoff_t index, unsigned long max_scan)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.page_cache_prev_missasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj.hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjYmodnameN classnameNjpjs)}jv]jc.page_cache_prev_missasbuh1hhjPubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long max_scanh](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)}(hmax_scanh]hmax_scan}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM'ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM'ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM'hjhhubj4)}(hhh]jM)}(h(Find the previous gap in the page cache.h]h(Find the previous gap in the page cache.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM'hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM'ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` Mapping. ``pgoff_t index`` Index. ``unsigned long max_scan`` Maximum range to search. **Description** Search the range [max(index - max_scan + 1, 0), index] for the gap with the highest index. This function may be called under the rcu_read_lock. However, this will not atomically search a snapshot of the cache at a single point in time. For example, if a gap is created at index 10, then subsequently a gap is created at index 5, page_cache_prev_miss() covering both indices may return 5 if called under the rcu_read_lock. **Return** The index of the gap if found, otherwise an index outside the range specified (in which case 'index - return >= max_scan' will be true). In the rare case of wrap-around, ULONG_MAX will be returned.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM+hjubj)}(hhh](j)}(h+``struct address_space *mapping`` Mapping. h](j)}(h!``struct address_space *mapping``h]jS)}(hj?h]hstruct address_space *mapping}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj=ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM(hj9ubj)}(hhh]jM)}(hMapping.h]hMapping.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjThM(hjUubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhjThM(hj6ubj)}(h``pgoff_t index`` Index. h](j)}(h``pgoff_t index``h]jS)}(hjxh]h pgoff_t index}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM)hjrubj)}(hhh]jM)}(hIndex.h]hIndex.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM)hjubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhjhM)hj6ubj)}(h4``unsigned long max_scan`` Maximum range to search. h](j)}(h``unsigned long max_scan``h]jS)}(hjh]hunsigned long max_scan}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM*hjubj)}(hhh]jM)}(hMaximum range to search.h]hMaximum range to search.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM*hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM*hj6ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM,hjubjM)}(hZSearch the range [max(index - max_scan + 1, 0), index] for the gap with the highest index.h]hZSearch the range [max(index - max_scan + 1, 0), index] for the gap with the highest index.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM+hjubjM)}(hXKThis function may be called under the rcu_read_lock. However, this will not atomically search a snapshot of the cache at a single point in time. For example, if a gap is created at index 10, then subsequently a gap is created at index 5, page_cache_prev_miss() covering both indices may return 5 if called under the rcu_read_lock.h]hXKThis function may be called under the rcu_read_lock. However, this will not atomically search a snapshot of the cache at a single point in time. For example, if a gap is created at index 10, then subsequently a gap is created at index 5, page_cache_prev_miss() covering both indices may return 5 if called under the rcu_read_lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM.hjubjM)}(h **Return**h]j)}(hj"h]hReturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM4hjubjM)}(hThe index of the gap if found, otherwise an index outside the range specified (in which case 'index - return >= max_scan' will be true). In the rare case of wrap-around, ULONG_MAX will be returned.h]hThe index of the gap if found, otherwise an index outside the range specified (in which case ‘index - return >= max_scan’ will be true). In the rare case of wrap-around, ULONG_MAX will be returned.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM5hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%__filemap_get_folio_mpol (C function)c.__filemap_get_folio_mpolhNtauh1hhjhhhNhNubh)}(hhh](h)}(hstruct folio * __filemap_get_folio_mpol (struct address_space *mapping, pgoff_t index, fgf_t fgp_flags, gfp_t gfp, struct mempolicy *policy)h]h)}(hstruct folio *__filemap_get_folio_mpol(struct address_space *mapping, pgoff_t index, fgf_t fgp_flags, gfp_t gfp, struct mempolicy *policy)h](j5)}(hj8h]hstruct}(hjghhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjchhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjthMubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl__filemap_get_folio_mpolsbc.__filemap_get_folio_mpolasbuh1hhjchhhjthMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjthMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjchhhjthMubh)}(h__filemap_get_folio_mpolh]j)}(hjh]h__filemap_get_folio_mpol}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjchhhjthMubj )}(hd(struct address_space *mapping, pgoff_t index, fgf_t fgp_flags, gfp_t gfp, struct mempolicy *policy)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__filemap_get_folio_mpolasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjVmodnameN classnameNjpjs)}jv]jc.__filemap_get_folio_mpolasbuh1hhjMubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubj)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hfgf_t fgp_flagsh](h)}(hhh]j)}(hfgf_th]hfgf_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__filemap_get_folio_mpolasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h fgp_flagsh]h fgp_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__filemap_get_folio_mpolasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mempolicy *policyh](j5)}(hj8h]hstruct}(hj)hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj%ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hhh]j)}(h mempolicyh]h mempolicy}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjImodnameN classnameNjpjs)}jv]jc.__filemap_get_folio_mpolasbuh1hhj%ubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjF )}(hjI h]h*}(hjshhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj%ubj)}(hpolicyh]hpolicy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjchhhjthMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj_hhhjthMubah}(h]jZah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjthMhj\hhubj4)}(hhh]jM)}(h$Find and get a reference to a folio.h]h$Find and get a reference to a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj\hhhjthMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` The address_space to search. ``pgoff_t index`` The page index. ``fgf_t fgp_flags`` ``FGP`` flags modify how the folio is returned. ``gfp_t gfp`` Memory allocation flags to use if ``FGP_CREAT`` is specified. ``struct mempolicy *policy`` NUMA memory allocation policy to follow. **Description** Looks up the page cache entry at **mapping** & **index**. If ``FGP_LOCK`` or ``FGP_CREAT`` are specified then the function may sleep even if the ``GFP`` flags specified for ``FGP_CREAT`` are atomic. If this function returns a folio, it is returned with an increased refcount. **Return** The found folio or an ERR_PTR() otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(h?``struct address_space *mapping`` The address_space to search. h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hThe address_space to search.h]hThe address_space to search.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h"``pgoff_t index`` The page index. h](j)}(h``pgoff_t index``h]jS)}(hj$h]h pgoff_t index}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj"ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hThe page index.h]hThe page index.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj9hMhj:ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj9hMhjubj)}(hD``fgf_t fgp_flags`` ``FGP`` flags modify how the folio is returned. h](j)}(h``fgf_t fgp_flags``h]jS)}(hj]h]hfgf_t fgp_flags}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjWubj)}(hhh]jM)}(h/``FGP`` flags modify how the folio is returned.h](jS)}(h``FGP``h]hFGP}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubh( flags modify how the folio is returned.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjrhMhjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjrhMhjubj)}(hL``gfp_t gfp`` Memory allocation flags to use if ``FGP_CREAT`` is specified. h](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h=Memory allocation flags to use if ``FGP_CREAT`` is specified.h](h"Memory allocation flags to use if }(hjhhhNhNubjS)}(h ``FGP_CREAT``h]h FGP_CREAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh is specified.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hF``struct mempolicy *policy`` NUMA memory allocation policy to follow. h](j)}(h``struct mempolicy *policy``h]jS)}(hjh]hstruct mempolicy *policy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h(NUMA memory allocation policy to follow.h]h(NUMA memory allocation policy to follow.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj*h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h9Looks up the page cache entry at **mapping** & **index**.h](h!Looks up the page cache entry at }(hj@hhhNhNubj)}(h **mapping**h]hmapping}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh & }(hj@hhhNhNubj)}(h **index**h]hindex}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubh.}(hj@hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hIf ``FGP_LOCK`` or ``FGP_CREAT`` are specified then the function may sleep even if the ``GFP`` flags specified for ``FGP_CREAT`` are atomic.h](hIf }(hjshhhNhNubjS)}(h ``FGP_LOCK``h]hFGP_LOCK}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjsubh or }(hjshhhNhNubjS)}(h ``FGP_CREAT``h]h FGP_CREAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjsubh7 are specified then the function may sleep even if the }(hjshhhNhNubjS)}(h``GFP``h]hGFP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjsubh flags specified for }(hjshhhNhNubjS)}(h ``FGP_CREAT``h]h FGP_CREAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjsubh are atomic.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hLIf this function returns a folio, it is returned with an increased refcount.h]hLIf this function returns a folio, it is returned with an increased refcount.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h*The found folio or an ERR_PTR() otherwise.h]h*The found folio or an ERR_PTR() otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfilemap_get_folios (C function)c.filemap_get_folioshNtauh1hhjhhhNhNubh)}(hhh](h)}(htunsigned filemap_get_folios (struct address_space *mapping, pgoff_t *start, pgoff_t end, struct folio_batch *fbatch)h]h)}(hsunsigned filemap_get_folios(struct address_space *mapping, pgoff_t *start, pgoff_t end, struct folio_batch *fbatch)h](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj.hMubh)}(hfilemap_get_foliosh]j)}(hfilemap_get_foliosh]hfilemap_get_folios}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj.hMubj )}(hX(struct address_space *mapping, pgoff_t *start, pgoff_t end, struct folio_batch *fbatch)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj]hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjYubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubh)}(hhh]j)}(h address_spaceh]h address_space}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj}modnameN classnameNjpjs)}jv]jy)}jljCsbc.filemap_get_foliosasbuh1hhjYubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjYubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjUubj )}(hpgoff_t *starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_get_foliosasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hstarth]hstart}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjUubj )}(h pgoff_t endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]jc.filemap_get_foliosasbuh1hhj ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hendh]hend}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjUubj )}(hstruct folio_batch *fbatchh](j5)}(hj8h]hstruct}(hjlhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_get_foliosasbuh1hhjhubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhubj)}(hfbatchh]hfbatch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjUubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj.hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj.hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj.hMhjhhubj4)}(hhh]jM)}(hGet a batch of foliosh]hGet a batch of folios}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj.hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX1**Parameters** ``struct address_space *mapping`` The address_space to search ``pgoff_t *start`` The starting page index ``pgoff_t end`` The final page index (inclusive) ``struct folio_batch *fbatch`` The batch to fill. **Description** Search for and return a batch of folios in the mapping starting at index **start** and up to index **end** (inclusive). The folios are returned in **fbatch** with an elevated reference count. **Return** The number of folios which were found. We also update **start** to index the next folio for the traversal.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubj)}(hhh](j)}(h>``struct address_space *mapping`` The address_space to search h](j)}(h!``struct address_space *mapping``h]jS)}(hj.h]hstruct address_space *mapping}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj(ubj)}(hhh]jM)}(hThe address_space to searchh]hThe address_space to search}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChMhjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhj%ubj)}(h+``pgoff_t *start`` The starting page index h](j)}(h``pgoff_t *start``h]jS)}(hjgh]hpgoff_t *start}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjaubj)}(hhh]jM)}(hThe starting page indexh]hThe starting page index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj%ubj)}(h1``pgoff_t end`` The final page index (inclusive) h](j)}(h``pgoff_t end``h]jS)}(hjh]h pgoff_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h The final page index (inclusive)h]h The final page index (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubj)}(h2``struct folio_batch *fbatch`` The batch to fill. h](j)}(h``struct folio_batch *fbatch``h]jS)}(hjh]hstruct folio_batch *fbatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hThe batch to fill.h]hThe batch to fill.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubjM)}(hSearch for and return a batch of folios in the mapping starting at index **start** and up to index **end** (inclusive). The folios are returned in **fbatch** with an elevated reference count.h](hISearch for and return a batch of folios in the mapping starting at index }(hj*hhhNhNubj)}(h **start**h]hstart}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh and up to index }(hj*hhhNhNubj)}(h**end**h]hend}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh* (inclusive). The folios are returned in }(hj*hhhNhNubj)}(h **fbatch**h]hfbatch}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh" with an elevated reference count.}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubjM)}(h **Return**h]j)}(hjqh]hReturn}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubjM)}(hjThe number of folios which were found. We also update **start** to index the next folio for the traversal.h](h6The number of folios which were found. We also update }(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ to index the next folio for the traversal.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&filemap_get_folios_contig (C function)c.filemap_get_folios_contighNtauh1hhjhhhNhNubh)}(hhh](h)}(h{unsigned filemap_get_folios_contig (struct address_space *mapping, pgoff_t *start, pgoff_t end, struct folio_batch *fbatch)h]h)}(hzunsigned filemap_get_folios_contig(struct address_space *mapping, pgoff_t *start, pgoff_t end, struct folio_batch *fbatch)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfilemap_get_folios_contigh]j)}(hfilemap_get_folios_contigh]hfilemap_get_folios_contig}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hX(struct address_space *mapping, pgoff_t *start, pgoff_t end, struct folio_batch *fbatch)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj%modnameN classnameNjpjs)}jv]jy)}jljsbc.filemap_get_folios_contigasbuh1hhjubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjQhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hpgoff_t *starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj|modnameN classnameNjpjs)}jv]j?c.filemap_get_folios_contigasbuh1hhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjsubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j?c.filemap_get_folios_contigasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio_batch *fbatchh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj4modnameN classnameNjpjs)}jv]j?c.filemap_get_folios_contigasbuh1hhjubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj^hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfbatchh]hfbatch}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h Get a batch of contiguous foliosh]h Get a batch of contiguous folios}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX0**Parameters** ``struct address_space *mapping`` The address_space to search ``pgoff_t *start`` The starting page index ``pgoff_t end`` The final page index (inclusive) ``struct folio_batch *fbatch`` The batch to fill **Description** filemap_get_folios_contig() works exactly like filemap_get_folios(), except the returned folios are guaranteed to be contiguous. This may not return all contiguous folios if the batch gets filled up. **Return** The number of folios found. Also update **start** to be positioned for traversal of the next folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(h>``struct address_space *mapping`` The address_space to search h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hThe address_space to searchh]hThe address_space to search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``pgoff_t *start`` The starting page index h](j)}(h``pgoff_t *start``h]jS)}(hjh]hpgoff_t *start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj ubj)}(hhh]jM)}(hThe starting page indexh]hThe starting page index}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj$hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhjubj)}(h1``pgoff_t end`` The final page index (inclusive) h](j)}(h``pgoff_t end``h]jS)}(hjHh]h pgoff_t end}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjBubj)}(hhh]jM)}(h The final page index (inclusive)h]h The final page index (inclusive)}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj]hMhjubj)}(h1``struct folio_batch *fbatch`` The batch to fill h](j)}(h``struct folio_batch *fbatch``h]jS)}(hjh]hstruct folio_batch *fbatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj{ubj)}(hhh]jM)}(hThe batch to fillh]hThe batch to fill}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hfilemap_get_folios_contig() works exactly like filemap_get_folios(), except the returned folios are guaranteed to be contiguous. This may not return all contiguous folios if the batch gets filled up.h]hfilemap_get_folios_contig() works exactly like filemap_get_folios(), except the returned folios are guaranteed to be contiguous. This may not return all contiguous folios if the batch gets filled up.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hcThe number of folios found. Also update **start** to be positioned for traversal of the next folio.h](h(The number of folios found. Also update }(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 to be positioned for traversal of the next folio.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#filemap_get_folios_tag (C function)c.filemap_get_folios_taghNtauh1hhjhhhNhNubh)}(hhh](h)}(hunsigned filemap_get_folios_tag (struct address_space *mapping, pgoff_t *start, pgoff_t end, xa_mark_t tag, struct folio_batch *fbatch)h]h)}(hunsigned filemap_get_folios_tag(struct address_space *mapping, pgoff_t *start, pgoff_t end, xa_mark_t tag, struct folio_batch *fbatch)h](j)}(hunsignedh]hunsigned}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM ubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhjHhM ubh)}(hfilemap_get_folios_tagh]j)}(hfilemap_get_folios_tagh]hfilemap_get_folios_tag}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ](jjeh"]h$]h&]jjuh1hhj6hhhjHhM ubj )}(hg(struct address_space *mapping, pgoff_t *start, pgoff_t end, xa_mark_t tag, struct folio_batch *fbatch)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjwhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj]sbc.filemap_get_folios_tagasbuh1hhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjsubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubj )}(hpgoff_t *starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_get_folios_tagasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hstarth]hstart}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubj )}(h pgoff_t endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjCmodnameN classnameNjpjs)}jv]jc.filemap_get_folios_tagasbuh1hhj:ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hendh]hend}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubj )}(h xa_mark_t tagh](h)}(hhh]j)}(h xa_mark_th]h xa_mark_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_get_folios_tagasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(htagh]htag}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubj )}(hstruct folio_batch *fbatchh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_get_folios_tagasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfbatchh]hfbatch}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubeh}(h]h ]h"]h$]h&]jjuh1j hj6hhhjHhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj2hhhjHhM ubah}(h]j-ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjHhM hj/hhubj4)}(hhh]jM)}(h&Get a batch of folios matching **tag**h](hGet a batch of folios matching }(hjOhhhNhNubj)}(h**tag**h]htag}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjLhhubah}(h]h ]h"]h$]h&]uh1j3hj/hhhjHhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjujHjujIjJjKuh1hhhhjhNhNubj)}(hXU**Parameters** ``struct address_space *mapping`` The address_space to search ``pgoff_t *start`` The starting page index ``pgoff_t end`` The final page index (inclusive) ``xa_mark_t tag`` The tag index ``struct folio_batch *fbatch`` The batch to fill **Description** The first folio may start before **start**; if it does, it will contain **start**. The final folio may extend beyond **end**; if it does, it will contain **end**. The folios have ascending indices. There may be gaps between the folios if there are indices which have no folio in the page cache. If folios are added to or removed from the page cache while this is running, they may or may not be found by this call. Only returns folios that are tagged with **tag**. **Return** The number of folios found. Also update **start** to index the next folio for traversal.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjyubj)}(hhh](j)}(h>``struct address_space *mapping`` The address_space to search h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hThe address_space to searchh]hThe address_space to search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h+``pgoff_t *start`` The starting page index h](j)}(h``pgoff_t *start``h]jS)}(hjh]hpgoff_t *start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hThe starting page indexh]hThe starting page index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h1``pgoff_t end`` The final page index (inclusive) h](j)}(h``pgoff_t end``h]jS)}(hjh]h pgoff_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj ubj)}(hhh]jM)}(h The final page index (inclusive)h]h The final page index (inclusive)}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hM hj&ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj%hM hjubj)}(h ``xa_mark_t tag`` The tag index h](j)}(h``xa_mark_t tag``h]jS)}(hjIh]h xa_mark_t tag}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjGubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjCubj)}(hhh]jM)}(h The tag indexh]h The tag index}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj^hM hj_ubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj^hM hjubj)}(h1``struct folio_batch *fbatch`` The batch to fill h](j)}(h``struct folio_batch *fbatch``h]jS)}(hjh]hstruct folio_batch *fbatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj|ubj)}(hhh]jM)}(hThe batch to fillh]hThe batch to fill}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjyubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjyubjM)}(hXThe first folio may start before **start**; if it does, it will contain **start**. The final folio may extend beyond **end**; if it does, it will contain **end**. The folios have ascending indices. There may be gaps between the folios if there are indices which have no folio in the page cache. If folios are added to or removed from the page cache while this is running, they may or may not be found by this call. Only returns folios that are tagged with **tag**.h](h!The first folio may start before }(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; if it does, it will contain }(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh%. The final folio may extend beyond }(hjhhhNhNubj)}(h**end**h]hend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; if it does, it will contain }(hjhhhNhNubj)}(h**end**h]hend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX*. The folios have ascending indices. There may be gaps between the folios if there are indices which have no folio in the page cache. If folios are added to or removed from the page cache while this is running, they may or may not be found by this call. Only returns folios that are tagged with }(hjhhhNhNubj)}(h**tag**h]htag}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjyubjM)}(h **Return**h]j)}(hj>h]hReturn}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM& hjyubjM)}(hXThe number of folios found. Also update **start** to index the next folio for traversal.h](h(The number of folios found. Also update }(hjThhhNhNubj)}(h **start**h]hstart}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubh' to index the next folio for traversal.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM' hjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfilemap_read (C function)c.filemap_readhNtauh1hhjhhhNhNubh)}(hhh](h)}(hVssize_t filemap_read (struct kiocb *iocb, struct iov_iter *iter, ssize_t already_read)h]h)}(hUssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter, ssize_t already_read)h](h)}(hhh]j)}(hssize_th]hssize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl filemap_readsbc.filemap_readasbuh1hhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(h filemap_readh]j)}(hjh]h filemap_read}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(hA(struct kiocb *iocb, struct iov_iter *iter, ssize_t already_read)h](j )}(hstruct kiocb *iocbh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hkiocbh]hkiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_readasbuh1hhjubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj1hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hiocbh]hiocb}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct iov_iter *iterh](j5)}(hj8h]hstruct}(hjWhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jc.filemap_readasbuh1hhjSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSubj)}(hiterh]hiter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hssize_t already_readh](h)}(hhh]j)}(hssize_th]hssize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_readasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h already_readh]h already_read}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(hRead data from the page cache.h]hRead data from the page cache.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj8jHj8jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct kiocb *iocb`` The iocb to read. ``struct iov_iter *iter`` Destination for the data. ``ssize_t already_read`` Number of bytes already read by the caller. **Description** Copies data from the page cache. If the data is not currently present, uses the readahead and read_folio address_space operations to fetch it. **Return** Total number of bytes copied, including those already read by the caller. If an error happens before any bytes are copied, returns a negative error number.h](jM)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj<ubj)}(hhh](j)}(h)``struct kiocb *iocb`` The iocb to read. h](j)}(h``struct kiocb *iocb``h]jS)}(hjah]hstruct kiocb *iocb}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj[ubj)}(hhh]jM)}(hThe iocb to read.h]hThe iocb to read.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhM hjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhM hjXubj)}(h4``struct iov_iter *iter`` Destination for the data. h](j)}(h``struct iov_iter *iter``h]jS)}(hjh]hstruct iov_iter *iter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hDestination for the data.h]hDestination for the data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjXubj)}(hE``ssize_t already_read`` Number of bytes already read by the caller. h](j)}(h``ssize_t already_read``h]jS)}(hjh]hssize_t already_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(h+Number of bytes already read by the caller.h]h+Number of bytes already read by the caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjXubeh}(h]h ]h"]h$]h&]uh1jhj<ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj<ubjM)}(hCopies data from the page cache. If the data is not currently present, uses the readahead and read_folio address_space operations to fetch it.h]hCopies data from the page cache. If the data is not currently present, uses the readahead and read_folio address_space operations to fetch it.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj<ubjM)}(h **Return**h]j)}(hj5h]hReturn}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj<ubjM)}(hTotal number of bytes copied, including those already read by the caller. If an error happens before any bytes are copied, returns a negative error number.h]hTotal number of bytes copied, including those already read by the caller. If an error happens before any bytes are copied, returns a negative error number.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#generic_file_read_iter (C function)c.generic_file_read_iterhNtauh1hhjhhhNhNubh)}(hhh](h)}(hJssize_t generic_file_read_iter (struct kiocb *iocb, struct iov_iter *iter)h]h)}(hIssize_t generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlgeneric_file_read_itersbc.generic_file_read_iterasbuh1hhjvhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvhhhjhM ubh)}(hgeneric_file_read_iterh]j)}(hjh]hgeneric_file_read_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjvhhhjhM ubj )}(h+(struct kiocb *iocb, struct iov_iter *iter)h](j )}(hstruct kiocb *iocbh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hkiocbh]hkiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.generic_file_read_iterasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hiocbh]hiocb}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct iov_iter *iterh](j5)}(hj8h]hstruct}(hj<hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj8ubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj\modnameN classnameNjpjs)}jv]jc.generic_file_read_iterasbuh1hhj8ubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj8ubj)}(hiterh]hiter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjvhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjrhhhjhM ubah}(h]jmah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjohhubj4)}(hhh]jM)}(hgeneric filesystem read routineh]hgeneric filesystem read routine}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjohhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct kiocb *iocb`` kernel I/O control block ``struct iov_iter *iter`` destination for the data read **Description** This is the "read_iter()" routine for all filesystems that can use the page cache directly. The IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be returned when no data can be read without waiting for I/O requests to complete; it doesn't prevent readahead. The IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests shall be made for the read or for readahead. When no data can be read, -EAGAIN shall be returned. When readahead would be triggered, a partial, possibly empty read shall be returned. **Return** * number of bytes copied, even for partial reads * negative error code (or 0 if IOCB_NOIO) if nothing was readh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh](j)}(h0``struct kiocb *iocb`` kernel I/O control block h](j)}(h``struct kiocb *iocb``h]jS)}(hjh]hstruct kiocb *iocb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hkernel I/O control blockh]hkernel I/O control block}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h8``struct iov_iter *iter`` destination for the data read h](j)}(h``struct iov_iter *iter``h]jS)}(hj7h]hstruct iov_iter *iter}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj1ubj)}(hhh]jM)}(hdestination for the data readh]hdestination for the data read}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhM hjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubjM)}(h[This is the "read_iter()" routine for all filesystems that can use the page cache directly.h]h_This is the “read_iter()” routine for all filesystems that can use the page cache directly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubjM)}(hThe IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be returned when no data can be read without waiting for I/O requests to complete; it doesn't prevent readahead.h]hThe IOCB_NOWAIT flag in iocb->ki_flags indicates that -EAGAIN shall be returned when no data can be read without waiting for I/O requests to complete; it doesn’t prevent readahead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubjM)}(hXThe IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests shall be made for the read or for readahead. When no data can be read, -EAGAIN shall be returned. When readahead would be triggered, a partial, possibly empty read shall be returned.h]hXThe IOCB_NOIO flag in iocb->ki_flags indicates that no new I/O requests shall be made for the read or for readahead. When no data can be read, -EAGAIN shall be returned. When readahead would be triggered, a partial, possibly empty read shall be returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubjaW)}(hhh](j/)}(h.number of bytes copied, even for partial readsh]jM)}(hjh]h.number of bytes copied, even for partial reads}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h;negative error code (or 0 if IOCB_NOIO) if nothing was readh]jM)}(hjh]h;negative error code (or 0 if IOCB_NOIO) if nothing was read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjI uh1j`WhjhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h filemap_splice_read (C function)c.filemap_splice_readhNtauh1hhjhhhNhNubh)}(hhh](h)}(hyssize_t filemap_splice_read (struct file *in, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags)h]h)}(hxssize_t filemap_splice_read(struct file *in, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj+modnameN classnameNjpjs)}jv]jy)}jlfilemap_splice_readsbc.filemap_splice_readasbuh1hhj"hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhjJhM ubh)}(hfilemap_splice_readh]j)}(hjGh]hfilemap_splice_read}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ](jjeh"]h$]h&]jjuh1hhj"hhhjJhM ubj )}(h](struct file *in, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags)h](j )}(hstruct file *inh](j5)}(hj8h]hstruct}(hjxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jEc.filemap_splice_readasbuh1hhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjtubj)}(hinh]hin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubj )}(h loff_t *pposh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jEc.filemap_splice_readasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpposh]hppos}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubj )}(hstruct pipe_inode_info *pipeh](j5)}(hj8h]hstruct}(hj=hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj9ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubh)}(hhh]j)}(hpipe_inode_infoh]hpipe_inode_info}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]modnameN classnameNjpjs)}jv]jEc.filemap_splice_readasbuh1hhj9ubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj9ubj)}(hpipeh]hpipe}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubj )}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jEc.filemap_splice_readasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubj )}(hunsigned int flagsh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hflagsh]hflags}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubeh}(h]h ]h"]h$]h&]jjuh1j hj"hhhjJhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjJhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjJhM hjhhubj4)}(hhh]jM)}(h/Splice data from a file's pagecache into a pipeh]h1Splice data from a file’s pagecache into a pipe}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjThhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjJhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjojHjojIjJjKuh1hhhhjhNhNubj)}(hXV**Parameters** ``struct file *in`` The file to read from ``loff_t *ppos`` Pointer to the file position to read from ``struct pipe_inode_info *pipe`` The pipe to splice into ``size_t len`` The amount to splice ``unsigned int flags`` The SPLICE_F_* flags **Description** This function gets folios from a file's pagecache and splices them into the pipe. Readahead will be called as necessary to fill more folios. This may be used for blockdevs also. **Return** On success, the number of bytes read will be returned and ***ppos** will be updated if appropriate; 0 will be returned if there is no more data to be read; -EAGAIN will be returned if the pipe had no space, and some other negative error code will be returned on error. A short read may occur if the pipe has insufficient space, we reach the end of the data or we hit a hole.h](jM)}(h**Parameters**h]j)}(hjyh]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjsubj)}(hhh](j)}(h*``struct file *in`` The file to read from h](j)}(h``struct file *in``h]jS)}(hjh]hstruct file *in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hThe file to read fromh]hThe file to read from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h;``loff_t *ppos`` Pointer to the file position to read from h](j)}(h``loff_t *ppos``h]jS)}(hjh]h loff_t *ppos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(h)Pointer to the file position to read fromh]h)Pointer to the file position to read from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h9``struct pipe_inode_info *pipe`` The pipe to splice into h](j)}(h ``struct pipe_inode_info *pipe``h]jS)}(hj h]hstruct pipe_inode_info *pipe}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjubj)}(hhh]jM)}(hThe pipe to splice intoh]hThe pipe to splice into}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h$``size_t len`` The amount to splice h](j)}(h``size_t len``h]jS)}(hjCh]h size_t len}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjAubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj=ubj)}(hhh]jM)}(hThe amount to spliceh]hThe amount to splice}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjXhM hjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhM hjubj)}(h,``unsigned int flags`` The SPLICE_F_* flags h](j)}(h``unsigned int flags``h]jS)}(hj|h]hunsigned int flags}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjvubj)}(hhh]jM)}(hThe SPLICE_F_* flagsh]hThe SPLICE_F_* flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjsubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjsubjM)}(hThis function gets folios from a file's pagecache and splices them into the pipe. Readahead will be called as necessary to fill more folios. This may be used for blockdevs also.h]hThis function gets folios from a file’s pagecache and splices them into the pipe. Readahead will be called as necessary to fill more folios. This may be used for blockdevs also.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjsubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjsubjM)}(hXwOn success, the number of bytes read will be returned and ***ppos** will be updated if appropriate; 0 will be returned if there is no more data to be read; -EAGAIN will be returned if the pipe had no space, and some other negative error code will be returned on error. A short read may occur if the pipe has insufficient space, we reach the end of the data or we hit a hole.h](h:On success, the number of bytes read will be returned and }(hjhhhNhNubj)}(h ***ppos**h]h*ppos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX4 will be updated if appropriate; 0 will be returned if there is no more data to be read; -EAGAIN will be returned if the pipe had no space, and some other negative error code will be returned on error. A short read may occur if the pipe has insufficient space, we reach the end of the data or we hit a hole.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfilemap_fault (C function)c.filemap_faulthNtauh1hhjhhhNhNubh)}(hhh](h)}(h/vm_fault_t filemap_fault (struct vm_fault *vmf)h]h)}(h.vm_fault_t filemap_fault(struct vm_fault *vmf)h](h)}(hhh]j)}(h vm_fault_th]h vm_fault_t}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj:modnameN classnameNjpjs)}jv]jy)}jl filemap_faultsbc.filemap_faultasbuh1hhj1hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM ubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhjYhM ubh)}(h filemap_faulth]j)}(hjVh]h filemap_fault}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1hhj1hhhjYhM ubj )}(h(struct vm_fault *vmf)h]j )}(hstruct vm_fault *vmfh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_faulth]hvm_fault}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jTc.filemap_faultasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmfh]hvmf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj1hhhjYhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj-hhhjYhM ubah}(h]j(ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjYhM hj*hhubj4)}(hhh]jM)}(h)read in file data for page fault handlingh]h)read in file data for page fault handling}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hj*hhhjYhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX-**Parameters** ``struct vm_fault *vmf`` struct vm_fault containing details of the fault **Description** filemap_fault() is invoked via the vma operations vector for a mapped memory region to read in file data during a page fault. The goto's are kind of ugly, but this streamlines the normal case of having it in the page cache, and handles the special cases reasonably without having a lot of duplicated code. vma->vm_mm->mmap_lock must be held on entry. If our return value has VM_FAULT_RETRY set, it's because the mmap_lock may be dropped before doing I/O or by lock_folio_maybe_drop_mmap(). If our return value does not have VM_FAULT_RETRY set, the mmap_lock has not been released. We never return with VM_FAULT_RETRY and a bit from VM_FAULT_ERROR set. **Return** bitwise-OR of ``VM_FAULT_`` codes.h](jM)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubj)}(hhh]j)}(hI``struct vm_fault *vmf`` struct vm_fault containing details of the fault h](j)}(h``struct vm_fault *vmf``h]jS)}(hjIh]hstruct vm_fault *vmf}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjGubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hjCubj)}(hhh]jM)}(h/struct vm_fault containing details of the faulth]h/struct vm_fault containing details of the fault}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj^hM hj_ubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj^hM hj@ubah}(h]h ]h"]h$]h&]uh1jhj$ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(h}filemap_fault() is invoked via the vma operations vector for a mapped memory region to read in file data during a page fault.h]h}filemap_fault() is invoked via the vma operations vector for a mapped memory region to read in file data during a page fault.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(hThe goto's are kind of ugly, but this streamlines the normal case of having it in the page cache, and handles the special cases reasonably without having a lot of duplicated code.h]hThe goto’s are kind of ugly, but this streamlines the normal case of having it in the page cache, and handles the special cases reasonably without having a lot of duplicated code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(h,vma->vm_mm->mmap_lock must be held on entry.h]h,vma->vm_mm->mmap_lock must be held on entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(hIf our return value has VM_FAULT_RETRY set, it's because the mmap_lock may be dropped before doing I/O or by lock_folio_maybe_drop_mmap().h]hIf our return value has VM_FAULT_RETRY set, it’s because the mmap_lock may be dropped before doing I/O or by lock_folio_maybe_drop_mmap().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(hZIf our return value does not have VM_FAULT_RETRY set, the mmap_lock has not been released.h]hZIf our return value does not have VM_FAULT_RETRY set, the mmap_lock has not been released.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(hFWe never return with VM_FAULT_RETRY and a bit from VM_FAULT_ERROR set.h]hFWe never return with VM_FAULT_RETRY and a bit from VM_FAULT_ERROR set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubjM)}(h"bitwise-OR of ``VM_FAULT_`` codes.h](hbitwise-OR of }(hj hhhNhNubjS)}(h ``VM_FAULT_``h]h VM_FAULT_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubh codes.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM hj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hread_cache_folio (C function)c.read_cache_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hrstruct folio * read_cache_folio (struct address_space *mapping, pgoff_t index, filler_t filler, struct file *file)h]h)}(hpstruct folio *read_cache_folio(struct address_space *mapping, pgoff_t index, filler_t filler, struct file *file)h](j5)}(hj8h]hstruct}(hjMhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjIhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMJubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhjZhMJubh)}(hhh]j)}(hfolioh]hfolio}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjnmodnameN classnameNjpjs)}jv]jy)}jlread_cache_foliosbc.read_cache_folioasbuh1hhjIhhhjZhMJubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhjZhMJubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjIhhhjZhMJubh)}(hread_cache_folioh]j)}(hjh]hread_cache_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjIhhhjZhMJubj )}(hR(struct address_space *mapping, pgoff_t index, filler_t filler, struct file *file)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.read_cache_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj<modnameN classnameNjpjs)}jv]jc.read_cache_folioasbuh1hhj3ubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(hindexh]hindex}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hfiller_t fillerh](h)}(hhh]j)}(hfiller_th]hfiller_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.read_cache_folioasbuh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hfillerh]hfiller}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.read_cache_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjIhhhjZhMJubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjEhhhjZhMJubah}(h]j@ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjZhMJhjBhhubj4)}(hhh]jM)}(h(Read into page cache, fill it if needed.h]h(Read into page cache, fill it if needed.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMJhjEhhubah}(h]h ]h"]h$]h&]uh1j3hjBhhhjZhMJubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj`jHj`jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` The address_space to read from. ``pgoff_t index`` The index to read. ``filler_t filler`` Function to perform the read, or NULL to use aops->read_folio(). ``struct file *file`` Passed to filler function, may be NULL if not required. **Description** Read one page into the page cache. If it succeeds, the folio returned will contain **index**, but it may not be the first page of the folio. If the filler function returns an error, it will be returned to the caller. **Context** May sleep. Expects mapping->invalidate_lock to be held. **Return** An uptodate folio on success, ERR_PTR() on failure.h](jM)}(h**Parameters**h]j)}(hjjh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMNhjdubj)}(hhh](j)}(hB``struct address_space *mapping`` The address_space to read from. h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMKhjubj)}(hhh]jM)}(hThe address_space to read from.h]hThe address_space to read from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMKhjubj)}(h%``pgoff_t index`` The index to read. h](j)}(h``pgoff_t index``h]jS)}(hjh]h pgoff_t index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMLhjubj)}(hhh]jM)}(hThe index to read.h]hThe index to read.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMLhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMLhjubj)}(hU``filler_t filler`` Function to perform the read, or NULL to use aops->read_folio(). h](j)}(h``filler_t filler``h]jS)}(hjh]hfiller_t filler}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMMhjubj)}(hhh]jM)}(h@Function to perform the read, or NULL to use aops->read_folio().h]h@Function to perform the read, or NULL to use aops->read_folio().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjubj)}(hN``struct file *file`` Passed to filler function, may be NULL if not required. h](j)}(h``struct file *file``h]jS)}(hj4h]hstruct file *file}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMNhj.ubj)}(hhh]jM)}(h7Passed to filler function, may be NULL if not required.h]h7Passed to filler function, may be NULL if not required.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhMNhjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMNhjubeh}(h]h ]h"]h$]h&]uh1jhjdubjM)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMPhjdubjM)}(hRead one page into the page cache. If it succeeds, the folio returned will contain **index**, but it may not be the first page of the folio.h](hTRead one page into the page cache. If it succeeds, the folio returned will contain }(hjhhhNhNubj)}(h **index**h]hindex}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh0, but it may not be the first page of the folio.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMOhjdubjM)}(hKIf the filler function returns an error, it will be returned to the caller.h]hKIf the filler function returns an error, it will be returned to the caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMRhjdubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMUhjdubjM)}(h8May sleep. Expects mapping->invalidate_lock to be held.h]h8May sleep. Expects mapping->invalidate_lock to be held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMVhjdubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMXhjdubjM)}(h3An uptodate folio on success, ERR_PTR() on failure.h]h3An uptodate folio on success, ERR_PTR() on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMWhjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#mapping_read_folio_gfp (C function)c.mapping_read_folio_gfphNtauh1hhjhhhNhNubh)}(hhh](h)}(h_struct folio * mapping_read_folio_gfp (struct address_space *mapping, pgoff_t index, gfp_t gfp)h]h)}(h]struct folio *mapping_read_folio_gfp(struct address_space *mapping, pgoff_t index, gfp_t gfp)h](j5)}(hj8h]hstruct}(hj#hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMbubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj0hMbubh)}(hhh]j)}(hfolioh]hfolio}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjDmodnameN classnameNjpjs)}jv]jy)}jlmapping_read_folio_gfpsbc.mapping_read_folio_gfpasbuh1hhjhhhj0hMbubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj0hMbubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj0hMbubh)}(hmapping_read_folio_gfph]j)}(hj`h]hmapping_read_folio_gfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj0hMbubj )}(h9(struct address_space *mapping, pgoff_t index, gfp_t gfp)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j^c.mapping_read_folio_gfpasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j^c.mapping_read_folio_gfpasbuh1hhj ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hindexh]hindex}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjZmodnameN classnameNjpjs)}jv]j^c.mapping_read_folio_gfpasbuh1hhjQubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj0hMbubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj0hMbubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj0hMbhjhhubj4)}(hhh]jM)}(h7Read into page cache, using specified allocation flags.h]h7Read into page cache, using specified allocation flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMbhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj0hMbubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` The address_space for the folio. ``pgoff_t index`` The index that the allocated folio will contain. ``gfp_t gfp`` The page allocator flags to use if allocating. **Description** This is the same as "read_cache_folio(mapping, index, NULL, NULL)", but with any new memory allocations done using the specified allocation flags. The most likely error from this function is EIO, but ENOMEM is possible and so is EINTR. If ->read_folio returns another error, that will be returned to the caller. The function expects mapping->invalidate_lock to be already held. **Return** Uptodate folio on success, ERR_PTR() on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMfhjubj)}(hhh](j)}(hC``struct address_space *mapping`` The address_space for the folio. h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMchjubj)}(hhh]jM)}(h The address_space for the folio.h]h The address_space for the folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMchjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMchjubj)}(hC``pgoff_t index`` The index that the allocated folio will contain. h](j)}(h``pgoff_t index``h]jS)}(hj(h]h pgoff_t index}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMdhj"ubj)}(hhh]jM)}(h0The index that the allocated folio will contain.h]h0The index that the allocated folio will contain.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hMdhj>ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMdhjubj)}(h=``gfp_t gfp`` The page allocator flags to use if allocating. h](j)}(h ``gfp_t gfp``h]jS)}(hjah]h gfp_t gfp}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMehj[ubj)}(hhh]jM)}(h.The page allocator flags to use if allocating.h]h.The page allocator flags to use if allocating.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMehjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMehjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMghjubjM)}(hThis is the same as "read_cache_folio(mapping, index, NULL, NULL)", but with any new memory allocations done using the specified allocation flags.h]hThis is the same as “read_cache_folio(mapping, index, NULL, NULL)”, but with any new memory allocations done using the specified allocation flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMfhjubjM)}(hThe most likely error from this function is EIO, but ENOMEM is possible and so is EINTR. If ->read_folio returns another error, that will be returned to the caller.h]hThe most likely error from this function is EIO, but ENOMEM is possible and so is EINTR. If ->read_folio returns another error, that will be returned to the caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMihjubjM)}(hAThe function expects mapping->invalidate_lock to be already held.h]hAThe function expects mapping->invalidate_lock to be already held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMmhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMohjubjM)}(h0Uptodate folio on success, ERR_PTR() on failure.h]h0Uptodate folio on success, ERR_PTR() on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMphjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h read_cache_page_gfp (C function)c.read_cache_page_gfphNtauh1hhjhhhNhNubh)}(hhh](h)}(h[struct page * read_cache_page_gfp (struct address_space *mapping, pgoff_t index, gfp_t gfp)h]h)}(hYstruct page *read_cache_page_gfp(struct address_space *mapping, pgoff_t index, gfp_t gfp)h](j5)}(hj8h]hstruct}(hj&hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj"hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj3hMubh)}(hhh]j)}(hpageh]hpage}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]jy)}jlread_cache_page_gfpsbc.read_cache_page_gfpasbuh1hhj"hhhj3hMubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj3hMubjF )}(hjI h]h*}(hjthhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj"hhhj3hMubh)}(hread_cache_page_gfph]j)}(hjch]hread_cache_page_gfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj"hhhj3hMubj )}(h9(struct address_space *mapping, pgoff_t index, gfp_t gfp)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jac.read_cache_page_gfpasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jac.read_cache_page_gfpasbuh1hhj ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hindexh]hindex}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]modnameN classnameNjpjs)}jv]jac.read_cache_page_gfpasbuh1hhjTubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj"hhhj3hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj3hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj3hMhjhhubj4)}(hhh]jM)}(hinvalidate_lock to be already held. **Return** up to date page on success, ERR_PTR() on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(h;``struct address_space *mapping`` the page's address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hthe page's address_spaceh]hthe page’s address_space}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h!``pgoff_t index`` the page index h](j)}(h``pgoff_t index``h]jS)}(hj+h]h pgoff_t index}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj%ubj)}(hhh]jM)}(hthe page indexh]hthe page index}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hMhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubj)}(h<``gfp_t gfp`` the page allocator flags to use if allocating h](j)}(h ``gfp_t gfp``h]jS)}(hjdh]h gfp_t gfp}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj^ubj)}(hhh]jM)}(h-the page allocator flags to use if allocatingh]h-the page allocator flags to use if allocating}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhMhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hThis is the same as "read_mapping_page(mapping, index, NULL)", but with any new page allocations done using the specified allocation flags.h]hThis is the same as “read_mapping_page(mapping, index, NULL)”, but with any new page allocations done using the specified allocation flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h7If the page does not get brought uptodate, return -EIO.h]h7If the page does not get brought uptodate, return -EIO.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hAThe function expects mapping->invalidate_lock to be already held.h]hAThe function expects mapping->invalidate_lock to be already held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h1up to date page on success, ERR_PTR() on failure.h]h1up to date page on success, ERR_PTR() on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&__generic_file_write_iter (C function)c.__generic_file_write_iterhNtauh1hhjhhhNhNubh)}(hhh](h)}(hMssize_t __generic_file_write_iter (struct kiocb *iocb, struct iov_iter *from)h]h)}(hLssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)h](h)}(hhh]j)}(hssize_th]hssize_t}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.modnameN classnameNjpjs)}jv]jy)}jl__generic_file_write_itersbc.__generic_file_write_iterasbuh1hhj%hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMYubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhjMhMYubh)}(h__generic_file_write_iterh]j)}(hjJh]h__generic_file_write_iter}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj%hhhjMhMYubj )}(h+(struct kiocb *iocb, struct iov_iter *from)h](j )}(hstruct kiocb *iocbh](j5)}(hj8h]hstruct}(hj{hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubh)}(hhh]j)}(hkiocbh]hkiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jHc.__generic_file_write_iterasbuh1hhjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjwubj)}(hiocbh]hiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjsubj )}(hstruct iov_iter *fromh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jHc.__generic_file_write_iterasbuh1hhjubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj5hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfromh]hfrom}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjsubeh}(h]h ]h"]h$]h&]jjuh1j hj%hhhjMhMYubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj!hhhjMhMYubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjMhMYhjhhubj4)}(hhh]jM)}(hwrite data to a fileh]hwrite data to a file}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMYhjihhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjMhMYubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX@**Parameters** ``struct kiocb *iocb`` IO state structure (file, offset, etc.) ``struct iov_iter *from`` iov_iter with data to write **Description** This function does all the work needed for actually writing data to a file. It does all basic checks, removes SUID from the file, updates modification times and calls proper subroutines depending on whether we do direct IO or a standard buffered write. It expects i_rwsem to be grabbed unless we work on a block device or similar object which does not need locking at all. This function does *not* take care of syncing data in case of O_SYNC write. A caller has to handle it. This is mainly due to the fact that we want to avoid syncing under i_rwsem. **Return** * number of bytes written, even for truncated writes * negative error code if no data has been written at allh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM]hjubj)}(hhh](j)}(h?``struct kiocb *iocb`` IO state structure (file, offset, etc.) h](j)}(h``struct kiocb *iocb``h]jS)}(hjh]hstruct kiocb *iocb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMZhjubj)}(hhh]jM)}(h'IO state structure (file, offset, etc.)h]h'IO state structure (file, offset, etc.)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMZhjubj)}(h6``struct iov_iter *from`` iov_iter with data to write h](j)}(h``struct iov_iter *from``h]jS)}(hjh]hstruct iov_iter *from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM[hjubj)}(hhh]jM)}(hiov_iter with data to writeh]hiov_iter with data to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM[hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM[hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj!h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM]hjubjM)}(hThis function does all the work needed for actually writing data to a file. It does all basic checks, removes SUID from the file, updates modification times and calls proper subroutines depending on whether we do direct IO or a standard buffered write.h]hThis function does all the work needed for actually writing data to a file. It does all basic checks, removes SUID from the file, updates modification times and calls proper subroutines depending on whether we do direct IO or a standard buffered write.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chM\hjubjM)}(hwIt expects i_rwsem to be grabbed unless we work on a block device or similar object which does not need locking at all.h]hwIt expects i_rwsem to be grabbed unless we work on a block device or similar object which does not need locking at all.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMahjubjM)}(hThis function does *not* take care of syncing data in case of O_SYNC write. A caller has to handle it. This is mainly due to the fact that we want to avoid syncing under i_rwsem.h](hThis function does }(hjUhhhNhNubjB)}(h*not*h]hnot}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jAhjUubh take care of syncing data in case of O_SYNC write. A caller has to handle it. This is mainly due to the fact that we want to avoid syncing under i_rwsem.}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMdhjubjM)}(h **Return**h]j)}(hjxh]hReturn}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhhjubjaW)}(hhh](j/)}(h2number of bytes written, even for truncated writesh]jM)}(hjh]h2number of bytes written, even for truncated writes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMihjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h6negative error code if no data has been written at allh]jM)}(hjh]h6negative error code if no data has been written at all}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMjhjubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjI uh1j`WhjhMihjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$generic_file_write_iter (C function)c.generic_file_write_iterhNtauh1hhjhhhNhNubh)}(hhh](h)}(hKssize_t generic_file_write_iter (struct kiocb *iocb, struct iov_iter *from)h]h)}(hJssize_t generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)h](h)}(hhh]j)}(hssize_th]hssize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlgeneric_file_write_itersbc.generic_file_write_iterasbuh1hhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubh)}(hgeneric_file_write_iterh]j)}(hjh]hgeneric_file_write_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMubj )}(h+(struct kiocb *iocb, struct iov_iter *from)h](j )}(hstruct kiocb *iocbh](j5)}(hj8h]hstruct}(hj9hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj5ubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubh)}(hhh]j)}(hkiocbh]hkiocb}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjYmodnameN classnameNjpjs)}jv]jc.generic_file_write_iterasbuh1hhj5ubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj5ubj)}(hiocbh]hiocb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubj )}(hstruct iov_iter *fromh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hiov_iterh]hiov_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.generic_file_write_iterasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfromh]hfrom}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhjhhubj4)}(hhh]jM)}(hwrite data to a fileh]hwrite data to a file}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj'hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjBjHjBjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct kiocb *iocb`` IO state structure ``struct iov_iter *from`` iov_iter with data to write **Description** This is a wrapper around __generic_file_write_iter() to be used by most filesystems. It takes care of syncing the file in case of O_SYNC file and acquires i_rwsem as needed. **Return** * negative error code if no data has been written at all of vfs_fsync_range() failed for a synchronous write * number of bytes written, even for truncated writesh](jM)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjFubj)}(hhh](j)}(h*``struct kiocb *iocb`` IO state structure h](j)}(h``struct kiocb *iocb``h]jS)}(hjkh]hstruct kiocb *iocb}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjeubj)}(hhh]jM)}(hIO state structureh]hIO state structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjhMhjbubj)}(h6``struct iov_iter *from`` iov_iter with data to write h](j)}(h``struct iov_iter *from``h]jS)}(hjh]hstruct iov_iter *from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hiov_iter with data to writeh]hiov_iter with data to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjbubeh}(h]h ]h"]h$]h&]uh1jhjFubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjFubjM)}(hThis is a wrapper around __generic_file_write_iter() to be used by most filesystems. It takes care of syncing the file in case of O_SYNC file and acquires i_rwsem as needed.h]hThis is a wrapper around __generic_file_write_iter() to be used by most filesystems. It takes care of syncing the file in case of O_SYNC file and acquires i_rwsem as needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjFubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjFubjaW)}(hhh](j/)}(hjnegative error code if no data has been written at all of vfs_fsync_range() failed for a synchronous writeh]jM)}(hjnegative error code if no data has been written at all of vfs_fsync_range() failed for a synchronous writeh]hjnegative error code if no data has been written at all of vfs_fsync_range() failed for a synchronous write}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h2number of bytes written, even for truncated writesh]jM)}(hj:h]h2number of bytes written, even for truncated writes}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhj8ubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjI uh1j`Whj1hMhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"filemap_release_folio (C function)c.filemap_release_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(h;bool filemap_release_folio (struct folio *folio, gfp_t gfp)h]h)}(h:bool filemap_release_folio(struct folio *folio, gfp_t gfp)h](j)}(hj-h]hbool}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrhhhjhMubh)}(hfilemap_release_folioh]j)}(hfilemap_release_folioh]hfilemap_release_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjrhhhjhMubj )}(h (struct folio *folio, gfp_t gfp)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.filemap_release_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]jc.filemap_release_folioasbuh1hhj ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hgfph]hgfp}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjrhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjnhhhjhMubah}(h]jiah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjkhhubj4)}(hhh]jM)}(h(Release fs-specific metadata on a folio.h]h(Release fs-specific metadata on a folio.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjzhhubah}(h]h ]h"]h$]h&]uh1j3hjkhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXl**Parameters** ``struct folio *folio`` The folio which the kernel is trying to free. ``gfp_t gfp`` Memory allocation flags (and I/O mode). **Description** The address_space is trying to release any data attached to a folio (presumably at folio->private). This will also be called if the private_2 flag is set on a page, indicating that the folio has other metadata associated with it. The **gfp** argument specifies whether I/O may be performed to release this page (__GFP_IO), and whether the call may block (__GFP_RECLAIM & __GFP_FS). **Return** ``true`` if the release was successful, otherwise ``false``.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(hF``struct folio *folio`` The folio which the kernel is trying to free. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h-The folio which the kernel is trying to free.h]h-The folio which the kernel is trying to free.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h6``gfp_t gfp`` Memory allocation flags (and I/O mode). h](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h'Memory allocation flags (and I/O mode).h]h'Memory allocation flags (and I/O mode).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hcThe address_space is trying to release any data attached to a folio (presumably at folio->private).h]hcThe address_space is trying to release any data attached to a folio (presumably at folio->private).}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hThis will also be called if the private_2 flag is set on a page, indicating that the folio has other metadata associated with it.h]hThis will also be called if the private_2 flag is set on a page, indicating that the folio has other metadata associated with it.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hThe **gfp** argument specifies whether I/O may be performed to release this page (__GFP_IO), and whether the call may block (__GFP_RECLAIM & __GFP_FS).h](hThe }(hjfhhhNhNubj)}(h**gfp**h]hgfp}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh argument specifies whether I/O may be performed to release this page (__GFP_IO), and whether the call may block (__GFP_RECLAIM & __GFP_FS).}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(h<``true`` if the release was successful, otherwise ``false``.h](jS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh* if the release was successful, otherwise }(hjhhhNhNubjS)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%filemap_invalidate_inode (C function)c.filemap_invalidate_inodehNtauh1hhjhhhNhNubh)}(hhh](h)}(hXint filemap_invalidate_inode (struct inode *inode, bool flush, loff_t start, loff_t end)h]h)}(hWint filemap_invalidate_inode(struct inode *inode, bool flush, loff_t start, loff_t end)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfilemap_invalidate_inodeh]j)}(hfilemap_invalidate_inodeh]hfilemap_invalidate_inode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h;(struct inode *inode, bool flush, loff_t start, loff_t end)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hj+hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj'ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(hinodeh]hinode}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjKmodnameN classnameNjpjs)}jv]jy)}jljsbc.filemap_invalidate_inodeasbuh1hhj'ubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubjF )}(hjI h]h*}(hjwhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj'ubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(h bool flushh](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hflushh]hflush}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(h loff_t starth](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jec.filemap_invalidate_inodeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(h loff_t endh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jec.filemap_invalidate_inodeasbuh1hhjubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hendh]hend}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h>Invalidate/forcibly write back a range of an inode's pagecacheh]h@Invalidate/forcibly write back a range of an inode’s pagecache}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjohhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct inode *inode`` The inode to flush ``bool flush`` Set to write back rather than simply invalidate. ``loff_t start`` First byte to in range. ``loff_t end`` Last byte in range (inclusive), or LLONG_MAX for everything from start onwards. **Description** Invalidate all the folios on an inode that contribute to the specified range, possibly writing them back first. Whilst the operation is undertaken, the invalidate lock is held to prevent new folios from being installed.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh](j)}(h+``struct inode *inode`` The inode to flush h](j)}(h``struct inode *inode``h]jS)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hThe inode to flushh]hThe inode to flush}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h@``bool flush`` Set to write back rather than simply invalidate. h](j)}(h``bool flush``h]jS)}(hjh]h bool flush}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(h0Set to write back rather than simply invalidate.h]h0Set to write back rather than simply invalidate.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h)``loff_t start`` First byte to in range. h](j)}(h``loff_t start``h]jS)}(hj%h]h loff_t start}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubj)}(hhh]jM)}(hFirst byte to in range.h]hFirst byte to in range.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(h_``loff_t end`` Last byte in range (inclusive), or LLONG_MAX for everything from start onwards. h](j)}(h``loff_t end``h]jS)}(hj^h]h loff_t end}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjXubj)}(hhh]jM)}(hOLast byte in range (inclusive), or LLONG_MAX for everything from start onwards.h]hOLast byte in range (inclusive), or LLONG_MAX for everything from start onwards.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubjM)}(hInvalidate all the folios on an inode that contribute to the specified range, possibly writing them back first. Whilst the operation is undertaken, the invalidate lock is held to prevent new folios from being installed.h]hInvalidate all the folios on an inode that contribute to the specified range, possibly writing them back first. Whilst the operation is undertaken, the invalidate lock is held to prevent new folios from being installed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:61: ./mm/filemap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]filemapah ]h"]filemapah$]h&]uh1hhjhhhhhK;ubh)}(hhh](h)}(h Readaheadh]h Readahead}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKAubjM)}(hXBReadahead is used to read content into the page cache before it is explicitly requested by the application. Readahead only ever attempts to read folios that are not yet in the page cache. If a folio is present but not up-to-date, readahead will not try to read it. In that case a simple ->read_folio() will be requested.h]hXBReadahead is used to read content into the page cache before it is explicitly requested by the application. Readahead only ever attempts to read folios that are not yet in the page cache. If a folio is present but not up-to-date, readahead will not try to read it. In that case a simple ->read_folio() will be requested.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK hjhhubjM)}(hXsReadahead is triggered when an application read request (whether a system call or a page fault) finds that the requested folio is not in the page cache, or that it is in the page cache and has the readahead flag set. This flag indicates that the folio was read as part of a previous readahead request and now that it has been accessed, it is time for the next readahead.h]hXsReadahead is triggered when an application read request (whether a system call or a page fault) finds that the requested folio is not in the page cache, or that it is in the page cache and has the readahead flag set. This flag indicates that the folio was read as part of a previous readahead request and now that it has been accessed, it is time for the next readahead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKhjhhubjM)}(hXEach readahead request is partly synchronous read, and partly async readahead. This is reflected in the struct file_ra_state which contains ->size being the total number of pages, and ->async_size which is the number of pages in the async section. The readahead flag will be set on the first folio in this async section to trigger a subsequent readahead. Once a series of sequential reads has been established, there should be no need for a synchronous component and all readahead request will be fully asynchronous.h]hXEach readahead request is partly synchronous read, and partly async readahead. This is reflected in the struct file_ra_state which contains ->size being the total number of pages, and ->async_size which is the number of pages in the async section. The readahead flag will be set on the first folio in this async section to trigger a subsequent readahead. Once a series of sequential reads has been established, there should be no need for a synchronous component and all readahead request will be fully asynchronous.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKhjhhubjM)}(hWhen either of the triggers causes a readahead, three numbers need to be determined: the start of the region to read, the size of the region, and the size of the async tail.h]hWhen either of the triggers causes a readahead, three numbers need to be determined: the start of the region to read, the size of the region, and the size of the async tail.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK"hjhhubjM)}(hThe start of the region is simply the first page address at or after the accessed address, which is not currently populated in the page cache. This is found with a simple search in the page cache.h]hThe start of the region is simply the first page address at or after the accessed address, which is not currently populated in the page cache. This is found with a simple search in the page cache.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK&hjhhubjM)}(hXAThe size of the async tail is determined by subtracting the size that was explicitly requested from the determined request size, unless this would be less than zero - then zero is used. NOTE THIS CALCULATION IS WRONG WHEN THE START OF THE REGION IS NOT THE ACCESSED PAGE. ALSO THIS CALCULATION IS NOT USED CONSISTENTLY.h]hXAThe size of the async tail is determined by subtracting the size that was explicitly requested from the determined request size, unless this would be less than zero - then zero is used. NOTE THIS CALCULATION IS WRONG WHEN THE START OF THE REGION IS NOT THE ACCESSED PAGE. ALSO THIS CALCULATION IS NOT USED CONSISTENTLY.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK*hjhhubjM)}(hXThe size of the region is normally determined from the size of the previous readahead which loaded the preceding pages. This may be discovered from the struct file_ra_state for simple sequential reads, or from examining the state of the page cache when multiple sequential reads are interleaved. Specifically: where the readahead was triggered by the readahead flag, the size of the previous readahead is assumed to be the number of pages from the triggering page to the start of the new readahead. In these cases, the size of the previous readahead is scaled, often doubled, for the new readahead, though see get_next_ra_size() for details.h]hXThe size of the region is normally determined from the size of the previous readahead which loaded the preceding pages. This may be discovered from the struct file_ra_state for simple sequential reads, or from examining the state of the page cache when multiple sequential reads are interleaved. Specifically: where the readahead was triggered by the readahead flag, the size of the previous readahead is assumed to be the number of pages from the triggering page to the start of the new readahead. In these cases, the size of the previous readahead is scaled, often doubled, for the new readahead, though see get_next_ra_size() for details.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK0hjhhubjM)}(hXgIf the size of the previous read cannot be determined, the number of preceding pages in the page cache is used to estimate the size of a previous read. This estimate could easily be misled by random reads being coincidentally adjacent, so it is ignored unless it is larger than the current request, and it is not scaled up, unless it is at the start of file.h]hXgIf the size of the previous read cannot be determined, the number of preceding pages in the page cache is used to estimate the size of a previous read. This estimate could easily be misled by random reads being coincidentally adjacent, so it is ignored unless it is larger than the current request, and it is not scaled up, unless it is at the start of file.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK;hjhhubjM)}(hIn general readahead is accelerated at the start of the file, as reads from there are often sequential. There are other minor adjustments to the readahead size in various special cases and these are best discovered by reading the code.h]hIn general readahead is accelerated at the start of the file, as reads from there are often sequential. There are other minor adjustments to the readahead size in various special cases and these are best discovered by reading the code.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKBhjhhubjM)}(hThe above calculation, based on the previous readahead size, determines the size of the readahead, to which any requested read size may be added.h]hThe above calculation, based on the previous readahead size, determines the size of the readahead, to which any requested read size may be added.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKGhjhhubjM)}(hXReadahead requests are sent to the filesystem using the ->readahead() address space operation, for which mpage_readahead() is a canonical implementation. ->readahead() should normally initiate reads on all folios, but may fail to read any or all folios without causing an I/O error. The page cache reading code will issue a ->read_folio() request for any folio which ->readahead() did not read, and only an error from this will be final.h]hXReadahead requests are sent to the filesystem using the ->readahead() address space operation, for which mpage_readahead() is a canonical implementation. ->readahead() should normally initiate reads on all folios, but may fail to read any or all folios without causing an I/O error. The page cache reading code will issue a ->read_folio() request for any folio which ->readahead() did not read, and only an error from this will be final.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKKhjhhubjM)}(h->readahead() will generally call readahead_folio() repeatedly to get each folio from those prepared for readahead. It may fail to read a folio by:h]h->readahead() will generally call readahead_folio() repeatedly to get each folio from those prepared for readahead. It may fail to read a folio by:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKShjhhubjaW)}(hhh](j/)}(hnot calling readahead_folio() sufficiently many times, effectively ignoring some folios, as might be appropriate if the path to storage is congested. h]jM)}(hnot calling readahead_folio() sufficiently many times, effectively ignoring some folios, as might be appropriate if the path to storage is congested.h]hnot calling readahead_folio() sufficiently many times, effectively ignoring some folios, as might be appropriate if the path to storage is congested.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKWhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hhfailing to actually submit a read request for a given folio, possibly due to insufficient resources, or h]jM)}(hgfailing to actually submit a read request for a given folio, possibly due to insufficient resources, orh]hgfailing to actually submit a read request for a given folio, possibly due to insufficient resources, or}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chK[hjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hreadahead() should not fail them due to congestion or temporary resource unavailability, but should wait for necessary resources (e.g. memory or indexing information) to become available. Folios in the final ``async_size`` may be considered less urgent and failure to read them is more acceptable. In this case it is best to use filemap_remove_folio() to remove the folios from the page cache as is automatically done for folios that were not fetched with readahead_folio(). This will allow a subsequent synchronous readahead request to try them again. If they are left in the page cache, then they will be read individually using ->read_folio() which may be less efficient.h](hThose folios not in the final }(hjhhhNhNubjS)}(h``async_size``h]h async_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX  of the request should be considered to be important and ->readahead() should not fail them due to congestion or temporary resource unavailability, but should wait for necessary resources (e.g. memory or indexing information) to become available. Folios in the final }(hjhhhNhNubjS)}(h``async_size``h]h async_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhX may be considered less urgent and failure to read them is more acceptable. In this case it is best to use filemap_remove_folio() to remove the folios from the page cache as is automatically done for folios that were not fetched with readahead_folio(). This will allow a subsequent synchronous readahead request to try them again. If they are left in the page cache, then they will be read individually using ->read_folio() which may be less efficient.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:67: ./mm/readahead.chKdhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$page_cache_ra_unbounded (C function)c.page_cache_ra_unboundedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hvvoid page_cache_ra_unbounded (struct readahead_control *ractl, unsigned long nr_to_read, unsigned long lookahead_size)h]h)}(huvoid page_cache_ra_unbounded(struct readahead_control *ractl, unsigned long nr_to_read, unsigned long lookahead_size)h](j)}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhjPhKubh)}(hpage_cache_ra_unboundedh]j)}(hpage_cache_ra_unboundedh]hpage_cache_ra_unbounded}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj>hhhjPhKubj )}(hY(struct readahead_control *ractl, unsigned long nr_to_read, unsigned long lookahead_size)h](j )}(hstruct readahead_control *ractlh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubh)}(hhh]j)}(hreadahead_controlh]hreadahead_control}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljesbc.page_cache_ra_unboundedasbuh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj{ubj)}(hractlh]hractl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjwubj )}(hunsigned long nr_to_readh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h nr_to_readh]h nr_to_read}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjwubj )}(hunsigned long lookahead_sizeh](j)}(hunsignedh]hunsigned}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hlongh]hlong}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hlookahead_sizeh]hlookahead_size}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjwubeh}(h]h ]h"]h$]h&]jjuh1j hj>hhhjPhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj:hhhjPhKubah}(h]j5ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjPhKhj7hhubj4)}(hhh]jM)}(hStart unchecked readahead.h]hStart unchecked readahead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hj7hhhjPhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct readahead_control *ractl`` Readahead control. ``unsigned long nr_to_read`` The number of pages to read. ``unsigned long lookahead_size`` Where to start the next readahead. **Description** This function is for filesystems to call when they want to start readahead beyond a file's stated i_size. This is almost certainly not the function you want to call. Use page_cache_async_readahead() or page_cache_sync_readahead() instead. **Context** File is referenced by caller, and ractl->mapping->invalidate_lock must be held by the caller at least in shared mode. Mutexes may be held by caller. May sleep, but will not reenter filesystem to reclaim memory.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubj)}(hhh](j)}(h7``struct readahead_control *ractl`` Readahead control. h](j)}(h#``struct readahead_control *ractl``h]jS)}(hjh]hstruct readahead_control *ractl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubj)}(hhh]jM)}(hReadahead control.h]hReadahead control.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h:``unsigned long nr_to_read`` The number of pages to read. h](j)}(h``unsigned long nr_to_read``h]jS)}(hjh]hunsigned long nr_to_read}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubj)}(hhh]jM)}(hThe number of pages to read.h]hThe number of pages to read.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hKhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hKhjubj)}(hD``unsigned long lookahead_size`` Where to start the next readahead. h](j)}(h ``unsigned long lookahead_size``h]jS)}(hjWh]hunsigned long lookahead_size}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjQubj)}(hhh]jM)}(h"Where to start the next readahead.h]h"Where to start the next readahead.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhKhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubjM)}(hThis function is for filesystems to call when they want to start readahead beyond a file's stated i_size. This is almost certainly not the function you want to call. Use page_cache_async_readahead() or page_cache_sync_readahead() instead.h]hThis function is for filesystems to call when they want to start readahead beyond a file’s stated i_size. This is almost certainly not the function you want to call. Use page_cache_async_readahead() or page_cache_sync_readahead() instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubjM)}(hFile is referenced by caller, and ractl->mapping->invalidate_lock must be held by the caller at least in shared mode. Mutexes may be held by caller. May sleep, but will not reenter filesystem to reclaim memory.h]hFile is referenced by caller, and ractl->mapping->invalidate_lock must be held by the caller at least in shared mode. Mutexes may be held by caller. May sleep, but will not reenter filesystem to reclaim memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_expand (C function)c.readahead_expandhNtauh1hhjhhhNhNubh)}(hhh](h)}(hYvoid readahead_expand (struct readahead_control *ractl, loff_t new_start, size_t new_len)h]h)}(hXvoid readahead_expand(struct readahead_control *ractl, loff_t new_start, size_t new_len)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubh)}(hreadahead_expandh]j)}(hreadahead_expandh]hreadahead_expand}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMubj )}(hC(struct readahead_control *ractl, loff_t new_start, size_t new_len)h](j )}(hstruct readahead_control *ractlh](j5)}(hj8h]hstruct}(hj;hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj7ubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubh)}(hhh]j)}(hreadahead_controlh]hreadahead_control}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj[modnameN classnameNjpjs)}jv]jy)}jlj!sbc.readahead_expandasbuh1hhj7ubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj7ubj)}(hractlh]hractl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubj )}(hloff_t new_starth](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]juc.readahead_expandasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_starth]h new_start}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubj )}(hsize_t new_lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]juc.readahead_expandasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnew_lenh]hnew_len}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhjhhubj4)}(hhh]jM)}(hExpand a readahead requesth]hExpand a readahead request}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjKhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjfjHjfjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct readahead_control *ractl`` The request to be expanded ``loff_t new_start`` The revised start ``size_t new_len`` The revised size of the request **Description** Attempt to expand a readahead request outwards from the current size to the specified size by inserting locked pages before and after the current window to increase the size to the new window. This may involve the insertion of THPs, in which case the window may get expanded even beyond what was requested. The algorithm will stop if it encounters a conflicting page already in the pagecache and leave a smaller expansion than requested. The caller must check for this by examining the revised **ractl** object for a different expansion than was requested.h](jM)}(h**Parameters**h]j)}(hjph]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjjubj)}(hhh](j)}(h?``struct readahead_control *ractl`` The request to be expanded h](j)}(h#``struct readahead_control *ractl``h]jS)}(hjh]hstruct readahead_control *ractl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjubj)}(hhh]jM)}(hThe request to be expandedh]hThe request to be expanded}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h'``loff_t new_start`` The revised start h](j)}(h``loff_t new_start``h]jS)}(hjh]hloff_t new_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjubj)}(hhh]jM)}(hThe revised starth]hThe revised start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``size_t new_len`` The revised size of the request h](j)}(h``size_t new_len``h]jS)}(hjh]hsize_t new_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjubj)}(hhh]jM)}(hThe revised size of the requesth]hThe revised size of the request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjjubjM)}(h**Description**h]j)}(hj<h]h Description}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjjubjM)}(hX3Attempt to expand a readahead request outwards from the current size to the specified size by inserting locked pages before and after the current window to increase the size to the new window. This may involve the insertion of THPs, in which case the window may get expanded even beyond what was requested.h]hX3Attempt to expand a readahead request outwards from the current size to the specified size by inserting locked pages before and after the current window to increase the size to the new window. This may involve the insertion of THPs, in which case the window may get expanded even beyond what was requested.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjjubjM)}(hThe algorithm will stop if it encounters a conflicting page already in the pagecache and leave a smaller expansion than requested.h]hThe algorithm will stop if it encounters a conflicting page already in the pagecache and leave a smaller expansion than requested.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chM hjjubjM)}(hvThe caller must check for this by examining the revised **ractl** object for a different expansion than was requested.h](h8The caller must check for this by examining the revised }(hjphhhNhNubj)}(h **ractl**h]hractl}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubh5 object for a different expansion than was requested.}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:70: ./mm/readahead.chMhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] readaheadah ]h"] readaheadah$]h&]uh1hhjhhhhhKAubh)}(hhh](h)}(h Writebackh]h Writeback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKJubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#wb_domain_size_changed (C function)c.wb_domain_size_changedhNtauh1hhjhhhNhNubh)}(hhh](h)}(h3void wb_domain_size_changed (struct wb_domain *dom)h]h)}(h2void wb_domain_size_changed(struct wb_domain *dom)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubh)}(hwb_domain_size_changedh]j)}(hwb_domain_size_changedh]hwb_domain_size_changed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKubj )}(h(struct wb_domain *dom)h]j )}(hstruct wb_domain *domh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h wb_domainh]h wb_domain}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj'modnameN classnameNjpjs)}jv]jy)}jljsbc.wb_domain_size_changedasbuh1hhjubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjShhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdomh]hdom}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]jM)}(h+memory available to a wb_domain has changedh]h+memory available to a wb_domain has changed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct wb_domain *dom`` wb_domain of interest **Description** This function should be called when the amount of memory available to **dom** has changed. It resets **dom**'s dirty limit parameters to prevent the past values which don't match the current configuration from skewing dirty throttling. Without this, when memory size of a wb_domain is greatly reduced, the dirty throttling logic may allow too many pages to be dirtied leading to consecutive unnecessary OOMs and may get stuck in that situation.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubj)}(hhh]j)}(h0``struct wb_domain *dom`` wb_domain of interest h](j)}(h``struct wb_domain *dom``h]jS)}(hjh]hstruct wb_domain *dom}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubj)}(hhh]jM)}(hwb_domain of interesth]hwb_domain of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubjM)}(hXThis function should be called when the amount of memory available to **dom** has changed. It resets **dom**'s dirty limit parameters to prevent the past values which don't match the current configuration from skewing dirty throttling. Without this, when memory size of a wb_domain is greatly reduced, the dirty throttling logic may allow too many pages to be dirtied leading to consecutive unnecessary OOMs and may get stuck in that situation.h](hFThis function should be called when the amount of memory available to }(hjhhhNhNubj)}(h**dom**h]hdom}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh has changed. It resets }(hjhhhNhNubj)}(h**dom**h]hdom}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhXU’s dirty limit parameters to prevent the past values which don’t match the current configuration from skewing dirty throttling. Without this, when memory size of a wb_domain is greatly reduced, the dirty throttling logic may allow too many pages to be dirtied leading to consecutive unnecessary OOMs and may get stuck in that situation.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hinode_attach_wb (C function)c.inode_attach_wbhNtauh1hhjhhhNhNubh)}(hhh](h)}(h?void inode_attach_wb (struct inode *inode, struct folio *folio)h]h)}(h>void inode_attach_wb(struct inode *inode, struct folio *folio)h](j)}(hvoidh]hvoid}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhj}hKubh)}(hinode_attach_wbh]j)}(hinode_attach_wbh]hinode_attach_wb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjkhhhj}hKubj )}(h*(struct inode *inode, struct folio *folio)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.inode_attach_wbasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj>modnameN classnameNjpjs)}jv]jc.inode_attach_wbasbuh1hhjubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjkhhhj}hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjghhhj}hKubah}(h]jbah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj}hKhjdhhubj4)}(hhh]jM)}(hassociate an inode with its wbh]hassociate an inode with its wb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjdhhhj}hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX8**Parameters** ``struct inode *inode`` inode of interest ``struct folio *folio`` folio being dirtied (may be NULL) **Description** If **inode** doesn't have its wb, associate it with the wb matching the memcg of **folio** or, if **folio** is NULL, ``current``. May be called w/ or w/o **inode->i_lock**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubj)}(hhh](j)}(h*``struct inode *inode`` inode of interest h](j)}(h``struct inode *inode``h]jS)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubj)}(hhh]jM)}(hinode of interesth]hinode of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h:``struct folio *folio`` folio being dirtied (may be NULL) h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubj)}(hhh]jM)}(h!folio being dirtied (may be NULL)h]h!folio being dirtied (may be NULL)}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hKhj/ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj.hKhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjTh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubjM)}(hIf **inode** doesn't have its wb, associate it with the wb matching the memcg of **folio** or, if **folio** is NULL, ``current``. May be called w/ or w/o **inode->i_lock**.h](hIf }(hjjhhhNhNubj)}(h **inode**h]hinode}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubhG doesn’t have its wb, associate it with the wb matching the memcg of }(hjjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh or, if }(hjjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh is NULL, }(hjjhhhNhNubjS)}(h ``current``h]hcurrent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjjubh. May be called w/ or w/o }(hjjhhhNhNubj)}(h**inode->i_lock**h]h inode->i_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hinode_detach_wb (C function)c.inode_detach_wbhNtauh1hhjhhhNhNubh)}(hhh](h)}(h*void inode_detach_wb (struct inode *inode)h]h)}(h)void inode_detach_wb(struct inode *inode)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hKubh)}(hinode_detach_wbh]j)}(hinode_detach_wbh]hinode_detach_wb}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hKubj )}(h(struct inode *inode)h]j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hj0 hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj, ubj)}(h h]h }(hj= hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj, ubh)}(hhh]j)}(hinodeh]hinode}(hjN hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjP modnameN classnameNjpjs)}jv]jy)}jlj sbc.inode_detach_wbasbuh1hhj, ubj)}(h h]h }(hjn hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj, ubjF )}(hjI h]h*}(hj| hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj, ubj)}(hinodeh]hinode}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj, ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj( ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hKhjhhubj4)}(hhh]jM)}(h!disassociate an inode from its wbh]h!disassociate an inode from its wb}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(h|**Parameters** ``struct inode *inode`` inode of interest **Description** **inode** is being freed. Detach from its wb.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubj)}(hhh]j)}(h*``struct inode *inode`` inode of interest h](j)}(h``struct inode *inode``h]jS)}(hj h]hstruct inode *inode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubj)}(hhh]jM)}(hinode of interesth]hinode of interest}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj/ h]h Description}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj- ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubjM)}(h.**inode** is being freed. Detach from its wb.h](j)}(h **inode**h]hinode}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE ubh% is being freed. Detach from its wb.}(hjE hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hwbc_init_bio (C function)c.wbc_init_biohNtauh1hhjhhhNhNubh)}(hhh](h)}(hBvoid wbc_init_bio (struct writeback_control *wbc, struct bio *bio)h]h)}(hAvoid wbc_init_bio(struct writeback_control *wbc, struct bio *bio)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ hhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ hhhj hKubh)}(h wbc_init_bioh]j)}(h wbc_init_bioh]h wbc_init_bio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj~ hhhj hKubj )}(h0(struct writeback_control *wbc, struct bio *bio)h](j )}(hstruct writeback_control *wbch](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hwriteback_controlh]hwriteback_control}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jlj sbc.wbc_init_bioasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hwbch]hwbc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hstruct bio *bioh](j5)}(hj8h]hstruct}(hj1 hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj- ubj)}(h h]h }(hj> hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubh)}(hhh]j)}(hbioh]hbio}(hjO hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjQ modnameN classnameNjpjs)}jv]j c.wbc_init_bioasbuh1hhj- ubj)}(h h]h }(hjm hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubjF )}(hjI h]h*}(hj{ hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj- ubj)}(hbioh]hbio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj- ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hj~ hhhj hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjz hhhj hKubah}(h]ju ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hKhjw hhubj4)}(hhh]jM)}(h(writeback specific initialization of bioh]h(writeback specific initialization of bio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj hhubah}(h]h ]h"]h$]h&]uh1j3hjw hhhj hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct writeback_control *wbc`` writeback_control for the writeback in progress ``struct bio *bio`` bio to be initialized **Description** **bio** is a part of the writeback in progress controlled by **wbc**. Perform writeback specific initialization. This is used to apply the cgroup writeback context. Must be called after the bio has been associated with a device.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubj)}(hhh](j)}(hR``struct writeback_control *wbc`` writeback_control for the writeback in progress h](j)}(h!``struct writeback_control *wbc``h]jS)}(hj h]hstruct writeback_control *wbc}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubj)}(hhh]jM)}(h/writeback_control for the writeback in progressh]h/writeback_control for the writeback in progress}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(h*``struct bio *bio`` bio to be initialized h](j)}(h``struct bio *bio``h]jS)}(hj, h]hstruct bio *bio}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj* ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj& ubj)}(hhh]jM)}(hbio to be initializedh]hbio to be initialized}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjA hKhjB ubah}(h]h ]h"]h$]h&]uh1jhj& ubeh}(h]h ]h"]h$]h&]uh1jhjA hKhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjg h]h Description}(hji hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubjM)}(h**bio** is a part of the writeback in progress controlled by **wbc**. Perform writeback specific initialization. This is used to apply the cgroup writeback context. Must be called after the bio has been associated with a device.h](j)}(h**bio**h]hbio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj} ubh6 is a part of the writeback in progress controlled by }(hj} hhhNhNubj)}(h**wbc**h]hwbc}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj} ubh. Perform writeback specific initialization. This is used to apply the cgroup writeback context. Must be called after the bio has been associated with a device.}(hj} hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:76: ./include/linux/writeback.hhKhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h2balance_dirty_pages_ratelimited_flags (C function)'c.balance_dirty_pages_ratelimited_flagshNtauh1hhjhhhNhNubh)}(hhh](h)}(h]int balance_dirty_pages_ratelimited_flags (struct address_space *mapping, unsigned int flags)h]h)}(h\int balance_dirty_pages_ratelimited_flags(struct address_space *mapping, unsigned int flags)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubh)}(h%balance_dirty_pages_ratelimited_flagsh]j)}(h%balance_dirty_pages_ratelimited_flagsh]h%balance_dirty_pages_ratelimited_flags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhj hMubj )}(h3(struct address_space *mapping, unsigned int flags)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj' hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj) modnameN classnameNjpjs)}jv]jy)}jlj sb'c.balance_dirty_pages_ratelimited_flagsasbuh1hhj ubj)}(h h]h }(hjG hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjU hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hmappingh]hmapping}(hjb hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned int flagsh](j)}(hunsignedh]hunsigned}(hj{ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw ubj)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw ubj)}(hflagsh]hflags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhj hhubj4)}(hhh]jM)}(hBalance dirty memory state.h]hBalance dirty memory state.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address_space which was dirtied. ``unsigned int flags`` BDP flags. **Description** Processes which are dirtying memory should call in here once for each page which was newly dirtied. The function will periodically check the system's dirty state and will initiate writeback if needed. See balance_dirty_pages_ratelimited() for details. **Return** If **flags** contains BDP_ASYNC, it may return -EAGAIN to indicate that memory is out of balance and the caller must wait for I/O to complete. Otherwise, it will return 0 to indicate that either memory was already in balance, or it was able to sleep until the amount of dirty memory returned to balance.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj ubj)}(hhh](j)}(hC``struct address_space *mapping`` address_space which was dirtied. h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhjubj)}(hhh]jM)}(h address_space which was dirtied.h]h address_space which was dirtied.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjubj)}(h"``unsigned int flags`` BDP flags. h](j)}(h``unsigned int flags``h]jS)}(hjWh]hunsigned int flags}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhjQubj)}(hhh]jM)}(h BDP flags.h]h BDP flags.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhMhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj ubjM)}(hProcesses which are dirtying memory should call in here once for each page which was newly dirtied. The function will periodically check the system's dirty state and will initiate writeback if needed.h]hProcesses which are dirtying memory should call in here once for each page which was newly dirtied. The function will periodically check the system’s dirty state and will initiate writeback if needed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj ubjM)}(h2See balance_dirty_pages_ratelimited() for details.h]h2See balance_dirty_pages_ratelimited() for details.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj ubjM)}(hX0If **flags** contains BDP_ASYNC, it may return -EAGAIN to indicate that memory is out of balance and the caller must wait for I/O to complete. Otherwise, it will return 0 to indicate that either memory was already in balance, or it was able to sleep until the amount of dirty memory returned to balance.h](hIf }(hjhhhNhNubj)}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX$ contains BDP_ASYNC, it may return -EAGAIN to indicate that memory is out of balance and the caller must wait for I/O to complete. Otherwise, it will return 0 to indicate that either memory was already in balance, or it was able to sleep until the amount of dirty memory returned to balance.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h,balance_dirty_pages_ratelimited (C function)!c.balance_dirty_pages_ratelimitedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hDvoid balance_dirty_pages_ratelimited (struct address_space *mapping)h]h)}(hCvoid balance_dirty_pages_ratelimited(struct address_space *mapping)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM)ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj-hM)ubh)}(hbalance_dirty_pages_ratelimitedh]j)}(hbalance_dirty_pages_ratelimitedh]hbalance_dirty_pages_ratelimited}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj-hM)ubj )}(h(struct address_space *mapping)h]j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj\hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(h address_spaceh]h address_space}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj|modnameN classnameNjpjs)}jv]jy)}jljBsb!c.balance_dirty_pages_ratelimitedasbuh1hhjXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjXubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjTubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj-hM)ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj-hM)ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj-hM)hjhhubj4)}(hhh]jM)}(hbalance dirty memory state.h]hbalance dirty memory state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM)hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj-hM)ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address_space which was dirtied. **Description** Processes which are dirtying memory should call in here once for each page which was newly dirtied. The function will periodically check the system's dirty state and will initiate writeback if needed. Once we're over the dirty memory limit we decrease the ratelimiting by a lot, to prevent individual processes from overshooting the limit by (ratelimit_pages) each.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM-hjubj)}(hhh]j)}(hC``struct address_space *mapping`` address_space which was dirtied. h](j)}(h!``struct address_space *mapping``h]jS)}(hj h]hstruct address_space *mapping}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM*hjubj)}(hhh]jM)}(h address_space which was dirtied.h]h address_space which was dirtied.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5hM*hj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj5hM*hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj[h]h Description}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM,hjubjM)}(hProcesses which are dirtying memory should call in here once for each page which was newly dirtied. The function will periodically check the system's dirty state and will initiate writeback if needed.h]hProcesses which are dirtying memory should call in here once for each page which was newly dirtied. The function will periodically check the system’s dirty state and will initiate writeback if needed.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM+hjubjM)}(hOnce we're over the dirty memory limit we decrease the ratelimiting by a lot, to prevent individual processes from overshooting the limit by (ratelimit_pages) each.h]hOnce we’re over the dirty memory limit we decrease the ratelimiting by a lot, to prevent individual processes from overshooting the limit by (ratelimit_pages) each.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM/hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$tag_pages_for_writeback (C function)c.tag_pages_for_writebackhNtauh1hhjhhhNhNubh)}(hhh](h)}(hXvoid tag_pages_for_writeback (struct address_space *mapping, pgoff_t start, pgoff_t end)h]h)}(hWvoid tag_pages_for_writeback(struct address_space *mapping, pgoff_t start, pgoff_t end)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(htag_pages_for_writebackh]j)}(htag_pages_for_writebackh]htag_pages_for_writeback}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h;(struct address_space *mapping, pgoff_t start, pgoff_t end)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jljsbc.tag_pages_for_writebackasbuh1hhjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj8hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjcmodnameN classnameNjpjs)}jv]j&c.tag_pages_for_writebackasbuh1hhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j&c.tag_pages_for_writebackasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h$tag pages to be written by writebackh]h$tag pages to be written by writeback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address space structure to write ``pgoff_t start`` starting page index ``pgoff_t end`` ending page index (inclusive) **Description** This function scans the page range from **start** to **end** (inclusive) and tags all pages that have DIRTY tag set with a special TOWRITE tag. The caller can then use the TOWRITE tag to identify pages eligible for writeback. This mechanism is used to avoid livelocking of writeback by a process steadily creating new dirty pages in the file (thus it is important for this function to be quick so that it can tag pages faster than a dirtying process can create them).h](jM)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh](j)}(hC``struct address_space *mapping`` address space structure to write h](j)}(h!``struct address_space *mapping``h]jS)}(hj@h]hstruct address_space *mapping}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj:ubj)}(hhh]jM)}(h address space structure to writeh]h address space structure to write}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjUhM hjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhjUhM hj7ubj)}(h&``pgoff_t start`` starting page index h](j)}(h``pgoff_t start``h]jS)}(hjyh]h pgoff_t start}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjwubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjsubj)}(hhh]jM)}(hstarting page indexh]hstarting page index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhjhM hj7ubj)}(h.``pgoff_t end`` ending page index (inclusive) h](j)}(h``pgoff_t end``h]jS)}(hjh]h pgoff_t end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(hending page index (inclusive)h]hending page index (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj7ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM! hjubjM)}(hXThis function scans the page range from **start** to **end** (inclusive) and tags all pages that have DIRTY tag set with a special TOWRITE tag. The caller can then use the TOWRITE tag to identify pages eligible for writeback. This mechanism is used to avoid livelocking of writeback by a process steadily creating new dirty pages in the file (thus it is important for this function to be quick so that it can tag pages faster than a dirtying process can create them).h](h(This function scans the page range from }(hjhhhNhNubj)}(h **start**h]hstart}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to }(hjhhhNhNubj)}(h**end**h]hend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX (inclusive) and tags all pages that have DIRTY tag set with a special TOWRITE tag. The caller can then use the TOWRITE tag to identify pages eligible for writeback. This mechanism is used to avoid livelocking of writeback by a process steadily creating new dirty pages in the file (thus it is important for this function to be quick so that it can tag pages faster than a dirtying process can create them).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hwriteback_iter (C function)c.writeback_iterhNtauh1hhjhhhNhNubh)}(hhh](h)}(h}struct folio * writeback_iter (struct address_space *mapping, struct writeback_control *wbc, struct folio *folio, int *error)h]h)}(h{struct folio *writeback_iter(struct address_space *mapping, struct writeback_control *wbc, struct folio *folio, int *error)h](j5)}(hj8h]hstruct}(hjVhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjRhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjchM ubh)}(hhh]j)}(hfolioh]hfolio}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jy)}jlwriteback_itersbc.writeback_iterasbuh1hhjRhhhjchM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjchM ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjRhhhjchM ubh)}(hwriteback_iterh]j)}(hjh]hwriteback_iter}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjRhhhjchM ubj )}(h_(struct address_space *mapping, struct writeback_control *wbc, struct folio *folio, int *error)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.writeback_iterasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct writeback_control *wbch](j5)}(hj8h]hstruct}(hj@hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj<ubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j)}(hwriteback_controlh]hwriteback_control}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj`modnameN classnameNjpjs)}jv]jc.writeback_iterasbuh1hhj<ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj<ubj)}(hwbch]hwbc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.writeback_iterasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h int *errorh](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj<hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(herrorh]herror}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjRhhhjchM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjNhhhjchM ubah}(h]jIah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjchM hjKhhubj4)}(hhh]jM)}(h(iterate folio of a mapping for writebackh]h(iterate folio of a mapping for writeback}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjphhubah}(h]h ]h"]h$]h&]uh1j3hjKhhhjchM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXu**Parameters** ``struct address_space *mapping`` address space structure to write ``struct writeback_control *wbc`` writeback context ``struct folio *folio`` previously iterated folio (``NULL`` to start) ``int *error`` in-out pointer for writeback errors (see below) **Description** This function returns the next folio for the writeback operation described by **wbc** on **mapping** and should be called in a while loop in the ->writepages implementation. To start the writeback operation, ``NULL`` is passed in the **folio** argument, and for every subsequent iteration the folio returned previously should be passed back in. If there was an error in the per-folio writeback inside the writeback_iter() loop, **error** should be set to the error value. Once the writeback described in **wbc** has finished, this function will return ``NULL`` and if there was an error in any iteration restore it to **error**. **Note** callers should not manually break out of the loop using break or goto but must keep calling writeback_iter() until it returns ``NULL``. **Return** the folio to write or ``NULL`` if the loop is done.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh](j)}(hC``struct address_space *mapping`` address space structure to write h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(h address space structure to writeh]h address space structure to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h4``struct writeback_control *wbc`` writeback context h](j)}(h!``struct writeback_control *wbc``h]jS)}(hjh]hstruct writeback_control *wbc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(hwriteback contexth]hwriteback context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hF``struct folio *folio`` previously iterated folio (``NULL`` to start) h](j)}(h``struct folio *folio``h]jS)}(hj&h]hstruct folio *folio}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj$ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj ubj)}(hhh]jM)}(h-previously iterated folio (``NULL`` to start)h](hpreviously iterated folio (}(hj?hhhNhNubjS)}(h``NULL``h]hNULL}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubh to start)}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj;hM hj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hjubj)}(h?``int *error`` in-out pointer for writeback errors (see below) h](j)}(h``int *error``h]jS)}(hjqh]h int *error}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjkubj)}(hhh]jM)}(h/in-out pointer for writeback errors (see below)h]h/in-out pointer for writeback errors (see below)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hThis function returns the next folio for the writeback operation described by **wbc** on **mapping** and should be called in a while loop in the ->writepages implementation.h](hNThis function returns the next folio for the writeback operation described by }(hjhhhNhNubj)}(h**wbc**h]hwbc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on }(hjhhhNhNubj)}(h **mapping**h]hmapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhJ and should be called in a while loop in the ->writepages implementation.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hTo start the writeback operation, ``NULL`` is passed in the **folio** argument, and for every subsequent iteration the folio returned previously should be passed back in.h](h"To start the writeback operation, }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh is passed in the }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhe argument, and for every subsequent iteration the folio returned previously should be passed back in.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(h~If there was an error in the per-folio writeback inside the writeback_iter() loop, **error** should be set to the error value.h](hSIf there was an error in the per-folio writeback inside the writeback_iter() loop, }(hj(hhhNhNubj)}(h **error**h]herror}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubh" should be set to the error value.}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hOnce the writeback described in **wbc** has finished, this function will return ``NULL`` and if there was an error in any iteration restore it to **error**.h](h Once the writeback described in }(hjIhhhNhNubj)}(h**wbc**h]hwbc}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh) has finished, this function will return }(hjIhhhNhNubjS)}(h``NULL``h]hNULL}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjIubh: and if there was an error in any iteration restore it to }(hjIhhhNhNubj)}(h **error**h]herror}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(h**Note**h]j)}(hjh]hNote}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hcallers should not manually break out of the loop using break or goto but must keep calling writeback_iter() until it returns ``NULL``.h](h~callers should not manually break out of the loop using break or goto but must keep calling writeback_iter() until it returns }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(h3the folio to write or ``NULL`` if the loop is done.h](hthe folio to write or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh if the loop is done.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h filemap_dirty_folio (C function)c.filemap_dirty_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hMbool filemap_dirty_folio (struct address_space *mapping, struct folio *folio)h]h)}(hLbool filemap_dirty_folio(struct address_space *mapping, struct folio *folio)h](j)}(hj-h]hbool}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM} ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj-hM} ubh)}(hfilemap_dirty_folioh]j)}(hfilemap_dirty_folioh]hfilemap_dirty_folio}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj-hM} ubj )}(h4(struct address_space *mapping, struct folio *folio)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj\hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(h address_spaceh]h address_space}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj|modnameN classnameNjpjs)}jv]jy)}jljBsbc.filemap_dirty_folioasbuh1hhjXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjXubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjTubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.filemap_dirty_folioasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjTubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj-hM} ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj-hM} ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj-hM} hjhhubj4)}(hhh]jM)}(hAMark a folio dirty for filesystems which do not use buffer_heads.h]hAMark a folio dirty for filesystems which do not use buffer_heads.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM} hjLhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj-hM} ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjgjHjgjIjJjKuh1hhhhjhNhNubj)}(hX~**Parameters** ``struct address_space *mapping`` Address space this folio belongs to. ``struct folio *folio`` Folio to be marked as dirty. **Description** Filesystems which do not use buffer heads should call this function from their dirty_folio address space operation. It ignores the contents of folio_get_private(), so if the filesystem marks individual blocks as dirty, the filesystem should handle that itself. This is also sometimes used by filesystems which use buffer_heads when a single buffer is being dirtied: we want to set the folio dirty in that case, but not all the buffers. This is a "bottom-up" dirtying, whereas block_dirty_folio() is a "top-down" dirtying. The caller must ensure this doesn't race with truncation. Most will simply hold the folio lock, but e.g. zap_pte_range() calls with the folio mapped and the pte lock held, which also locks out truncation.h](jM)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjkubj)}(hhh](j)}(hG``struct address_space *mapping`` Address space this folio belongs to. h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM~ hjubj)}(hhh]jM)}(h$Address space this folio belongs to.h]h$Address space this folio belongs to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM~ hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM~ hjubj)}(h5``struct folio *folio`` Folio to be marked as dirty. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(hFolio to be marked as dirty.h]hFolio to be marked as dirty.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjkubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjkubjM)}(hXFilesystems which do not use buffer heads should call this function from their dirty_folio address space operation. It ignores the contents of folio_get_private(), so if the filesystem marks individual blocks as dirty, the filesystem should handle that itself.h]hXFilesystems which do not use buffer heads should call this function from their dirty_folio address space operation. It ignores the contents of folio_get_private(), so if the filesystem marks individual blocks as dirty, the filesystem should handle that itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjkubjM)}(hXThis is also sometimes used by filesystems which use buffer_heads when a single buffer is being dirtied: we want to set the folio dirty in that case, but not all the buffers. This is a "bottom-up" dirtying, whereas block_dirty_folio() is a "top-down" dirtying.h]hX This is also sometimes used by filesystems which use buffer_heads when a single buffer is being dirtied: we want to set the folio dirty in that case, but not all the buffers. This is a “bottom-up” dirtying, whereas block_dirty_folio() is a “top-down” dirtying.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjkubjM)}(hThe caller must ensure this doesn't race with truncation. Most will simply hold the folio lock, but e.g. zap_pte_range() calls with the folio mapped and the pte lock held, which also locks out truncation.h]hThe caller must ensure this doesn’t race with truncation. Most will simply hold the folio lock, but e.g. zap_pte_range() calls with the folio mapped and the pte lock held, which also locks out truncation.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(folio_redirty_for_writepage (C function)c.folio_redirty_for_writepagehNtauh1hhjhhhNhNubh)}(hhh](h)}(hUbool folio_redirty_for_writepage (struct writeback_control *wbc, struct folio *folio)h]h)}(hTbool folio_redirty_for_writepage(struct writeback_control *wbc, struct folio *folio)h](j)}(hj-h]hbool}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjthM ubh)}(hfolio_redirty_for_writepageh]j)}(hfolio_redirty_for_writepageh]hfolio_redirty_for_writepage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjchhhjthM ubj )}(h4(struct writeback_control *wbc, struct folio *folio)h](j )}(hstruct writeback_control *wbch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hwriteback_controlh]hwriteback_control}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_redirty_for_writepageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hwbch]hwbc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj5modnameN classnameNjpjs)}jv]jc.folio_redirty_for_writepageasbuh1hhjubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj_hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjchhhjthM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj_hhhjthM ubah}(h]jZah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjthM hj\hhubj4)}(hhh]jM)}(hDecline to write a dirty folio.h]hDecline to write a dirty folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hj\hhhjthM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXv**Parameters** ``struct writeback_control *wbc`` The writeback control. ``struct folio *folio`` The folio. **Description** When a writepage implementation decides that it doesn't want to write **folio** for some reason, it should call this function, unlock **folio** and return 0. **Return** True if we redirtied the folio. False if someone else dirtied it first.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh](j)}(h9``struct writeback_control *wbc`` The writeback control. h](j)}(h!``struct writeback_control *wbc``h]jS)}(hjh]hstruct writeback_control *wbc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(hThe writeback control.h]hThe writeback control.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hM hj&ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj%hM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjKh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hWhen a writepage implementation decides that it doesn't want to write **folio** for some reason, it should call this function, unlock **folio** and return 0.h](hHWhen a writepage implementation decides that it doesn’t want to write }(hjahhhNhNubj)}(h **folio**h]hfolio}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh7 for some reason, it should call this function, unlock }(hjahhhNhNubj)}(h **folio**h]hfolio}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh and return 0.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hHTrue if we redirtied the folio. False if someone else dirtied it first.h]hHTrue if we redirtied the folio. False if someone else dirtied it first.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mark_dirty (C function)c.folio_mark_dirtyhNtauh1hhjhhhNhNubh)}(hhh](h)}(h+bool folio_mark_dirty (struct folio *folio)h]h)}(h*bool folio_mark_dirty(struct folio *folio)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hfolio_mark_dirtyh]j)}(hfolio_mark_dirtyh]hfolio_mark_dirty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7modnameN classnameNjpjs)}jv]jy)}jljsbc.folio_mark_dirtyasbuh1hhjubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjchhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(hMark a folio as being modified.h]hMark a folio as being modified.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio. **Description** The folio may not be truncated while this function is running. Holding the folio lock is sufficient to prevent truncation, but some callers cannot acquire a sleeping lock. These callers instead hold the page table lock for a page table which contains at least one page in this folio. Truncation will block on the page table lock as it unmaps pages before removing the folio from its mapping. .. DANGER:: Do not use this on a folio obtained from a function like get_user_pages_fast() without holding appropriate locks; you might want to use set_page_dirty_lock() or folio_mark_dirty_lock() instead. **Return** True if the folio was newly dirtied, false if it was already dirty.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hXThe folio may not be truncated while this function is running. Holding the folio lock is sufficient to prevent truncation, but some callers cannot acquire a sleeping lock. These callers instead hold the page table lock for a page table which contains at least one page in this folio. Truncation will block on the page table lock as it unmaps pages before removing the folio from its mapping.h]hXThe folio may not be truncated while this function is running. Holding the folio lock is sufficient to prevent truncation, but some callers cannot acquire a sleeping lock. These callers instead hold the page table lock for a page table which contains at least one page in this folio. Truncation will block on the page table lock as it unmaps pages before removing the folio from its mapping.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubhdanger)}(hDo not use this on a folio obtained from a function like get_user_pages_fast() without holding appropriate locks; you might want to use set_page_dirty_lock() or folio_mark_dirty_lock() instead.h]jM)}(hDo not use this on a folio obtained from a function like get_user_pages_fast() without holding appropriate locks; you might want to use set_page_dirty_lock() or folio_mark_dirty_lock() instead.h]hDo not use this on a folio obtained from a function like get_user_pages_fast() without holding appropriate locks; you might want to use set_page_dirty_lock() or folio_mark_dirty_lock() instead.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj=ubah}(h]h ]h"]h$]h&]uh1j;hjubjM)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubjM)}(hCTrue if the folio was newly dirtied, false if it was already dirty.h]hCTrue if the folio was newly dirtied, false if it was already dirty.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!folio_wait_writeback (C function)c.folio_wait_writebackhNtauh1hhjhhhNhNubh)}(hhh](h)}(h/void folio_wait_writeback (struct folio *folio)h]h)}(h.void folio_wait_writeback(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hfolio_wait_writebackh]j)}(hfolio_wait_writebackh]hfolio_wait_writeback}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_wait_writebackasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj&hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h%Wait for a folio to finish writeback.h]h%Wait for a folio to finish writeback.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjZhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjujHjujIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to wait for. **Description** If the folio is currently being written back to storage, wait for the I/O to complete. **Context** Sleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjyubj)}(hhh]j)}(h/``struct folio *folio`` The folio to wait for. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjubj)}(hhh]jM)}(hThe folio to wait for.h]hThe folio to wait for.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjyubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjyubjM)}(hVIf the folio is currently being written back to storage, wait for the I/O to complete.h]hVIf the folio is currently being written back to storage, wait for the I/O to complete.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjyubjM)}(h **Context**h]j)}(hj h]hContext}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjyubjM)}(hSleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.h]hSleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*folio_wait_writeback_killable (C function)c.folio_wait_writeback_killablehNtauh1hhjhhhNhNubh)}(hhh](h)}(h7int folio_wait_writeback_killable (struct folio *folio)h]h)}(h6int folio_wait_writeback_killable(struct folio *folio)h](j)}(hinth]hint}(hjE hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hjT hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA hhhjS hM ubh)}(hfolio_wait_writeback_killableh]j)}(hfolio_wait_writeback_killableh]hfolio_wait_writeback_killable}(hjf hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjA hhhjS hM ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ ubh)}(hhh]j)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jljh sbc.folio_wait_writeback_killableasbuh1hhj~ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ ubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj~ ubj)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz ubah}(h]h ]h"]h$]h&]jjuh1j hjA hhhjS hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj= hhhjS hM ubah}(h]j8 ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjS hM hj: hhubj4)}(hhh]jM)}(h%Wait for a folio to finish writeback.h]h%Wait for a folio to finish writeback.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!hhubah}(h]h ]h"]h$]h&]uh1j3hj: hhhjS hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!jHj!jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to wait for. **Description** If the folio is currently being written back to storage, wait for the I/O to complete or a fatal signal to arrive. **Context** Sleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished. **Return** 0 on success, -EINTR if we get a fatal signal while waiting.h](jM)}(h**Parameters**h]j)}(hj'!h]h Parameters}(hj)!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%!ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubj)}(hhh]j)}(h/``struct folio *folio`` The folio to wait for. h](j)}(h``struct folio *folio``h]jS)}(hjF!h]hstruct folio *folio}(hjH!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjD!ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj@!ubj)}(hhh]jM)}(hThe folio to wait for.h]hThe folio to wait for.}(hj_!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[!hM hj\!ubah}(h]h ]h"]h$]h&]uh1jhj@!ubeh}(h]h ]h"]h$]h&]uh1jhj[!hM hj=!ubah}(h]h ]h"]h$]h&]uh1jhj!!ubjM)}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubjM)}(hrIf the folio is currently being written back to storage, wait for the I/O to complete or a fatal signal to arrive.h]hrIf the folio is currently being written back to storage, wait for the I/O to complete or a fatal signal to arrive.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubjM)}(h **Context**h]j)}(hj!h]hContext}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubjM)}(hSleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.h]hSleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubjM)}(h **Return**h]j)}(hj!h]hReturn}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubjM)}(h<0 on success, -EINTR if we get a fatal signal while waiting.h]h<0 on success, -EINTR if we get a fatal signal while waiting.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj!!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_wait_stable (C function)c.folio_wait_stablehNtauh1hhjhhhNhNubh)}(hhh](h)}(h,void folio_wait_stable (struct folio *folio)h]h)}(h+void folio_wait_stable(struct folio *folio)h](j)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM ubj)}(h h]h }(hj#"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj""hM ubh)}(hfolio_wait_stableh]j)}(hfolio_wait_stableh]hfolio_wait_stable}(hj5"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1"ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj"hhhj""hM ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjQ"hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjM"ubj)}(h h]h }(hj^"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM"ubh)}(hhh]j)}(hfolioh]hfolio}(hjo"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl"ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjq"modnameN classnameNjpjs)}jv]jy)}jlj7"sbc.folio_wait_stableasbuh1hhjM"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM"ubjF )}(hjI h]h*}(hj"hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjM"ubj)}(hfolioh]hfolio}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM"ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjI"ubah}(h]h ]h"]h$]h&]jjuh1j hj"hhhj""hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj "hhhj""hM ubah}(h]j"ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj""hM hj "hhubj4)}(hhh]jM)}(h+wait for writeback to finish, if necessary.h]h+wait for writeback to finish, if necessary.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj"hhubah}(h]h ]h"]h$]h&]uh1j3hj "hhhj""hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj"jHj"jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to wait on. **Description** This function determines if the given folio is related to a backing device that requires folio contents to be held stable during writeback. If so, then it will wait for any pending writeback to complete. **Context** Sleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.h](jM)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj"ubj)}(hhh]j)}(h.``struct folio *folio`` The folio to wait on. h](j)}(h``struct folio *folio``h]jS)}(hj#h]hstruct folio *folio}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj#ubj)}(hhh]jM)}(hThe folio to wait on.h]hThe folio to wait on.}(hj.#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*#hM hj+#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj*#hM hj #ubah}(h]h ]h"]h$]h&]uh1jhj"ubjM)}(h**Description**h]j)}(hjP#h]h Description}(hjR#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN#ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj"ubjM)}(hThis function determines if the given folio is related to a backing device that requires folio contents to be held stable during writeback. If so, then it will wait for any pending writeback to complete.h]hThis function determines if the given folio is related to a backing device that requires folio contents to be held stable during writeback. If so, then it will wait for any pending writeback to complete.}(hjf#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj"ubjM)}(h **Context**h]j)}(hjw#h]hContext}(hjy#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju#ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj"ubjM)}(hSleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.h]hSleeps. Must be called in process context and with no spinlocks held. Caller should hold a reference on the folio. If the folio is not locked, writeback may start again after writeback has finished.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:77: ./mm/page-writeback.chM hj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] writebackah ]h"] writebackah$]h&]uh1hhjhhhhhKJubh)}(hhh](h)}(hTruncateh]hTruncate}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hhhhhKQubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_invalidate (C function)c.folio_invalidatehNtauh1hhj#hhhNhNubh)}(hhh](h)}(hIvoid folio_invalidate (struct folio *folio, size_t offset, size_t length)h]h)}(hHvoid folio_invalidate(struct folio *folio, size_t offset, size_t length)h](j)}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chKyubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj#hKyubh)}(hfolio_invalidateh]j)}(hfolio_invalidateh]hfolio_invalidate}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj#hhhj#hKyubj )}(h3(struct folio *folio, size_t offset, size_t length)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj$hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubh)}(hhh]j)}(hfolioh]hfolio}(hj0$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj2$modnameN classnameNjpjs)}jv]jy)}jlj#sbc.folio_invalidateasbuh1hhj$ubj)}(h h]h }(hjP$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubjF )}(hjI h]h*}(hj^$hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj$ubj)}(hfolioh]hfolio}(hjk$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$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&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj$modnameN classnameNjpjs)}jv]jL$c.folio_invalidateasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hoffseth]hoffset}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj $ubj )}(h size_t lengthh](h)}(hhh]j)}(hsize_th]hsize_t}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj$modnameN classnameNjpjs)}jv]jL$c.folio_invalidateasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hlengthh]hlength}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj $ubeh}(h]h ]h"]h$]h&]jjuh1j hj#hhhj#hKyubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj#hhhj#hKyubah}(h]j#ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj#hKyhj#hhubj4)}(hhh]jM)}(h"Invalidate part or all of a folio.h]h"Invalidate part or all of a folio.}(hj%%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chKyhj"%hhubah}(h]h ]h"]h$]h&]uh1j3hj#hhhj#hKyubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj=%jHj=%jIjJjKuh1hhhhj#hNhNubj)}(hX[**Parameters** ``struct folio *folio`` The folio which is affected. ``size_t offset`` start of the range to invalidate ``size_t length`` length of the range to invalidate **Description** folio_invalidate() is called when all or part of the folio has become invalidated by a truncate operation. folio_invalidate() does not have to release all buffers, but it must ensure that no dirty buffer is left outside **offset** and that no I/O is underway against any of the blocks which are outside the truncation point. Because the caller is about to free (and possibly reuse) those blocks on-disk.h](jM)}(h**Parameters**h]j)}(hjG%h]h Parameters}(hjI%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjE%ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chK}hjA%ubj)}(hhh](j)}(h5``struct folio *folio`` The folio which is affected. h](j)}(h``struct folio *folio``h]jS)}(hjf%h]hstruct folio *folio}(hjh%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjd%ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chKzhj`%ubj)}(hhh]jM)}(hThe folio which is affected.h]hThe folio which is affected.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj{%hKzhj|%ubah}(h]h ]h"]h$]h&]uh1jhj`%ubeh}(h]h ]h"]h$]h&]uh1jhj{%hKzhj]%ubj)}(h3``size_t offset`` start of the range to invalidate h](j)}(h``size_t offset``h]jS)}(hj%h]h size_t offset}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chK{hj%ubj)}(hhh]jM)}(h start of the range to invalidateh]h start of the range to invalidate}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hK{hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hK{hj]%ubj)}(h4``size_t length`` length of the range to invalidate h](j)}(h``size_t length``h]jS)}(hj%h]h size_t length}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chK|hj%ubj)}(hhh]jM)}(h!length of the range to invalidateh]h!length of the range to invalidate}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hK|hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hK|hj]%ubeh}(h]h ]h"]h$]h&]uh1jhjA%ubjM)}(h**Description**h]j)}(hj&h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chK~hjA%ubjM)}(hjfolio_invalidate() is called when all or part of the folio has become invalidated by a truncate operation.h]hjfolio_invalidate() is called when all or part of the folio has become invalidated by a truncate operation.}(hj)&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chK}hjA%ubjM)}(hX)folio_invalidate() does not have to release all buffers, but it must ensure that no dirty buffer is left outside **offset** and that no I/O is underway against any of the blocks which are outside the truncation point. Because the caller is about to free (and possibly reuse) those blocks on-disk.h](hqfolio_invalidate() does not have to release all buffers, but it must ensure that no dirty buffer is left outside }(hj8&hhhNhNubj)}(h **offset**h]hoffset}(hj@&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8&ubh and that no I/O is underway against any of the blocks which are outside the truncation point. Because the caller is about to free (and possibly reuse) those blocks on-disk.}(hj8&hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chKhjA%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'truncate_inode_pages_range (C function)c.truncate_inode_pages_rangehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h[void truncate_inode_pages_range (struct address_space *mapping, loff_t lstart, uoff_t lend)h]h)}(hZvoid truncate_inode_pages_range(struct address_space *mapping, loff_t lstart, uoff_t lend)h](j)}(hvoidh]hvoid}(hjy&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju&hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMWubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju&hhhj&hMWubh)}(htruncate_inode_pages_rangeh]j)}(htruncate_inode_pages_rangeh]htruncate_inode_pages_range}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1hhju&hhhj&hMWubj )}(h;(struct address_space *mapping, loff_t lstart, uoff_t lend)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj&hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj&modnameN classnameNjpjs)}jv]jy)}jlj&sbc.truncate_inode_pages_rangeasbuh1hhj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjF )}(hjI h]h*}(hj'hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj&ubj)}(hmappingh]hmapping}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj )}(h loff_t lstarth](h)}(hhh]j)}(hloff_th]hloff_t}(hj+'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj('ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-'modnameN classnameNjpjs)}jv]j&c.truncate_inode_pages_rangeasbuh1hhj$'ubj)}(h h]h }(hjI'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$'ubj)}(hlstarth]hlstart}(hjW'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj )}(h uoff_t lendh](h)}(hhh]j)}(huoff_th]huoff_t}(hjs'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp'ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetju'modnameN classnameNjpjs)}jv]j&c.truncate_inode_pages_rangeasbuh1hhjl'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl'ubj)}(hlendh]hlend}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubeh}(h]h ]h"]h$]h&]jjuh1j hju&hhhj&hMWubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjq&hhhj&hMWubah}(h]jl&ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj&hMWhjn&hhubj4)}(hhh]jM)}(h=truncate range of pages specified by start & end byte offsetsh]h=truncate range of pages specified by start & end byte offsets}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMWhj'hhubah}(h]h ]h"]h$]h&]uh1j3hjn&hhhj&hMWubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj'jHj'jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` mapping to truncate ``loff_t lstart`` offset from which to truncate ``uoff_t lend`` offset to which to truncate (inclusive) **Description** Truncate the page cache, removing the pages that are between specified offsets (and zeroing out partial pages if lstart or lend + 1 is not page aligned). Truncate takes two passes - the first pass is nonblocking. It will not block on page locks and it will not block on writeback. The second pass will wait. This is to prevent as much IO as possible in the affected region. The first pass will remove most pages, so the search cost of the second pass is low. We pass down the cache-hot hint to the page freeing code. Even if the mapping is large, it is probably the case that the final pages are the most recently touched, and freeing happens in ascending file offset order. Note that since ->invalidate_folio() accepts range to invalidate truncate_inode_pages_range is able to handle cases where lend + 1 is not page aligned properly.h](jM)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM[hj'ubj)}(hhh](j)}(h6``struct address_space *mapping`` mapping to truncate h](j)}(h!``struct address_space *mapping``h]jS)}(hj (h]hstruct address_space *mapping}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj(ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMXhj(ubj)}(hhh]jM)}(hmapping to truncateh]hmapping to truncate}(hj#(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(hMXhj (ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMXhj(ubj)}(h0``loff_t lstart`` offset from which to truncate h](j)}(h``loff_t lstart``h]jS)}(hjC(h]h loff_t lstart}(hjE(hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjA(ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMYhj=(ubj)}(hhh]jM)}(hoffset from which to truncateh]hoffset from which to truncate}(hj\(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjX(hMYhjY(ubah}(h]h ]h"]h$]h&]uh1jhj=(ubeh}(h]h ]h"]h$]h&]uh1jhjX(hMYhj(ubj)}(h8``uoff_t lend`` offset to which to truncate (inclusive) h](j)}(h``uoff_t lend``h]jS)}(hj|(h]h uoff_t lend}(hj~(hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjz(ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMZhjv(ubj)}(hhh]jM)}(h'offset to which to truncate (inclusive)h]h'offset to which to truncate (inclusive)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(hMZhj(ubah}(h]h ]h"]h$]h&]uh1jhjv(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMZhj(ubeh}(h]h ]h"]h$]h&]uh1jhj'ubjM)}(h**Description**h]j)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM\hj'ubjM)}(hTruncate the page cache, removing the pages that are between specified offsets (and zeroing out partial pages if lstart or lend + 1 is not page aligned).h]hTruncate the page cache, removing the pages that are between specified offsets (and zeroing out partial pages if lstart or lend + 1 is not page aligned).}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM[hj'ubjM)}(hX3Truncate takes two passes - the first pass is nonblocking. It will not block on page locks and it will not block on writeback. The second pass will wait. This is to prevent as much IO as possible in the affected region. The first pass will remove most pages, so the search cost of the second pass is low.h]hX3Truncate takes two passes - the first pass is nonblocking. It will not block on page locks and it will not block on writeback. The second pass will wait. This is to prevent as much IO as possible in the affected region. The first pass will remove most pages, so the search cost of the second pass is low.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM_hj'ubjM)}(hWe pass down the cache-hot hint to the page freeing code. Even if the mapping is large, it is probably the case that the final pages are the most recently touched, and freeing happens in ascending file offset order.h]hWe pass down the cache-hot hint to the page freeing code. Even if the mapping is large, it is probably the case that the final pages are the most recently touched, and freeing happens in ascending file offset order.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMehj'ubjM)}(hNote that since ->invalidate_folio() accepts range to invalidate truncate_inode_pages_range is able to handle cases where lend + 1 is not page aligned properly.h]hNote that since ->invalidate_folio() accepts range to invalidate truncate_inode_pages_range is able to handle cases where lend + 1 is not page aligned properly.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMihj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!truncate_inode_pages (C function)c.truncate_inode_pageshNtauh1hhj#hhhNhNubh)}(hhh](h)}(hHvoid truncate_inode_pages (struct address_space *mapping, loff_t lstart)h]h)}(hGvoid truncate_inode_pages(struct address_space *mapping, loff_t lstart)h](j)}(hvoidh]hvoid}(hj))hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%)hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMubj)}(h h]h }(hj8)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%)hhhj7)hMubh)}(htruncate_inode_pagesh]j)}(htruncate_inode_pagesh]htruncate_inode_pages}(hjJ)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF)ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj%)hhhj7)hMubj )}(h.(struct address_space *mapping, loff_t lstart)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjf)hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjb)ubj)}(h h]h }(hjs)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb)ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]jy)}jljL)sbc.truncate_inode_pagesasbuh1hhjb)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb)ubjF )}(hjI h]h*}(hj)hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjb)ubj)}(hmappingh]hmapping}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^)ubj )}(h loff_t lstarth](h)}(hhh]j)}(hloff_th]hloff_t}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]j)c.truncate_inode_pagesasbuh1hhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hlstarth]hlstart}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^)ubeh}(h]h ]h"]h$]h&]jjuh1j hj%)hhhj7)hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj!)hhhj7)hMubah}(h]j)ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj7)hMhj)hhubj4)}(hhh]jM)}(h'truncate *all* the pages from an offseth](h truncate }(hj1*hhhNhNubjB)}(h*all*h]hall}(hj9*hhhNhNubah}(h]h ]h"]h$]h&]uh1jAhj1*ubh the pages from an offset}(hj1*hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj.*hhubah}(h]h ]h"]h$]h&]uh1j3hj)hhhj7)hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj[*jHj[*jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` mapping to truncate ``loff_t lstart`` offset from which to truncate **Description** Called under (and serialised by) inode->i_rwsem and mapping->invalidate_lock. **Note** When this function returns, there can be a page in the process of deletion (inside __filemap_remove_folio()) in the specified range. Thus mapping->nrpages can be non-zero when this function returns even after truncation of the whole mapping.h](jM)}(h**Parameters**h]j)}(hje*h]h Parameters}(hjg*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc*ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_*ubj)}(hhh](j)}(h6``struct address_space *mapping`` mapping to truncate h](j)}(h!``struct address_space *mapping``h]jS)}(hj*h]hstruct address_space *mapping}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj*ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj~*ubj)}(hhh]jM)}(hmapping to truncateh]hmapping to truncate}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj~*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj{*ubj)}(h0``loff_t lstart`` offset from which to truncate h](j)}(h``loff_t lstart``h]jS)}(hj*h]h loff_t lstart}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj*ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj*ubj)}(hhh]jM)}(hoffset from which to truncateh]hoffset from which to truncate}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj{*ubeh}(h]h ]h"]h$]h&]uh1jhj_*ubjM)}(h**Description**h]j)}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_*ubjM)}(hMCalled under (and serialised by) inode->i_rwsem and mapping->invalidate_lock.h]hMCalled under (and serialised by) inode->i_rwsem and mapping->invalidate_lock.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_*ubjM)}(h**Note**h]j)}(hj+h]hNote}(hj!+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_*ubjM)}(hWhen this function returns, there can be a page in the process of deletion (inside __filemap_remove_folio()) in the specified range. Thus mapping->nrpages can be non-zero when this function returns even after truncation of the whole mapping.h]hWhen this function returns, there can be a page in the process of deletion (inside __filemap_remove_folio()) in the specified range. Thus mapping->nrpages can be non-zero when this function returns even after truncation of the whole mapping.}(hj5+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'truncate_inode_pages_final (C function)c.truncate_inode_pages_finalhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h?void truncate_inode_pages_final (struct address_space *mapping)h]h)}(h>void truncate_inode_pages_final(struct address_space *mapping)h](j)}(hvoidh]hvoid}(hjd+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`+hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMubj)}(h h]h }(hjs+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`+hhhjr+hMubh)}(htruncate_inode_pages_finalh]j)}(htruncate_inode_pages_finalh]htruncate_inode_pages_final}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj`+hhhjr+hMubj )}(h(struct address_space *mapping)h]j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj+hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj+modnameN classnameNjpjs)}jv]jy)}jlj+sbc.truncate_inode_pages_finalasbuh1hhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj+ubj)}(hmappingh]hmapping}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj+ubah}(h]h ]h"]h$]h&]jjuh1j hj`+hhhjr+hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj\+hhhjr+hMubah}(h]jW+ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjr+hMhjY+hhubj4)}(hhh]jM)}(h&truncate *all* pages before inode diesh](h truncate }(hj$,hhhNhNubjB)}(h*all*h]hall}(hj,,hhhNhNubah}(h]h ]h"]h$]h&]uh1jAhj$,ubh pages before inode dies}(hj$,hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj!,hhubah}(h]h ]h"]h$]h&]uh1j3hjY+hhhjr+hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjN,jHjN,jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` mapping to truncate **Description** Called under (and serialized by) inode->i_rwsem. Filesystems have to use this in the .evict_inode path to inform the VM that this is the final truncate and the inode is going away.h](jM)}(h**Parameters**h]j)}(hjX,h]h Parameters}(hjZ,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV,ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjR,ubj)}(hhh]j)}(h6``struct address_space *mapping`` mapping to truncate h](j)}(h!``struct address_space *mapping``h]jS)}(hjw,h]hstruct address_space *mapping}(hjy,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhju,ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjq,ubj)}(hhh]jM)}(hmapping to truncateh]hmapping to truncate}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhjq,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjn,ubah}(h]h ]h"]h$]h&]uh1jhjR,ubjM)}(h**Description**h]j)}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjR,ubjM)}(h0Called under (and serialized by) inode->i_rwsem.h]h0Called under (and serialized by) inode->i_rwsem.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjR,ubjM)}(hFilesystems have to use this in the .evict_inode path to inform the VM that this is the final truncate and the inode is going away.h]hFilesystems have to use this in the .evict_inode path to inform the VM that this is the final truncate and the inode is going away.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjR,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%invalidate_mapping_pages (C function)c.invalidate_mapping_pageshNtauh1hhj#hhhNhNubh)}(hhh](h)}(hbunsigned long invalidate_mapping_pages (struct address_space *mapping, pgoff_t start, pgoff_t end)h]h)}(haunsigned long invalidate_mapping_pages(struct address_space *mapping, pgoff_t start, pgoff_t end)h](j)}(hunsignedh]hunsigned}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMJubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hMJubj)}(hlongh]hlong}(hj#-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hMJubj)}(h h]h }(hj1-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hMJubh)}(hinvalidate_mapping_pagesh]j)}(hinvalidate_mapping_pagesh]hinvalidate_mapping_pages}(hjC-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?-ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj-hhhj-hMJubj )}(h;(struct address_space *mapping, pgoff_t start, pgoff_t end)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj_-hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj[-ubj)}(h h]h }(hjl-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[-ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj}-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjz-ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-modnameN classnameNjpjs)}jv]jy)}jljE-sbc.invalidate_mapping_pagesasbuh1hhj[-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[-ubjF )}(hjI h]h*}(hj-hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj[-ubj)}(hmappingh]hmapping}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjW-ubj )}(h pgoff_t starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-modnameN classnameNjpjs)}jv]j-c.invalidate_mapping_pagesasbuh1hhj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hstarth]hstart}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjW-ubj )}(h pgoff_t endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.modnameN classnameNjpjs)}jv]j-c.invalidate_mapping_pagesasbuh1hhj.ubj)}(h h]h }(hj:.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hendh]hend}(hjH.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjW-ubeh}(h]h ]h"]h$]h&]jjuh1j hj-hhhj-hMJubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj,hhhj-hMJubah}(h]j,ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj-hMJhj,hhubj4)}(hhh]jM)}(h1Invalidate all clean, unlocked cache of one inodeh]h1Invalidate all clean, unlocked cache of one inode}(hjr.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMJhjo.hhubah}(h]h ]h"]h$]h&]uh1j3hj,hhhj-hMJubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj.jHj.jIjJjKuh1hhhhj#hNhNubj)}(hX<**Parameters** ``struct address_space *mapping`` the address_space which holds the cache to invalidate ``pgoff_t start`` the offset 'from' which to invalidate ``pgoff_t end`` the offset 'to' which to invalidate (inclusive) **Description** This function removes pages that are clean, unmapped and unlocked, as well as shadow entries. It will not block on IO activity. If you want to remove all the pages of one inode, regardless of their use and writeback state, use truncate_inode_pages(). **Return** The number of indices that had their contents invalidatedh](jM)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMNhj.ubj)}(hhh](j)}(hX``struct address_space *mapping`` the address_space which holds the cache to invalidate h](j)}(h!``struct address_space *mapping``h]jS)}(hj.h]hstruct address_space *mapping}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMKhj.ubj)}(hhh]jM)}(h5the address_space which holds the cache to invalidateh]h5the address_space which holds the cache to invalidate}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hMKhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hMKhj.ubj)}(h8``pgoff_t start`` the offset 'from' which to invalidate h](j)}(h``pgoff_t start``h]jS)}(hj.h]h pgoff_t start}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMLhj.ubj)}(hhh]jM)}(h%the offset 'from' which to invalidateh]h)the offset ‘from’ which to invalidate}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMLhj/ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj/hMLhj.ubj)}(h@``pgoff_t end`` the offset 'to' which to invalidate (inclusive) h](j)}(h``pgoff_t end``h]jS)}(hj%/h]h pgoff_t end}(hj'/hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#/ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMMhj/ubj)}(hhh]jM)}(h/the offset 'to' which to invalidate (inclusive)h]h3the offset ‘to’ which to invalidate (inclusive)}(hj>/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:/hMMhj;/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj:/hMMhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.ubjM)}(h**Description**h]j)}(hj`/h]h Description}(hjb/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^/ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMOhj.ubjM)}(hThis function removes pages that are clean, unmapped and unlocked, as well as shadow entries. It will not block on IO activity.h]hThis function removes pages that are clean, unmapped and unlocked, as well as shadow entries. It will not block on IO activity.}(hjv/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMNhj.ubjM)}(hzIf you want to remove all the pages of one inode, regardless of their use and writeback state, use truncate_inode_pages().h]hzIf you want to remove all the pages of one inode, regardless of their use and writeback state, use truncate_inode_pages().}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMQhj.ubjM)}(h **Return**h]j)}(hj/h]hReturn}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMThj.ubjM)}(h9The number of indices that had their contents invalidatedh]h9The number of indices that had their contents invalidated}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMUhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*invalidate_inode_pages2_range (C function)c.invalidate_inode_pages2_rangehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h]int invalidate_inode_pages2_range (struct address_space *mapping, pgoff_t start, pgoff_t end)h]h)}(h\int invalidate_inode_pages2_range(struct address_space *mapping, pgoff_t start, pgoff_t end)h](j)}(hinth]hint}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhj/hMubh)}(hinvalidate_inode_pages2_rangeh]j)}(hinvalidate_inode_pages2_rangeh]hinvalidate_inode_pages2_range}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj/hhhj/hMubj )}(h;(struct address_space *mapping, pgoff_t start, pgoff_t end)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj0hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj0ubj)}(h h]h }(hj%0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj60hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj30ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj80modnameN classnameNjpjs)}jv]jy)}jlj/sbc.invalidate_inode_pages2_rangeasbuh1hhj0ubj)}(h h]h }(hjV0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubjF )}(hjI h]h*}(hjd0hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0ubj)}(hmappingh]hmapping}(hjq0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubj )}(h pgoff_t starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj0modnameN classnameNjpjs)}jv]jR0c.invalidate_inode_pages2_rangeasbuh1hhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hstarth]hstart}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubj )}(h pgoff_t endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj0modnameN classnameNjpjs)}jv]jR0c.invalidate_inode_pages2_rangeasbuh1hhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hendh]hend}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubeh}(h]h ]h"]h$]h&]jjuh1j hj/hhhj/hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj/hhhj/hMubah}(h]j/ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/hMhj/hhubj4)}(hhh]jM)}(h+remove range of pages from an address_spaceh]h+remove range of pages from an address_space}(hj+1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj(1hhubah}(h]h ]h"]h$]h&]uh1j3hj/hhhj/hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjC1jHjC1jIjJjKuh1hhhhj#hNhNubj)}(hXu**Parameters** ``struct address_space *mapping`` the address_space ``pgoff_t start`` the page offset 'from' which to invalidate ``pgoff_t end`` the page offset 'to' which to invalidate (inclusive) **Description** Any pages which are found to be mapped into pagetables are unmapped prior to invalidation. **Return** -EBUSY if any pages could not be invalidated.h](jM)}(h**Parameters**h]j)}(hjM1h]h Parameters}(hjO1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK1ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjG1ubj)}(hhh](j)}(h4``struct address_space *mapping`` the address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjl1h]hstruct address_space *mapping}(hjn1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjj1ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjf1ubj)}(hhh]jM)}(hthe address_spaceh]hthe address_space}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjf1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjc1ubj)}(h=``pgoff_t start`` the page offset 'from' which to invalidate h](j)}(h``pgoff_t start``h]jS)}(hj1h]h pgoff_t start}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj1ubj)}(hhh]jM)}(h*the page offset 'from' which to invalidateh]h.the page offset ‘from’ which to invalidate}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjc1ubj)}(hE``pgoff_t end`` the page offset 'to' which to invalidate (inclusive) h](j)}(h``pgoff_t end``h]jS)}(hj1h]h pgoff_t end}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj1ubj)}(hhh]jM)}(h4the page offset 'to' which to invalidate (inclusive)h]h8the page offset ‘to’ which to invalidate (inclusive)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1hMhj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjc1ubeh}(h]h ]h"]h$]h&]uh1jhjG1ubjM)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjG1ubjM)}(hZAny pages which are found to be mapped into pagetables are unmapped prior to invalidation.h]hZAny pages which are found to be mapped into pagetables are unmapped prior to invalidation.}(hj/2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjG1ubjM)}(h **Return**h]j)}(hj@2h]hReturn}(hjB2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>2ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjG1ubjM)}(h--EBUSY if any pages could not be invalidated.h]h--EBUSY if any pages could not be invalidated.}(hjV2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjG1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$invalidate_inode_pages2 (C function)c.invalidate_inode_pages2hNtauh1hhj#hhhNhNubh)}(hhh](h)}(h;int invalidate_inode_pages2 (struct address_space *mapping)h]h)}(h:int invalidate_inode_pages2(struct address_space *mapping)h](j)}(hinth]hint}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhj2hMubh)}(hinvalidate_inode_pages2h]j)}(hinvalidate_inode_pages2h]hinvalidate_inode_pages2}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj2hhhj2hMubj )}(h(struct address_space *mapping)h]j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj2hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj2modnameN classnameNjpjs)}jv]jy)}jlj2sbc.invalidate_inode_pages2asbuh1hhj2ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubjF )}(hjI h]h*}(hj3hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj2ubj)}(hmappingh]hmapping}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubah}(h]h ]h"]h$]h&]jjuh1j hj2hhhj2hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj}2hhhj2hMubah}(h]jx2ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj2hMhjz2hhubj4)}(hhh]jM)}(h&remove all pages from an address_spaceh]h&remove all pages from an address_space}(hjE3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhjB3hhubah}(h]h ]h"]h$]h&]uh1j3hjz2hhhj2hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj]3jHj]3jIjJjKuh1hhhhj#hNhNubj)}(h**Parameters** ``struct address_space *mapping`` the address_space **Description** Any pages which are found to be mapped into pagetables are unmapped prior to invalidation. **Return** -EBUSY if any pages could not be invalidated.h](jM)}(h**Parameters**h]j)}(hjg3h]h Parameters}(hji3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje3ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhja3ubj)}(hhh]j)}(h4``struct address_space *mapping`` the address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hj3h]hstruct address_space *mapping}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj3ubj)}(hhh]jM)}(hthe address_spaceh]hthe address_space}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hMhj}3ubah}(h]h ]h"]h$]h&]uh1jhja3ubjM)}(h**Description**h]j)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhja3ubjM)}(hZAny pages which are found to be mapped into pagetables are unmapped prior to invalidation.h]hZAny pages which are found to be mapped into pagetables are unmapped prior to invalidation.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhja3ubjM)}(h **Return**h]j)}(hj3h]hReturn}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhja3ubjM)}(h--EBUSY if any pages could not be invalidated.h]h--EBUSY if any pages could not be invalidated.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhja3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htruncate_pagecache (C function)c.truncate_pagecachehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h=void truncate_pagecache (struct inode *inode, loff_t newsize)h]h)}(h6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:6hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM$ubj)}(h h]h }(hjM6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:6hhhjL6hM$ubh)}(htruncate_setsizeh]j)}(htruncate_setsizeh]htruncate_setsize}(hj_6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[6ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj:6hhhjL6hM$ubj )}(h%(struct inode *inode, loff_t newsize)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hj{6hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjw6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw6ubh)}(hhh]j)}(hinodeh]hinode}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj6modnameN classnameNjpjs)}jv]jy)}jlja6sbc.truncate_setsizeasbuh1hhjw6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw6ubjF )}(hjI h]h*}(hj6hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjw6ubj)}(hinodeh]hinode}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjs6ubj )}(hloff_t newsizeh](h)}(hhh]j)}(hloff_th]hloff_t}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj6modnameN classnameNjpjs)}jv]j6c.truncate_setsizeasbuh1hhj6ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hnewsizeh]hnewsize}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjs6ubeh}(h]h ]h"]h$]h&]jjuh1j hj:6hhhjL6hM$ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj66hhhjL6hM$ubah}(h]j16ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjL6hM$hj36hhubj4)}(hhh]jM)}(h.update inode and pagecache for a new file sizeh]h.update inode and pagecache for a new file size}(hjF7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM$hjC7hhubah}(h]h ]h"]h$]h&]uh1j3hj36hhhjL6hM$ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj^7jHj^7jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct inode *inode`` inode ``loff_t newsize`` new file size **Description** truncate_setsize updates i_size and performs pagecache truncation (if necessary) to **newsize**. It will be typically be called from the filesystem's setattr function when ATTR_SIZE is passed in. Must be called with a lock serializing truncates and writes (generally i_rwsem but e.g. xfs uses a different lock) and before all filesystem specific block truncation has been performed.h](jM)}(h**Parameters**h]j)}(hjh7h]h Parameters}(hjj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf7ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM(hjb7ubj)}(hhh](j)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]jS)}(hj7h]hstruct inode *inode}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj7ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM%hj7ubj)}(hhh]jM)}(hinodeh]hinode}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj7hM%hj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hM%hj~7ubj)}(h!``loff_t newsize`` new file size h](j)}(h``loff_t newsize``h]jS)}(hj7h]hloff_t newsize}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj7ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM&hj7ubj)}(hhh]jM)}(h new file sizeh]h new file size}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj7hM&hj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hM&hj~7ubeh}(h]h ]h"]h$]h&]uh1jhjb7ubjM)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM(hjb7ubjM)}(htruncate_setsize updates i_size and performs pagecache truncation (if necessary) to **newsize**. It will be typically be called from the filesystem's setattr function when ATTR_SIZE is passed in.h](hTtruncate_setsize updates i_size and performs pagecache truncation (if necessary) to }(hj8hhhNhNubj)}(h **newsize**h]hnewsize}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubhf. It will be typically be called from the filesystem’s setattr function when ATTR_SIZE is passed in.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM'hjb7ubjM)}(hMust be called with a lock serializing truncates and writes (generally i_rwsem but e.g. xfs uses a different lock) and before all filesystem specific block truncation has been performed.h]hMust be called with a lock serializing truncates and writes (generally i_rwsem but e.g. xfs uses a different lock) and before all filesystem specific block truncation has been performed.}(hj28hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM+hjb7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%pagecache_isize_extended (C function)c.pagecache_isize_extendedhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hKvoid pagecache_isize_extended (struct inode *inode, loff_t from, loff_t to)h]h)}(hJvoid pagecache_isize_extended(struct inode *inode, loff_t from, loff_t to)h](j)}(hvoidh]hvoid}(hja8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]8hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM<ubj)}(h h]h }(hjp8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]8hhhjo8hM<ubh)}(hpagecache_isize_extendedh]j)}(hpagecache_isize_extendedh]hpagecache_isize_extended}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~8ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj]8hhhjo8hM<ubj )}(h-(struct inode *inode, loff_t from, loff_t to)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hj8hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(hinodeh]hinode}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]jy)}jlj8sbc.pagecache_isize_extendedasbuh1hhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubjF )}(hjI h]h*}(hj8hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj8ubj)}(hinodeh]hinode}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj8ubj )}(h loff_t fromh](h)}(hhh]j)}(hloff_th]hloff_t}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]j8c.pagecache_isize_extendedasbuh1hhj 9ubj)}(h h]h }(hj19hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubj)}(hfromh]hfrom}(hj?9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj8ubj )}(h loff_t toh](h)}(hhh]j)}(hloff_th]hloff_t}(hj[9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]9modnameN classnameNjpjs)}jv]j8c.pagecache_isize_extendedasbuh1hhjT9ubj)}(h h]h }(hjy9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT9ubj)}(htoh]hto}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj8ubeh}(h]h ]h"]h$]h&]jjuh1j hj]8hhhjo8hM<ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjY8hhhjo8hM<ubah}(h]jT8ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjo8hM<hjV8hhubj4)}(hhh]jM)}(h*update pagecache after extension of i_sizeh]h*update pagecache after extension of i_size}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM<hj9hhubah}(h]h ]h"]h$]h&]uh1j3hjV8hhhjo8hM<ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj9jHj9jIjJjKuh1hhhhj#hNhNubj)}(hXq**Parameters** ``struct inode *inode`` inode for which i_size was extended ``loff_t from`` original inode size ``loff_t to`` new inode size **Description** Handle extension of inode size either caused by extending truncate or by write starting after current i_size. We mark the page straddling current i_size RO so that page_mkwrite() is called on the first write access to the page. The filesystem will update its per-block information before user writes to the page via mmap after the i_size has been changed. The function must be called after i_size is updated so that page fault coming after we unlock the folio will already see the new i_size. The function must be called while we still hold i_rwsem - this not only makes sure i_size is stable but also that userspace cannot observe new i_size value before we are prepared to store mmap writes at new inode size.h](jM)}(h**Parameters**h]j)}(hj9h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM@hj9ubj)}(hhh](j)}(h<``struct inode *inode`` inode for which i_size was extended h](j)}(h``struct inode *inode``h]jS)}(hj9h]hstruct inode *inode}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj9ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM=hj9ubj)}(hhh]jM)}(h#inode for which i_size was extendedh]h#inode for which i_size was extended}(hj :hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hM=hj:ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhj:hM=hj9ubj)}(h$``loff_t from`` original inode size h](j)}(h``loff_t from``h]jS)}(hj+:h]h loff_t from}(hj-:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj):ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM>hj%:ubj)}(hhh]jM)}(horiginal inode sizeh]horiginal inode size}(hjD:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@:hM>hjA:ubah}(h]h ]h"]h$]h&]uh1jhj%:ubeh}(h]h ]h"]h$]h&]uh1jhj@:hM>hj9ubj)}(h``loff_t to`` new inode size h](j)}(h ``loff_t to``h]jS)}(hjd:h]h loff_t to}(hjf:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjb:ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM?hj^:ubj)}(hhh]jM)}(hnew inode sizeh]hnew inode size}(hj}:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjy:hM?hjz:ubah}(h]h ]h"]h$]h&]uh1jhj^:ubeh}(h]h ]h"]h$]h&]uh1jhjy:hM?hj9ubeh}(h]h ]h"]h$]h&]uh1jhj9ubjM)}(h**Description**h]j)}(hj:h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMAhj9ubjM)}(hXeHandle extension of inode size either caused by extending truncate or by write starting after current i_size. We mark the page straddling current i_size RO so that page_mkwrite() is called on the first write access to the page. The filesystem will update its per-block information before user writes to the page via mmap after the i_size has been changed.h]hXeHandle extension of inode size either caused by extending truncate or by write starting after current i_size. We mark the page straddling current i_size RO so that page_mkwrite() is called on the first write access to the page. The filesystem will update its per-block information before user writes to the page via mmap after the i_size has been changed.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM@hj9ubjM)}(hXcThe function must be called after i_size is updated so that page fault coming after we unlock the folio will already see the new i_size. The function must be called while we still hold i_rwsem - this not only makes sure i_size is stable but also that userspace cannot observe new i_size value before we are prepared to store mmap writes at new inode size.h]hXcThe function must be called after i_size is updated so that page fault coming after we unlock the folio will already see the new i_size. The function must be called while we still hold i_rwsem - this not only makes sure i_size is stable but also that userspace cannot observe new i_size value before we are prepared to store mmap writes at new inode size.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMGhj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%truncate_pagecache_range (C function)c.truncate_pagecache_rangehNtauh1hhj#hhhNhNubh)}(hhh](h)}(hOvoid truncate_pagecache_range (struct inode *inode, loff_t lstart, loff_t lend)h]h)}(hNvoid truncate_pagecache_range(struct inode *inode, loff_t lstart, loff_t lend)h](j)}(hvoidh]hvoid}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM|ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:hhhj;hM|ubh)}(htruncate_pagecache_rangeh]j)}(htruncate_pagecache_rangeh]htruncate_pagecache_range}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj:hhhj;hM|ubj )}(h1(struct inode *inode, loff_t lstart, loff_t lend)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hj0;hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj,;ubj)}(h h]h }(hj=;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,;ubh)}(hhh]j)}(hinodeh]hinode}(hjN;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK;ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjP;modnameN classnameNjpjs)}jv]jy)}jlj;sbc.truncate_pagecache_rangeasbuh1hhj,;ubj)}(h h]h }(hjn;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,;ubjF )}(hjI h]h*}(hj|;hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj,;ubj)}(hinodeh]hinode}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,;ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj(;ubj )}(h loff_t lstarth](h)}(hhh]j)}(hloff_th]hloff_t}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj;modnameN classnameNjpjs)}jv]jj;c.truncate_pagecache_rangeasbuh1hhj;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hlstarth]hlstart}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj(;ubj )}(h loff_t lendh](h)}(hhh]j)}(hloff_th]hloff_t}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj;modnameN classnameNjpjs)}jv]jj;c.truncate_pagecache_rangeasbuh1hhj;ubj)}(h h]h }(hj <hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hlendh]hlend}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj(;ubeh}(h]h ]h"]h$]h&]jjuh1j hj:hhhj;hM|ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj:hhhj;hM|ubah}(h]j:ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj;hM|hj:hhubj4)}(hhh]jM)}(h/unmap and remove pagecache that is hole-punchedh]h/unmap and remove pagecache that is hole-punched}(hjC<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM|hj@<hhubah}(h]h ]h"]h$]h&]uh1j3hj:hhhj;hM|ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj[<jHj[<jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct inode *inode`` inode ``loff_t lstart`` offset of beginning of hole ``loff_t lend`` offset of last byte of hole **Description** This function should typically be called before the filesystem releases resources associated with the freed range (eg. deallocates blocks). This way, pagecache will always stay logically coherent with on-disk format, and the filesystem would not have to deal with situations such as writepage being called for a page that has already had its underlying blocks deallocated.h](jM)}(h**Parameters**h]j)}(hje<h]h Parameters}(hjg<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc<ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_<ubj)}(hhh](j)}(h``struct inode *inode`` inode h](j)}(h``struct inode *inode``h]jS)}(hj<h]hstruct inode *inode}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM}hj~<ubj)}(hhh]jM)}(hinodeh]hinode}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hM}hj<ubah}(h]h ]h"]h$]h&]uh1jhj~<ubeh}(h]h ]h"]h$]h&]uh1jhj<hM}hj{<ubj)}(h.``loff_t lstart`` offset of beginning of hole h](j)}(h``loff_t lstart``h]jS)}(hj<h]h loff_t lstart}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chM~hj<ubj)}(hhh]jM)}(hoffset of beginning of holeh]hoffset of beginning of hole}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hM~hj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hM~hj{<ubj)}(h,``loff_t lend`` offset of last byte of hole h](j)}(h``loff_t lend``h]jS)}(hj<h]h loff_t lend}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj<ubj)}(hhh]jM)}(hoffset of last byte of holeh]hoffset of last byte of hole}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj =hMhj =ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj =hMhj{<ubeh}(h]h ]h"]h$]h&]uh1jhj_<ubjM)}(h**Description**h]j)}(hj1=h]h Description}(hj3=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/=ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_<ubjM)}(hXtThis function should typically be called before the filesystem releases resources associated with the freed range (eg. deallocates blocks). This way, pagecache will always stay logically coherent with on-disk format, and the filesystem would not have to deal with situations such as writepage being called for a page that has already had its underlying blocks deallocated.h]hXtThis function should typically be called before the filesystem releases resources associated with the freed range (eg. deallocates blocks). This way, pagecache will always stay logically coherent with on-disk format, and the filesystem would not have to deal with situations such as writepage being called for a page that has already had its underlying blocks deallocated.}(hjG=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:83: ./mm/truncate.chMhj_<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfilemap_set_wb_err (C function)c.filemap_set_wb_errhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h@void filemap_set_wb_err (struct address_space *mapping, int err)h]h)}(h?void filemap_set_wb_err(struct address_space *mapping, int err)h](j)}(hvoidh]hvoid}(hjv=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr=hhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKEubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr=hhhj=hKEubh)}(hfilemap_set_wb_errh]j)}(hfilemap_set_wb_errh]hfilemap_set_wb_err}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjr=hhhj=hKEubj )}(h((struct address_space *mapping, int err)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj=hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]jy)}jlj=sbc.filemap_set_wb_errasbuh1hhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubjF )}(hjI h]h*}(hj=hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj=ubj)}(hmappingh]hmapping}(hj >hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubj )}(hint errh](j)}(hinth]hint}(hj%>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!>ubj)}(h h]h }(hj3>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!>ubj)}(herrh]herr}(hjA>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubeh}(h]h ]h"]h$]h&]jjuh1j hjr=hhhj=hKEubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjn=hhhj=hKEubah}(h]ji=ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj=hKEhjk=hhubj4)}(hhh]jM)}(h)set a writeback error on an address_spaceh]h)set a writeback error on an address_space}(hjk>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKEhjh>hhubah}(h]h ]h"]h$]h&]uh1j3hjk=hhhj=hKEubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj>jHj>jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` mapping in which to set writeback error ``int err`` error to be set in mapping **Description** When writeback fails in some way, we must record that error so that userspace can be informed when fsync and the like are called. We endeavor to report errors on any file that was open at the time of the error. Some internal callers also need to know when writeback errors have occurred. When a writeback error occurs, most filesystems will want to call filemap_set_wb_err to record the error in the mapping so that it will be automatically reported whenever fsync is called on the file.h](jM)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKIhj>ubj)}(hhh](j)}(hJ``struct address_space *mapping`` mapping in which to set writeback error h](j)}(h!``struct address_space *mapping``h]jS)}(hj>h]hstruct address_space *mapping}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKFhj>ubj)}(hhh]jM)}(h'mapping in which to set writeback errorh]h'mapping in which to set writeback error}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>hKFhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hKFhj>ubj)}(h'``int err`` error to be set in mapping h](j)}(h ``int err``h]jS)}(hj>h]hint err}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKGhj>ubj)}(hhh]jM)}(herror to be set in mappingh]herror to be set in mapping}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>hKGhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hKGhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>ubjM)}(h**Description**h]j)}(hj ?h]h Description}(hj"?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKIhj>ubjM)}(hX!When writeback fails in some way, we must record that error so that userspace can be informed when fsync and the like are called. We endeavor to report errors on any file that was open at the time of the error. Some internal callers also need to know when writeback errors have occurred.h]hX!When writeback fails in some way, we must record that error so that userspace can be informed when fsync and the like are called. We endeavor to report errors on any file that was open at the time of the error. Some internal callers also need to know when writeback errors have occurred.}(hj6?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKHhj>ubjM)}(hWhen a writeback error occurs, most filesystems will want to call filemap_set_wb_err to record the error in the mapping so that it will be automatically reported whenever fsync is called on the file.h]hWhen a writeback error occurs, most filesystems will want to call filemap_set_wb_err to record the error in the mapping so that it will be automatically reported whenever fsync is called on the file.}(hjE?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKMhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!filemap_check_wb_err (C function)c.filemap_check_wb_errhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hHint filemap_check_wb_err (struct address_space *mapping, errseq_t since)h]h)}(hGint filemap_check_wb_err(struct address_space *mapping, errseq_t since)h](j)}(hinth]hint}(hjt?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp?hhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKZubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjp?hhhj?hKZubh)}(hfilemap_check_wb_errh]j)}(hfilemap_check_wb_errh]hfilemap_check_wb_err}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjp?hhhj?hKZubj )}(h/(struct address_space *mapping, errseq_t since)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj?hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj?modnameN classnameNjpjs)}jv]jy)}jlj?sbc.filemap_check_wb_errasbuh1hhj?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubjF )}(hjI h]h*}(hj?hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj?ubj)}(hmappingh]hmapping}(hj @hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj?ubj )}(herrseq_t sinceh](h)}(hhh]j)}(herrseq_th]herrseq_t}(hj&@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj(@modnameN classnameNjpjs)}jv]j?c.filemap_check_wb_errasbuh1hhj@ubj)}(h h]h }(hjD@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hsinceh]hsince}(hjR@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj?ubeh}(h]h ]h"]h$]h&]jjuh1j hjp?hhhj?hKZubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjl?hhhj?hKZubah}(h]jg?ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj?hKZhji?hhubj4)}(hhh]jM)}(h1has an error occurred since the mark was sampled?h]h1has an error occurred since the mark was sampled?}(hj|@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKZhjy@hhubah}(h]h ]h"]h$]h&]uh1j3hji?hhhj?hKZubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj@jHj@jIjJjKuh1hhhhj#hNhNubj)}(hXG**Parameters** ``struct address_space *mapping`` mapping to check for writeback errors ``errseq_t since`` previously-sampled errseq_t **Description** Grab the errseq_t value from the mapping, and see if it has changed "since" the given value was sampled. If it has then report the latest error set, otherwise return 0.h](jM)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhK^hj@ubj)}(hhh](j)}(hH``struct address_space *mapping`` mapping to check for writeback errors h](j)}(h!``struct address_space *mapping``h]jS)}(hj@h]hstruct address_space *mapping}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhK[hj@ubj)}(hhh]jM)}(h%mapping to check for writeback errorsh]h%mapping to check for writeback errors}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hK[hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hK[hj@ubj)}(h/``errseq_t since`` previously-sampled errseq_t h](j)}(h``errseq_t since``h]jS)}(hj@h]herrseq_t since}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhK\hj@ubj)}(hhh]jM)}(hpreviously-sampled errseq_th]hpreviously-sampled errseq_t}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj AhK\hj Aubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj AhK\hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@ubjM)}(h**Description**h]j)}(hj1Ah]h Description}(hj3AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/Aubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhK^hj@ubjM)}(hhGrab the errseq_t value from the mapping, and see if it has changed "since" the given value was sampled.h]hlGrab the errseq_t value from the mapping, and see if it has changed “since” the given value was sampled.}(hjGAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhK]hj@ubjM)}(h?If it has then report the latest error set, otherwise return 0.h]h?If it has then report the latest error set, otherwise return 0.}(hjVAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhK`hj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"filemap_sample_wb_err (C function)c.filemap_sample_wb_errhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h>errseq_t filemap_sample_wb_err (struct address_space *mapping)h]h)}(h=errseq_t filemap_sample_wb_err(struct address_space *mapping)h](h)}(hhh]j)}(herrseq_th]herrseq_t}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjAmodnameN classnameNjpjs)}jv]jy)}jlfilemap_sample_wb_errsbc.filemap_sample_wb_errasbuh1hhjAhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKjubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjAhKjubh)}(hfilemap_sample_wb_errh]j)}(hjAh]hfilemap_sample_wb_err}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1hhjAhhhjAhKjubj )}(h(struct address_space *mapping)h]j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjAhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjAubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubh)}(hhh]j)}(h address_spaceh]h address_space}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjAmodnameN classnameNjpjs)}jv]jAc.filemap_sample_wb_errasbuh1hhjAubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjF )}(hjI h]h*}(hj!BhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjAubj)}(hmappingh]hmapping}(hj.BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubah}(h]h ]h"]h$]h&]jjuh1j hjAhhhjAhKjubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj}AhhhjAhKjubah}(h]jxAah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjAhKjhjzAhhubj4)}(hhh]jM)}(h4sample the current errseq_t to test for later errorsh]h4sample the current errseq_t to test for later errors}(hjXBhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKjhjUBhhubah}(h]h ]h"]h$]h&]uh1j3hjzAhhhjAhKjubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjpBjHjpBjIjJjKuh1hhhhj#hNhNubj)}(h**Parameters** ``struct address_space *mapping`` mapping to be sampled **Description** Writeback errors are always reported relative to a particular sample point in the past. This function provides those sample points.h](jM)}(h**Parameters**h]j)}(hjzBh]h Parameters}(hj|BhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxBubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKnhjtBubj)}(hhh]j)}(h8``struct address_space *mapping`` mapping to be sampled h](j)}(h!``struct address_space *mapping``h]jS)}(hjBh]hstruct address_space *mapping}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjBubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKkhjBubj)}(hhh]jM)}(hmapping to be sampledh]hmapping to be sampled}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjBhKkhjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjBhKkhjBubah}(h]h ]h"]h$]h&]uh1jhjtBubjM)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKmhjtBubjM)}(hWriteback errors are always reported relative to a particular sample point in the past. This function provides those sample points.h]hWriteback errors are always reported relative to a particular sample point in the past. This function provides those sample points.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKlhjtBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfile_sample_sb_err (C function)c.file_sample_sb_errhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h/errseq_t file_sample_sb_err (struct file *file)h]h)}(h.errseq_t file_sample_sb_err(struct file *file)h](h)}(hhh]j)}(herrseq_th]herrseq_t}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjCmodnameN classnameNjpjs)}jv]jy)}jlfile_sample_sb_errsbc.file_sample_sb_errasbuh1hhjChhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKvubj)}(h h]h }(hj>ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhj=ChKvubh)}(hfile_sample_sb_errh]j)}(hj:Ch]hfile_sample_sb_err}(hjPChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLCubah}(h]h ](jjeh"]h$]h&]jjuh1hhjChhhj=ChKvubj )}(h(struct file *file)h]j )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjkChhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjgCubj)}(h h]h }(hjxChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgCubh)}(hhh]j)}(hfileh]hfile}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjCmodnameN classnameNjpjs)}jv]j8Cc.file_sample_sb_errasbuh1hhjgCubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgCubjF )}(hjI h]h*}(hjChhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjgCubj)}(hfileh]hfile}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgCubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcCubah}(h]h ]h"]h$]h&]jjuh1j hjChhhj=ChKvubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjChhhj=ChKvubah}(h]j Cah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj=ChKvhjChhubj4)}(hhh]jM)}(h4sample the current errseq_t to test for later errorsh]h4sample the current errseq_t to test for later errors}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKvhjChhubah}(h]h ]h"]h$]h&]uh1j3hjChhhj=ChKvubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjDjHjDjIjJjKuh1hhhhj#hNhNubj)}(h**Parameters** ``struct file *file`` file pointer to be sampled **Description** Grab the most current superblock-level errseq_t value for the given struct file.h](jM)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Dubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKzhjDubj)}(hhh]j)}(h1``struct file *file`` file pointer to be sampled h](j)}(h``struct file *file``h]jS)}(hj-Dh]hstruct file *file}(hj/DhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj+Dubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKwhj'Dubj)}(hhh]jM)}(hfile pointer to be sampledh]hfile pointer to be sampled}(hjFDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjBDhKwhjCDubah}(h]h ]h"]h$]h&]uh1jhj'Dubeh}(h]h ]h"]h$]h&]uh1jhjBDhKwhj$Dubah}(h]h ]h"]h$]h&]uh1jhjDubjM)}(h**Description**h]j)}(hjhDh]h Description}(hjjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfDubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKyhjDubjM)}(hPGrab the most current superblock-level errseq_t value for the given struct file.h]hPGrab the most current superblock-level errseq_t value for the given struct file.}(hj~DhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKxhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmapping_set_error (C function)c.mapping_set_errorhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hAvoid mapping_set_error (struct address_space *mapping, int error)h]h)}(h@void mapping_set_error(struct address_space *mapping, int error)h](j)}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjDhKubh)}(hmapping_set_errorh]j)}(hmapping_set_errorh]hmapping_set_error}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]jjuh1hhjDhhhjDhKubj )}(h*(struct address_space *mapping, int error)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjDhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjDubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubh)}(hhh]j)}(h address_spaceh]h address_space}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj EmodnameN classnameNjpjs)}jv]jy)}jljDsbc.mapping_set_errorasbuh1hhjDubj)}(h h]h }(hj(EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubjF )}(hjI h]h*}(hj6EhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjDubj)}(hmappingh]hmapping}(hjCEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjDubj )}(h int errorh](j)}(hinth]hint}(hj\EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXEubj)}(h h]h }(hjjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXEubj)}(herrorh]herror}(hjxEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXEubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjDubeh}(h]h ]h"]h$]h&]jjuh1j hjDhhhjDhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjDhhhjDhKubah}(h]jDah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjDhKhjDhhubj4)}(hhh]jM)}(h-record a writeback error in the address_spaceh]h-record a writeback error in the address_space}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjEhhubah}(h]h ]h"]h$]h&]uh1j3hjDhhhjDhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjEjHjEjIjJjKuh1hhhhj#hNhNubj)}(hX|**Parameters** ``struct address_space *mapping`` the mapping in which an error should be set ``int error`` the error to set in the mapping **Description** When writeback fails in some way, we must record that error so that userspace can be informed when fsync and the like are called. We endeavor to report errors on any file that was open at the time of the error. Some internal callers also need to know when writeback errors have occurred. When a writeback error occurs, most filesystems will want to call mapping_set_error to record the error in the mapping so that it can be reported when the application calls fsync(2).h](jM)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjEubj)}(hhh](j)}(hN``struct address_space *mapping`` the mapping in which an error should be set h](j)}(h!``struct address_space *mapping``h]jS)}(hjEh]hstruct address_space *mapping}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjEubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjEubj)}(hhh]jM)}(h+the mapping in which an error should be seth]h+the mapping in which an error should be set}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjEhKhjEubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhjEhKhjEubj)}(h.``int error`` the error to set in the mapping h](j)}(h ``int error``h]jS)}(hjFh]h int error}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjFubj)}(hhh]jM)}(hthe error to set in the mappingh]hthe error to set in the mapping}(hj5FhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1FhKhj2Fubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhj1FhKhjEubeh}(h]h ]h"]h$]h&]uh1jhjEubjM)}(h**Description**h]j)}(hjWFh]h Description}(hjYFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUFubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjEubjM)}(hX!When writeback fails in some way, we must record that error so that userspace can be informed when fsync and the like are called. We endeavor to report errors on any file that was open at the time of the error. Some internal callers also need to know when writeback errors have occurred.h]hX!When writeback fails in some way, we must record that error so that userspace can be informed when fsync and the like are called. We endeavor to report errors on any file that was open at the time of the error. Some internal callers also need to know when writeback errors have occurred.}(hjmFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjEubjM)}(hWhen a writeback error occurs, most filesystems will want to call mapping_set_error to record the error in the mapping so that it can be reported when the application calls fsync(2).h]hWhen a writeback error occurs, most filesystems will want to call mapping_set_error to record the error in the mapping so that it can be reported when the application calls fsync(2).}(hj|FhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhKhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%mapping_set_large_folios (C function)c.mapping_set_large_folioshNtauh1hhj#hhhNhNubh)}(hhh](h)}(h=void mapping_set_large_folios (struct address_space *mapping)h]h)}(hJh]h Description}(hj@JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjstruct address_space *folio_flush_mapping(struct folio *folio)h](j5)}(hj8h]hstruct}(hjELhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjALhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM(ubj)}(h h]h }(hjSLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjALhhhjRLhM(ubh)}(hhh]j)}(h address_spaceh]h address_space}(hjdLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaLubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjfLmodnameN classnameNjpjs)}jv]jy)}jlfolio_flush_mappingsbc.folio_flush_mappingasbuh1hhjALhhhjRLhM(ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjALhhhjRLhM(ubjF )}(hjI h]h*}(hjLhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjALhhhjRLhM(ubh)}(hfolio_flush_mappingh]j)}(hjLh]hfolio_flush_mapping}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ](jjeh"]h$]h&]jjuh1hhjALhhhjRLhM(ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjLhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjLubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubh)}(hhh]j)}(hfolioh]hfolio}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjLmodnameN classnameNjpjs)}jv]jLc.folio_flush_mappingasbuh1hhjLubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubjF )}(hjI h]h*}(hj MhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjLubj)}(hfolioh]hfolio}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubah}(h]h ]h"]h$]h&]jjuh1j hjALhhhjRLhM(ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj=LhhhjRLhM(ubah}(h]j8Lah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjRLhM(hj:Lhhubj4)}(hhh]jM)}(h,Find the file mapping this folio belongs to.h]h,Find the file mapping this folio belongs to.}(hj@MhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM(hj=Mhhubah}(h]h ]h"]h$]h&]uh1j3hj:LhhhjRLhM(ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjXMjHjXMjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio. **Description** For folios which are in the page cache, return the mapping that this page belongs to. Anonymous folios return NULL, even if they're in the swap cache. Other kinds of folio also return NULL. This is ONLY used by architecture cache flushing code. If you aren't writing cache flushing code, you want either folio_mapping() or folio_file_mapping().h](jM)}(h**Parameters**h]j)}(hjbMh]h Parameters}(hjdMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`Mubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM,hj\Mubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjMh]hstruct folio *folio}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjMubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM)hj{Mubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjMhM)hjMubah}(h]h ]h"]h$]h&]uh1jhj{Mubeh}(h]h ]h"]h$]h&]uh1jhjMhM)hjxMubah}(h]h ]h"]h$]h&]uh1jhj\MubjM)}(h**Description**h]j)}(hjMh]h Description}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM+hj\MubjM)}(hFor folios which are in the page cache, return the mapping that this page belongs to. Anonymous folios return NULL, even if they're in the swap cache. Other kinds of folio also return NULL.h]hFor folios which are in the page cache, return the mapping that this page belongs to. Anonymous folios return NULL, even if they’re in the swap cache. Other kinds of folio also return NULL.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM*hj\MubjM)}(hThis is ONLY used by architecture cache flushing code. If you aren't writing cache flushing code, you want either folio_mapping() or folio_file_mapping().h]hThis is ONLY used by architecture cache flushing code. If you aren’t writing cache flushing code, you want either folio_mapping() or folio_file_mapping().}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM.hj\Mubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_inode (C function) c.folio_inodehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h0struct inode * folio_inode (struct folio *folio)h]h)}(h.struct inode *folio_inode(struct folio *folio)h](j5)}(hj8h]hstruct}(hjNhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj NhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM<ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj NhhhjNhM<ubh)}(hhh]j)}(hinodeh]hinode}(hj/NhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,Nubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1NmodnameN classnameNjpjs)}jv]jy)}jl folio_inodesb c.folio_inodeasbuh1hhj NhhhjNhM<ubj)}(h h]h }(hjPNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj NhhhjNhM<ubjF )}(hjI h]h*}(hj^NhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj NhhhjNhM<ubh)}(h folio_inodeh]j)}(hjMNh]h folio_inode}(hjoNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkNubah}(h]h ](jjeh"]h$]h&]jjuh1hhj NhhhjNhM<ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjNhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubh)}(hhh]j)}(hfolioh]hfolio}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjNmodnameN classnameNjpjs)}jv]jKN c.folio_inodeasbuh1hhjNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubjF )}(hjI h]h*}(hjNhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjNubj)}(hfolioh]hfolio}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjNubah}(h]h ]h"]h$]h&]jjuh1j hj NhhhjNhM<ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjNhhhjNhM<ubah}(h]jNah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjNhM<hjNhhubj4)}(hhh]jM)}(h"Get the host inode for this folio.h]h"Get the host inode for this folio.}(hj OhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM<hjOhhubah}(h]h ]h"]h$]h&]uh1j3hjNhhhjNhM<ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj#OjHj#OjIjJjKuh1hhhhj#hNhNubj)}(h**Parameters** ``struct folio *folio`` The folio. **Description** For folios which are in the page cache, return the inode that this folio belongs to. Do not call this for folios which aren't in the page cache.h](jM)}(h**Parameters**h]j)}(hj-Oh]h Parameters}(hj/OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Oubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM@hj'Oubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjLOh]hstruct folio *folio}(hjNOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjJOubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM=hjFOubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjeOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjaOhM=hjbOubah}(h]h ]h"]h$]h&]uh1jhjFOubeh}(h]h ]h"]h$]h&]uh1jhjaOhM=hjCOubah}(h]h ]h"]h$]h&]uh1jhj'OubjM)}(h**Description**h]j)}(hjOh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM?hj'OubjM)}(hTFor folios which are in the page cache, return the inode that this folio belongs to.h]hTFor folios which are in the page cache, return the inode that this folio belongs to.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM>hj'OubjM)}(h;Do not call this for folios which aren't in the page cache.h]h=Do not call this for folios which aren’t in the page cache.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMAhj'Oubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!folio_attach_private (C function)c.folio_attach_privatehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h;void folio_attach_private (struct folio *folio, void *data)h]h)}(h:void folio_attach_private(struct folio *folio, void *data)h](j)}(hvoidh]hvoid}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMJubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjOhMJubh)}(hfolio_attach_privateh]j)}(hfolio_attach_privateh]hfolio_attach_private}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1hhjOhhhjOhMJubj )}(h!(struct folio *folio, void *data)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjPhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjPubj)}(h h]h }(hj%PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubh)}(hhh]j)}(hfolioh]hfolio}(hj6PhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3Pubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8PmodnameN classnameNjpjs)}jv]jy)}jljOsbc.folio_attach_privateasbuh1hhjPubj)}(h h]h }(hjVPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubjF )}(hjI h]h*}(hjdPhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjPubj)}(hfolioh]hfolio}(hjqPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubj )}(h void *datah](j)}(hvoidh]hvoid}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubjF )}(hjI h]h*}(hjPhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjPubj)}(hdatah]hdata}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubeh}(h]h ]h"]h$]h&]jjuh1j hjOhhhjOhMJubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjOhhhjOhMJubah}(h]jOah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjOhMJhjOhhubj4)}(hhh]jM)}(hAttach private data to a folio.h]hAttach private data to a folio.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMJhjPhhubah}(h]h ]h"]h$]h&]uh1j3hjOhhhjOhMJubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjPjHjPjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct folio *folio`` Folio to attach data to. ``void *data`` Data to attach to folio. **Description** Attaching private data to a folio increments the page's reference count. The data must be detached before the folio will be freed.h](jM)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMNhjPubj)}(hhh](j)}(h1``struct folio *folio`` Folio to attach data to. h](j)}(h``struct folio *folio``h]jS)}(hjQh]hstruct folio *folio}(hj QhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMKhjQubj)}(hhh]jM)}(hFolio to attach data to.h]hFolio to attach data to.}(hj7QhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3QhMKhj4Qubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhj3QhMKhjQubj)}(h(``void *data`` Data to attach to folio. h](j)}(h``void *data``h]jS)}(hjWQh]h void *data}(hjYQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUQubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMLhjQQubj)}(hhh]jM)}(hData to attach to folio.h]hData to attach to folio.}(hjpQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlQhMLhjmQubah}(h]h ]h"]h$]h&]uh1jhjQQubeh}(h]h ]h"]h$]h&]uh1jhjlQhMLhjQubeh}(h]h ]h"]h$]h&]uh1jhjPubjM)}(h**Description**h]j)}(hjQh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMNhjPubjM)}(hAttaching private data to a folio increments the page's reference count. The data must be detached before the folio will be freed.h]hAttaching private data to a folio increments the page’s reference count. The data must be detached before the folio will be freed.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMMhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!folio_change_private (C function)c.folio_change_privatehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h=void * folio_change_private (struct folio *folio, void *data)h]h)}(h;void *folio_change_private(struct folio *folio, void *data)h](j)}(hvoidh]hvoid}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMYubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQhhhjQhMYubjF )}(hjI h]h*}(hjQhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjQhhhjQhMYubh)}(hfolio_change_privateh]j)}(hfolio_change_privateh]hfolio_change_private}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]jjuh1hhjQhhhjQhMYubj )}(h!(struct folio *folio, void *data)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj!RhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjRubj)}(h h]h }(hj.RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubh)}(hhh]j)}(hfolioh]hfolio}(hj?RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj``struct address_space *mapping`` The address space to search h](j)}(h!``struct address_space *mapping``h]jS)}(hjch]hstruct address_space *mapping}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM<hjcubj)}(hhh]jM)}(hThe address space to searchh]hThe address space to search}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjchM<hjcubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjchM<hjcubj)}(h!``pgoff_t index`` The page index h](j)}(h``pgoff_t index``h]jS)}(hjch]h pgoff_t index}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM=hjcubj)}(hhh]jM)}(hThe page indexh]hThe page index}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdhM=hjdubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjdhM=hjcubeh}(h]h ]h"]h$]h&]uh1jhjcubjM)}(h**Description**h]j)}(hj'dh]h Description}(hj)dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%dubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM?hjcubjM)}(hLooks up the page cache entry at **mapping** & **index**. If no folio is found, a new folio is created. The folio is locked, marked as accessed, and returned.h](h!Looks up the page cache entry at }(hj=dhhhNhNubj)}(h **mapping**h]hmapping}(hjEdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=dubh & }(hj=dhhhNhNubj)}(h **index**h]hindex}(hjWdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=dubhf. If no folio is found, a new folio is created. The folio is locked, marked as accessed, and returned.}(hj=dhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM>hjcubjM)}(h **Return**h]j)}(hjrdh]hReturn}(hjtdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpdubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMBhjcubjM)}(h]A found or created folio. ERR_PTR(-ENOMEM) if no folio is found and failed to create a folio.h]h]A found or created folio. ERR_PTR(-ENOMEM) if no folio is found and failed to create a folio.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMChjcubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfind_get_page (C function)c.find_get_pagehNtauh1hhj#hhhNhNubh)}(hhh](h)}(hKstruct page * find_get_page (struct address_space *mapping, pgoff_t offset)h]h)}(hIstruct page *find_get_page(struct address_space *mapping, pgoff_t offset)h](j5)}(hj8h]hstruct}(hjdhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjdhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMOubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhjdhMOubh)}(hhh]j)}(hpageh]hpage}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjdmodnameN classnameNjpjs)}jv]jy)}jl find_get_pagesbc.find_get_pageasbuh1hhjdhhhjdhMOubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdhhhjdhMOubjF )}(hjI h]h*}(hjehhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjdhhhjdhMOubh)}(h find_get_pageh]j)}(hjdh]h find_get_page}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1hhjdhhhjdhMOubj )}(h/(struct address_space *mapping, pgoff_t offset)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj1ehhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj-eubj)}(h h]h }(hj>ehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-eubh)}(hhh]j)}(h address_spaceh]h address_space}(hjOehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLeubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjQemodnameN classnameNjpjs)}jv]jdc.find_get_pageasbuh1hhj-eubj)}(h h]h }(hjmehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-eubjF )}(hjI h]h*}(hj{ehhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj-eubj)}(hmappingh]hmapping}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-eubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj)eubj )}(hpgoff_t offseth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjemodnameN classnameNjpjs)}jv]jdc.find_get_pageasbuh1hhjeubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(hoffseth]hoffset}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj)eubeh}(h]h ]h"]h$]h&]jjuh1j hjdhhhjdhMOubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjdhhhjdhMOubah}(h]jdah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjdhMOhjdhhubj4)}(hhh]jM)}(hfind and get a page referenceh]hfind and get a page reference}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMOhjehhubah}(h]h ]h"]h$]h&]uh1j3hjdhhhjdhMOubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjfjHjfjIjJjKuh1hhhhj#hNhNubj)}(hX-**Parameters** ``struct address_space *mapping`` the address_space to search ``pgoff_t offset`` the page index **Description** Looks up the page cache slot at **mapping** & **offset**. If there is a page cache page, it is returned with an increased refcount. Otherwise, ``NULL`` is returned.h](jM)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMShjfubj)}(hhh](j)}(h>``struct address_space *mapping`` the address_space to search h](j)}(h!``struct address_space *mapping``h]jS)}(hj;fh]hstruct address_space *mapping}(hj=fhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj9fubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMPhj5fubj)}(hhh]jM)}(hthe address_space to searchh]hthe address_space to search}(hjTfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjPfhMPhjQfubah}(h]h ]h"]h$]h&]uh1jhj5fubeh}(h]h ]h"]h$]h&]uh1jhjPfhMPhj2fubj)}(h"``pgoff_t offset`` the page index h](j)}(h``pgoff_t offset``h]jS)}(hjtfh]hpgoff_t offset}(hjvfhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjrfubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMQhjnfubj)}(hhh]jM)}(hthe page indexh]hthe page index}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjfhMQhjfubah}(h]h ]h"]h$]h&]uh1jhjnfubeh}(h]h ]h"]h$]h&]uh1jhjfhMQhj2fubeh}(h]h ]h"]h$]h&]uh1jhjfubjM)}(h**Description**h]j)}(hjfh]h Description}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMShjfubjM)}(hLooks up the page cache slot at **mapping** & **offset**. If there is a page cache page, it is returned with an increased refcount.h](h Looks up the page cache slot at }(hjfhhhNhNubj)}(h **mapping**h]hmapping}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubh & }(hjfhhhNhNubj)}(h **offset**h]hoffset}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubhL. If there is a page cache page, it is returned with an increased refcount.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMRhjfubjM)}(h Otherwise, ``NULL`` is returned.h](h Otherwise, }(hjfhhhNhNubjS)}(h``NULL``h]hNULL}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjfubh is returned.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMUhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfind_lock_page (C function)c.find_lock_pagehNtauh1hhj#hhhNhNubh)}(hhh](h)}(hKstruct page * find_lock_page (struct address_space *mapping, pgoff_t index)h]h)}(hIstruct page *find_lock_page(struct address_space *mapping, pgoff_t index)h](j5)}(hj8h]hstruct}(hj9ghhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj5ghhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMeubj)}(h h]h }(hjGghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ghhhjFghMeubh)}(hhh]j)}(hpageh]hpage}(hjXghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUgubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjZgmodnameN classnameNjpjs)}jv]jy)}jlfind_lock_pagesbc.find_lock_pageasbuh1hhj5ghhhjFghMeubj)}(h h]h }(hjyghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ghhhjFghMeubjF )}(hjI h]h*}(hjghhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj5ghhhjFghMeubh)}(hfind_lock_pageh]j)}(hjvgh]hfind_lock_page}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1hhj5ghhhjFghMeubj )}(h.(struct address_space *mapping, pgoff_t index)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjghhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjgubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubh)}(hhh]j)}(h address_spaceh]h address_space}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjgmodnameN classnameNjpjs)}jv]jtgc.find_lock_pageasbuh1hhjgubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubjF )}(hjI h]h*}(hjghhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjgubj)}(hmappingh]hmapping}(hj hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjgubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj&hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj(hmodnameN classnameNjpjs)}jv]jtgc.find_lock_pageasbuh1hhjhubj)}(h h]h }(hjDhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hindexh]hindex}(hjRhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjgubeh}(h]h ]h"]h$]h&]jjuh1j hj5ghhhjFghMeubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj1ghhhjFghMeubah}(h]j,gah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjFghMehj.ghhubj4)}(hhh]jM)}(h%locate, pin and lock a pagecache pageh]h%locate, pin and lock a pagecache page}(hj|hhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMehjyhhhubah}(h]h ]h"]h$]h&]uh1j3hj.ghhhjFghMeubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjhjHjhjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` the address_space to search ``pgoff_t index`` the page index **Description** Looks up the page cache entry at **mapping** & **index**. If there is a page cache page, it is returned locked and with an increased refcount. **Context** May sleep. **Return** A struct page or ``NULL`` if there is no page in the cache for this index.h](jM)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMihjhubj)}(hhh](j)}(h>``struct address_space *mapping`` the address_space to search h](j)}(h!``struct address_space *mapping``h]jS)}(hjhh]hstruct address_space *mapping}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMfhjhubj)}(hhh]jM)}(hthe address_space to searchh]hthe address_space to search}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhMfhjhubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhhMfhjhubj)}(h!``pgoff_t index`` the page index h](j)}(h``pgoff_t index``h]jS)}(hjhh]h pgoff_t index}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMghjhubj)}(hhh]jM)}(hthe page indexh]hthe page index}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ihMghj iubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhj ihMghjhubeh}(h]h ]h"]h$]h&]uh1jhjhubjM)}(h**Description**h]j)}(hj1ih]h Description}(hj3ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/iubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMihjhubjM)}(hLooks up the page cache entry at **mapping** & **index**. If there is a page cache page, it is returned locked and with an increased refcount.h](h!Looks up the page cache entry at }(hjGihhhNhNubj)}(h **mapping**h]hmapping}(hjOihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGiubh & }(hjGihhhNhNubj)}(h **index**h]hindex}(hjaihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGiubhW. If there is a page cache page, it is returned locked and with an increased refcount.}(hjGihhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhhjhubjM)}(h **Context**h]j)}(hj|ih]hContext}(hj~ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjziubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMlhjhubjM)}(h May sleep.h]h May sleep.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMmhjhubjM)}(h **Return**h]j)}(hjih]hReturn}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMohjhubjM)}(hJA struct page or ``NULL`` if there is no page in the cache for this index.h](hA struct page or }(hjihhhNhNubjS)}(h``NULL``h]hNULL}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiubh1 if there is no page in the cache for this index.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMnhjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h find_or_create_page (C function)c.find_or_create_pagehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h`struct page * find_or_create_page (struct address_space *mapping, pgoff_t index, gfp_t gfp_mask)h]h)}(h^struct page *find_or_create_page(struct address_space *mapping, pgoff_t index, gfp_t gfp_mask)h](j5)}(hj8h]hstruct}(hjihhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjihhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMxubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjihhhjjhMxubh)}(hhh]j)}(hpageh]hpage}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]jy)}jlfind_or_create_pagesbc.find_or_create_pageasbuh1hhjihhhjjhMxubj)}(h h]h }(hj:jhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjihhhjjhMxubjF )}(hjI h]h*}(hjHjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjihhhjjhMxubh)}(hfind_or_create_pageh]j)}(hj7jh]hfind_or_create_page}(hjYjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjihhhjjhMxubj )}(h>(struct address_space *mapping, pgoff_t index, gfp_t gfp_mask)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjtjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjpjubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]j5jc.find_or_create_pageasbuh1hhjpjubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpjubjF )}(hjI h]h*}(hjjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjpjubj)}(hmappingh]hmapping}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjljubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]j5jc.find_or_create_pageasbuh1hhjjubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(hindexh]hindex}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjljubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj/khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,kubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1kmodnameN classnameNjpjs)}jv]j5jc.find_or_create_pageasbuh1hhj(kubj)}(h h]h }(hjMkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(kubj)}(hgfp_maskh]hgfp_mask}(hj[khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(kubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjljubeh}(h]h ]h"]h$]h&]jjuh1j hjihhhjjhMxubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjihhhjjhMxubah}(h]jiah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjjhMxhjihhubj4)}(hhh]jM)}(hlocate or add a pagecache pageh]hlocate or add a pagecache page}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMxhjkhhubah}(h]h ]h"]h$]h&]uh1j3hjihhhjjhMxubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjkjHjkjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` the page's address_space ``pgoff_t index`` the page's index into the mapping ``gfp_t gfp_mask`` page allocation mode **Description** Looks up the page cache slot at **mapping** & **offset**. If there is a page cache page, it is returned locked and with an increased refcount. If the page is not present, a new page is allocated using **gfp_mask** and added to the page cache and the VM's LRU list. The page is returned locked and with an increased refcount. On memory exhaustion, ``NULL`` is returned. find_or_create_page() may sleep, even if **gfp_flags** specifies an atomic allocation!h](jM)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM|hjkubj)}(hhh](j)}(h;``struct address_space *mapping`` the page's address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjkh]hstruct address_space *mapping}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMyhjkubj)}(hhh]jM)}(hthe page's address_spaceh]hthe page’s address_space}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjkhMyhjkubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjkhMyhjkubj)}(h4``pgoff_t index`` the page's index into the mapping h](j)}(h``pgoff_t index``h]jS)}(hjkh]h pgoff_t index}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMzhjkubj)}(hhh]jM)}(h!the page's index into the mappingh]h#the page’s index into the mapping}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhMzhjlubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjlhMzhjkubj)}(h(``gfp_t gfp_mask`` page allocation mode h](j)}(h``gfp_t gfp_mask``h]jS)}(hj8lh]hgfp_t gfp_mask}(hj:lhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6lubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM{hj2lubj)}(hhh]jM)}(hpage allocation modeh]hpage allocation mode}(hjQlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjMlhM{hjNlubah}(h]h ]h"]h$]h&]uh1jhj2lubeh}(h]h ]h"]h$]h&]uh1jhjMlhM{hjkubeh}(h]h ]h"]h$]h&]uh1jhjkubjM)}(h**Description**h]j)}(hjslh]h Description}(hjulhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqlubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM}hjkubjM)}(hLooks up the page cache slot at **mapping** & **offset**. If there is a page cache page, it is returned locked and with an increased refcount.h](h Looks up the page cache slot at }(hjlhhhNhNubj)}(h **mapping**h]hmapping}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubh & }(hjlhhhNhNubj)}(h **offset**h]hoffset}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubhW. If there is a page cache page, it is returned locked and with an increased refcount.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM|hjkubjM)}(hIf the page is not present, a new page is allocated using **gfp_mask** and added to the page cache and the VM's LRU list. The page is returned locked and with an increased refcount.h](h:If the page is not present, a new page is allocated using }(hjlhhhNhNubj)}(h **gfp_mask**h]hgfp_mask}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubhr and added to the page cache and the VM’s LRU list. The page is returned locked and with an increased refcount.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjkubjM)}(h+On memory exhaustion, ``NULL`` is returned.h](hOn memory exhaustion, }(hjlhhhNhNubjS)}(h``NULL``h]hNULL}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjlubh is returned.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjkubjM)}(hVfind_or_create_page() may sleep, even if **gfp_flags** specifies an atomic allocation!h](h)find_or_create_page() may sleep, even if }(hjlhhhNhNubj)}(h **gfp_flags**h]h gfp_flags}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubh specifies an atomic allocation!}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#grab_cache_page_nowait (C function)c.grab_cache_page_nowaithNtauh1hhj#hhhNhNubh)}(hhh](h)}(hSstruct page * grab_cache_page_nowait (struct address_space *mapping, pgoff_t index)h]h)}(hQstruct page *grab_cache_page_nowait(struct address_space *mapping, pgoff_t index)h](j5)}(hj8h]hstruct}(hj?mhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj;mhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjMmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;mhhhjLmhMubh)}(hhh]j)}(hpageh]hpage}(hj^mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[mubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj`mmodnameN classnameNjpjs)}jv]jy)}jlgrab_cache_page_nowaitsbc.grab_cache_page_nowaitasbuh1hhj;mhhhjLmhMubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;mhhhjLmhMubjF )}(hjI h]h*}(hjmhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj;mhhhjLmhMubh)}(hgrab_cache_page_nowaith]j)}(hj|mh]hgrab_cache_page_nowait}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]jjuh1hhj;mhhhjLmhMubj )}(h.(struct address_space *mapping, pgoff_t index)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjmhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjmubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubh)}(hhh]j)}(h address_spaceh]h address_space}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmmodnameN classnameNjpjs)}jv]jzmc.grab_cache_page_nowaitasbuh1hhjmubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubjF )}(hjI h]h*}(hjnhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjmubj)}(hmappingh]hmapping}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjmubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj,nhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)nubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.nmodnameN classnameNjpjs)}jv]jzmc.grab_cache_page_nowaitasbuh1hhj%nubj)}(h h]h }(hjJnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%nubj)}(hindexh]hindex}(hjXnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%nubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjmubeh}(h]h ]h"]h$]h&]jjuh1j hj;mhhhjLmhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj7mhhhjLmhMubah}(h]j2mah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjLmhMhj4mhhubj4)}(hhh]jM)}(h1returns locked page at given index in given cacheh]h1returns locked page at given index in given cache}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnhhubah}(h]h ]h"]h$]h&]uh1j3hj4mhhhjLmhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjnjHjnjIjJjKuh1hhhhj#hNhNubj)}(hX>**Parameters** ``struct address_space *mapping`` target address_space ``pgoff_t index`` the page index **Description** Returns locked page at given index in given cache, creating it if needed, but do not wait if the page is locked or to reclaim memory. This is intended for speculative data generators, where the data can be regenerated if the page couldn't be grabbed. This routine should be safe to call while holding the lock for another page. Clear __GFP_FS when allocating the page to avoid recursion into the fs and deadlock against the caller's locked page.h](jM)}(h**Parameters**h]j)}(hjnh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnubj)}(hhh](j)}(h7``struct address_space *mapping`` target address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjnh]hstruct address_space *mapping}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnubj)}(hhh]jM)}(htarget address_spaceh]htarget address_space}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnhMhjnubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjnhMhjnubj)}(h!``pgoff_t index`` the page index h](j)}(h``pgoff_t index``h]jS)}(hjnh]h pgoff_t index}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnubj)}(hhh]jM)}(hthe page indexh]hthe page index}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjohMhjoubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjohMhjnubeh}(h]h ]h"]h$]h&]uh1jhjnubjM)}(h**Description**h]j)}(hj7oh]h Description}(hj9ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5oubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnubjM)}(hXHReturns locked page at given index in given cache, creating it if needed, but do not wait if the page is locked or to reclaim memory. This is intended for speculative data generators, where the data can be regenerated if the page couldn't be grabbed. This routine should be safe to call while holding the lock for another page.h]hXJReturns locked page at given index in given cache, creating it if needed, but do not wait if the page is locked or to reclaim memory. This is intended for speculative data generators, where the data can be regenerated if the page couldn’t be grabbed. This routine should be safe to call while holding the lock for another page.}(hjMohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnubjM)}(huClear __GFP_FS when allocating the page to avoid recursion into the fs and deadlock against the caller's locked page.h]hwClear __GFP_FS when allocating the page to avoid recursion into the fs and deadlock against the caller’s locked page.}(hj\ohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_next_index (C function)c.folio_next_indexhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h4pgoff_t folio_next_index (const struct folio *folio)h]h)}(h3pgoff_t folio_next_index(const struct folio *folio)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjomodnameN classnameNjpjs)}jv]jy)}jlfolio_next_indexsbc.folio_next_indexasbuh1hhjohhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjohMubh)}(hfolio_next_indexh]j)}(hjoh]hfolio_next_index}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1hhjohhhjohMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjohhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjoubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj5)}(hj8h]hstruct}(hjohhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjoubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubh)}(hhh]j)}(hfolioh]hfolio}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjpmodnameN classnameNjpjs)}jv]joc.folio_next_indexasbuh1hhjoubj)}(h h]h }(hj4phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubjF )}(hjI h]h*}(hjBphhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjoubj)}(hfolioh]hfolio}(hjOphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjoubah}(h]h ]h"]h$]h&]jjuh1j hjohhhjohMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjohhhjohMubah}(h]j~oah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjohMhjohhubj4)}(hhh]jM)}(h Get the index of the next folio.h]h Get the index of the next folio.}(hjyphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvphhubah}(h]h ]h"]h$]h&]uh1j3hjohhhjohMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjpjHjpjIjJjKuh1hhhhj#hNhNubj)}(h**Parameters** ``const struct folio *folio`` The current folio. **Return** The index of the folio which follows this folio in the file.h](jM)}(h**Parameters**h]j)}(hjph]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjpubj)}(hhh]j)}(h1``const struct folio *folio`` The current folio. h](j)}(h``const struct folio *folio``h]jS)}(hjph]hconst struct folio *folio}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjpubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjpubj)}(hhh]jM)}(hThe current folio.h]hThe current folio.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjphMhjpubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhjphMhjpubah}(h]h ]h"]h$]h&]uh1jhjpubjM)}(h **Return**h]j)}(hjph]hReturn}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjpubjM)}(hbool folio_contains (const struct folio *folio, pgoff_t index)h]h)}(h=bool folio_contains(const struct folio *folio, pgoff_t index)h](j)}(hj-h]hbool}(hjMuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIuhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hj[uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIuhhhjZuhMubh)}(hfolio_containsh]j)}(hfolio_containsh]hfolio_contains}(hjmuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiuubah}(h]h ](jjeh"]h$]h&]jjuh1hhjIuhhhjZuhMubj )}(h*(const struct folio *folio, pgoff_t index)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjuhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjuubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj5)}(hj8h]hstruct}(hjuhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjuubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubh)}(hhh]j)}(hfolioh]hfolio}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjumodnameN classnameNjpjs)}jv]jy)}jljousbc.folio_containsasbuh1hhjuubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubjF )}(hjI h]h*}(hjuhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjuubj)}(hfolioh]hfolio}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjuubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjvmodnameN classnameNjpjs)}jv]juc.folio_containsasbuh1hhjvubj)}(h h]h }(hj7vhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hindexh]hindex}(hjEvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjuubeh}(h]h ]h"]h$]h&]jjuh1j hjIuhhhjZuhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjEuhhhjZuhMubah}(h]j@uah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjZuhMhjBuhhubj4)}(hhh]jM)}(h#Does this folio contain this index?h]h#Does this folio contain this index?}(hjovhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjlvhhubah}(h]h ]h"]h$]h&]uh1j3hjBuhhhjZuhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjvjHjvjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio. ``pgoff_t index`` The page index within the file. **Context** The caller should have the folio locked and ensure e.g., shmem did not move this folio to the swap cache. **Return** true or false.h](jM)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubj)}(hhh](j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjvh]hconst struct folio *folio}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMhjvubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjvubj)}(h2``pgoff_t index`` The page index within the file. h](j)}(h``pgoff_t index``h]jS)}(hjvh]h pgoff_t index}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubj)}(hhh]jM)}(hThe page index within the file.h]hThe page index within the file.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMhjvubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjvubeh}(h]h ]h"]h$]h&]uh1jhjvubjM)}(h **Context**h]j)}(hj$wh]hContext}(hj&whhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"wubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubjM)}(hiThe caller should have the folio locked and ensure e.g., shmem did not move this folio to the swap cache.h]hiThe caller should have the folio locked and ensure e.g., shmem did not move this folio to the swap cache.}(hj:whhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubjM)}(h **Return**h]j)}(hjKwh]hReturn}(hjMwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIwubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubjM)}(htrue or false.h]htrue or false.}(hjawhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpage_pgoff (C function) c.page_pgoffhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hGpgoff_t page_pgoff (const struct folio *folio, const struct page *page)h]h)}(hFpgoff_t page_pgoff(const struct folio *folio, const struct page *page)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jy)}jl page_pgoffsb c.page_pgoffasbuh1hhjwhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhjwhMubh)}(h page_pgoffh]j)}(hjwh]h page_pgoff}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ](jjeh"]h$]h&]jjuh1hhjwhhhjwhMubj )}(h4(const struct folio *folio, const struct page *page)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjwhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjwubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj5)}(hj8h]hstruct}(hjwhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjwubj)}(h h]h }(hj xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubh)}(hhh]j)}(hfolioh]hfolio}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjxmodnameN classnameNjpjs)}jv]jw c.page_pgoffasbuh1hhjwubj)}(h h]h }(hj9xhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubjF )}(hjI h]h*}(hjGxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjwubj)}(hfolioh]hfolio}(hjTxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjwubj )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjmxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjixubj)}(h h]h }(hjzxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjixubj5)}(hj8h]hstruct}(hjxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjixubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjixubh)}(hhh]j)}(hpageh]hpage}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjxmodnameN classnameNjpjs)}jv]jw c.page_pgoffasbuh1hhjixubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjixubjF )}(hjI h]h*}(hjxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjixubj)}(hpageh]hpage}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjixubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjwubeh}(h]h ]h"]h$]h&]jjuh1j hjwhhhjwhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjwhhhjwhMubah}(h]jwah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjwhMhjwhhubj4)}(hhh]jM)}(h/Calculate the logical page offset of this page.h]h/Calculate the logical page offset of this page.}(hj yhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjyhhubah}(h]h ]h"]h$]h&]uh1j3hjwhhhjwhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!yjHj!yjIjJjKuh1hhhhj#hNhNubj)}(hX&**Parameters** ``const struct folio *folio`` The folio containing this page. ``const struct page *page`` The page which we need the offset of. **Description** For file pages, this is the offset from the beginning of the file in units of PAGE_SIZE. For anonymous pages, this is the offset from the beginning of the anon_vma in units of PAGE_SIZE. This will return nonsense for KSM pages. **Context** Caller must have a reference on the folio or otherwise prevent it from being split or freed. **Return** The offset in units of PAGE_SIZE.h](jM)}(h**Parameters**h]j)}(hj+yh]h Parameters}(hj-yhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)yubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubj)}(hhh](j)}(h>``const struct folio *folio`` The folio containing this page. h](j)}(h``const struct folio *folio``h]jS)}(hjJyh]hconst struct folio *folio}(hjLyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHyubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjDyubj)}(hhh]jM)}(hThe folio containing this page.h]hThe folio containing this page.}(hjcyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_yhMhj`yubah}(h]h ]h"]h$]h&]uh1jhjDyubeh}(h]h ]h"]h$]h&]uh1jhj_yhMhjAyubj)}(hB``const struct page *page`` The page which we need the offset of. h](j)}(h``const struct page *page``h]jS)}(hjyh]hconst struct page *page}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjyubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj}yubj)}(hhh]jM)}(h%The page which we need the offset of.h]h%The page which we need the offset of.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhMhjyubah}(h]h ]h"]h$]h&]uh1jhj}yubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjAyubeh}(h]h ]h"]h$]h&]uh1jhj%yubjM)}(h**Description**h]j)}(hjyh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubjM)}(hFor file pages, this is the offset from the beginning of the file in units of PAGE_SIZE. For anonymous pages, this is the offset from the beginning of the anon_vma in units of PAGE_SIZE. This will return nonsense for KSM pages.h]hFor file pages, this is the offset from the beginning of the file in units of PAGE_SIZE. For anonymous pages, this is the offset from the beginning of the anon_vma in units of PAGE_SIZE. This will return nonsense for KSM pages.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubjM)}(h **Context**h]j)}(hjyh]hContext}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubjM)}(h\Caller must have a reference on the folio or otherwise prevent it from being split or freed.h]h\Caller must have a reference on the folio or otherwise prevent it from being split or freed.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubjM)}(h **Return**h]j)}(hj zh]hReturn}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj zubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubjM)}(h!The offset in units of PAGE_SIZE.h]h!The offset in units of PAGE_SIZE.}(hj"zhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj%yubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_pos (C function) c.folio_poshNtauh1hhj#hhhNhNubh)}(hhh](h)}(h,loff_t folio_pos (const struct folio *folio)h]h)}(h+loff_t folio_pos(const struct folio *folio)h](h)}(hhh]j)}(hloff_th]hloff_t}(hjTzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQzubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjVzmodnameN classnameNjpjs)}jv]jy)}jl folio_possb c.folio_posasbuh1hhjMzhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjvzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMzhhhjuzhMubh)}(h folio_posh]j)}(hjrzh]h folio_pos}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ](jjeh"]h$]h&]jjuh1hhjMzhhhjuzhMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjzhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjzubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj5)}(hj8h]hstruct}(hjzhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjzubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubh)}(hhh]j)}(hfolioh]hfolio}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjzmodnameN classnameNjpjs)}jv]jpz c.folio_posasbuh1hhjzubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubjF )}(hjI h]h*}(hj{hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjzubj)}(hfolioh]hfolio}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubah}(h]h ]h"]h$]h&]jjuh1j hjMzhhhjuzhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjIzhhhjuzhMubah}(h]jDzah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjuzhMhjFzhhubj4)}(hhh]jM)}(h4Returns the byte position of this folio in its file.h]h4Returns the byte position of this folio in its file.}(hj?{hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj<{hhubah}(h]h ]h"]h$]h&]uh1j3hjFzhhhjuzhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjW{jHjW{jIjJjKuh1hhhhj#hNhNubj)}(h:**Parameters** ``const struct folio *folio`` The folio.h](jM)}(h**Parameters**h]j)}(hja{h]h Parameters}(hjc{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_{ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj[{ubj)}(hhh]j)}(h(``const struct folio *folio`` The folio.h](j)}(h``const struct folio *folio``h]jS)}(hj{h]hconst struct folio *folio}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~{ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjz{ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj{ubah}(h]h ]h"]h$]h&]uh1jhjz{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMhjw{ubah}(h]h ]h"]h$]h&]uh1jhj[{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hlinear_page_delta (C function)c.linear_page_deltahNtauh1hhj#hhhNhNubh)}(hhh](h)}(hYpgoff_t linear_page_delta (const struct vm_area_struct *vma, const unsigned long address)h]h)}(hXpgoff_t linear_page_delta(const struct vm_area_struct *vma, const unsigned long address)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj{modnameN classnameNjpjs)}jv]jy)}jllinear_page_deltasbc.linear_page_deltaasbuh1hhj{hhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM+ubj)}(h h]h 8}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhj{hM+ubh)}(hlinear_page_deltah]j)}(hj{h]hlinear_page_delta}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj |ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj{hhhj{hM+ubj )}(h?(const struct vm_area_struct *vma, const unsigned long address)h](j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hj,|hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(|ubj)}(h h]h }(hj9|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(|ubj5)}(hj8h]hstruct}(hjG|hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(|ubj)}(h h]h }(hjT|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(|ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hje|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb|ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjg|modnameN classnameNjpjs)}jv]j{c.linear_page_deltaasbuh1hhj(|ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(|ubjF )}(hjI h]h*}(hj|hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(|ubj)}(hvmah]hvma}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$|ubj )}(hconst unsigned long addressh](j5)}(hjh]hconst}(hj|hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj|ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hunsignedh]hunsigned}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hlongh]hlong}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(haddressh]haddress}(hj }hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$|ubeh}(h]h ]h"]h$]h&]jjuh1j hj{hhhj{hM+ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj{hhhj{hM+ubah}(h]j{ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj{hM+hj{hhubj4)}(hhh]jM)}(hADetermine the relative page offset of **address** within **vma**.h](h&Determine the relative page offset of }(hj4}hhhNhNubj)}(h **address**h]haddress}(hj<}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4}ubh within }(hj4}hhhNhNubj)}(h**vma**h]hvma}(hjN}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4}ubh.}(hj4}hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM+hj1}hhubah}(h]h ]h"]h$]h&]uh1j3hj{hhhj{hM+ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjp}jHjp}jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``const struct vm_area_struct *vma`` The VMA in which **address** resides. ``const unsigned long address`` The address whose relative page offset is required. **Description** The result is identical for both file-backed and anonymous mappings and simply determines how many pages **address** lies from **vma->vm_start**. **Return** The number of pages **address** is offset by within **vma**.h](jM)}(h**Parameters**h]j)}(hjz}h]h Parameters}(hj|}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx}ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM/hjt}ubj)}(hhh](j)}(hK``const struct vm_area_struct *vma`` The VMA in which **address** resides. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hj}h]h const struct vm_area_struct *vma}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM-hj}ubj)}(hhh]jM)}(h%The VMA in which **address** resides.h](hThe VMA in which }(hj}hhhNhNubj)}(h **address**h]haddress}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh resides.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj}hM-hj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM-hj}ubj)}(hT``const unsigned long address`` The address whose relative page offset is required. h](j)}(h``const unsigned long address``h]jS)}(hj}h]hconst unsigned long address}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM.hj}ubj)}(hhh]jM)}(h3The address whose relative page offset is required.h]h3The address whose relative page offset is required.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj}hM.hj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hM.hj}ubeh}(h]h ]h"]h$]h&]uh1jhjt}ubjM)}(h**Description**h]j)}(hj~h]h Description}(hj!~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM0hjt}ubjM)}(hThe result is identical for both file-backed and anonymous mappings and simply determines how many pages **address** lies from **vma->vm_start**.h](hiThe result is identical for both file-backed and anonymous mappings and simply determines how many pages }(hj5~hhhNhNubj)}(h **address**h]haddress}(hj=~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5~ubh lies from }(hj5~hhhNhNubj)}(h**vma->vm_start**h]h vma->vm_start}(hjO~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5~ubh.}(hj5~hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM/hjt}ubjM)}(h **Return**h]j)}(hjj~h]hReturn}(hjl~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh~ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM2hjt}ubjM)}(hhjubj)}(hhh]jM)}(h%The VMA in which **address** resides.h](hThe VMA in which }(hjhhhNhNubj)}(h **address**h]haddress}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh resides.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhM>hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hjubj)}(hT``const unsigned long address`` The address whose absolute page offset is required. h](j)}(h``const unsigned long address``h]jS)}(hj݀h]hconst unsigned long address}(hj߀hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjۀubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM?hj׀ubj)}(hhh]jM)}(h3The address whose absolute page offset is required.h]h3The address whose absolute page offset is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM?hjubah}(h]h ]h"]h$]h&]uh1jhj׀ubeh}(h]h ]h"]h$]h&]uh1jhjhM?hjubeh}(h]h ]h"]h$]h&]uh1jhjmubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMAhjmubjM)}(hZSee the comment for vma_start_pgoff() for a description of what the page offset signifies.h]hZSee the comment for vma_start_pgoff() for a description of what the page offset signifies.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM@hjmubjM)}(h **Return**h]j)}(hj?h]hReturn}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMChjmubjM)}(h7The absolute page offset of **address** within **vma**.h](hThe absolute page offset of }(hjUhhhNhNubj)}(h **address**h]haddress}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh within }(hjUhhhNhNubj)}(h**vma**h]hvma}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh.}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMDhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#linear_anon_page_index (C function)c.linear_anon_page_indexhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h^pgoff_t linear_anon_page_index (const struct vm_area_struct *vma, const unsigned long address)h]h)}(h]pgoff_t linear_anon_page_index(const struct vm_area_struct *vma, const unsigned long address)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jllinear_anon_page_indexsbc.linear_anon_page_indexasbuh1hhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMSubj)}(h h]h }(hj́hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj́hMSubh)}(hlinear_anon_page_indexh]j)}(hjɁh]hlinear_anon_page_index}(hj߁hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjہubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj́hMSubj )}(h?(const struct vm_area_struct *vma, const unsigned long address)h](j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj5modnameN classnameNjpjs)}jv]jǁc.linear_anon_page_indexasbuh1hhjubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj_hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst unsigned long addressh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(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)}(haddressh]haddress}(hj؂hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj́hMSubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj́hMSubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj́hMShjhhubj4)}(hhh]jM)}(hKDetermine the absolute anonymous page offset of **address** within **vma**.h](h0Determine the absolute anonymous page offset of }(hjhhhNhNubj)}(h **address**h]haddress}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh within }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMShjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj́hMSubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj>jHj>jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``const struct vm_area_struct *vma`` An anonymous or MAP_PRIVATE file-backed VMA in which **address** resides. ``const unsigned long address`` The address whose absolute page offset is required. **Description** This returns the anonymous page offset of **address**, which is the page offset the address possessed at the time the VMA was first faulted. For anonymous mappings, this returns the same value as linear_page_index(). For MAP_PRIVATE file-backed mappings, this returns the anonymous page offset of **address**, which is the page offset the address possessed at the time the VMA was first faulted. It is not valid to call this function for shared file-backed mappings. **Return** The absolute anonymous page offset of **address** within **vma**.h](jM)}(h**Parameters**h]j)}(hjHh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMWhjBubj)}(hhh](j)}(ho``const struct vm_area_struct *vma`` An anonymous or MAP_PRIVATE file-backed VMA in which **address** resides. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjgh]h const struct vm_area_struct *vma}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMUhjaubj)}(hhh]jM)}(hIAn anonymous or MAP_PRIVATE file-backed VMA in which **address** resides.h](h5An anonymous or MAP_PRIVATE file-backed VMA in which }(hjhhhNhNubj)}(h **address**h]haddress}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh resides.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj|hMUhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMUhj^ubj)}(hT``const unsigned long address`` The address whose absolute page offset is required. h](j)}(h``const unsigned long address``h]jS)}(hjh]hconst unsigned long address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMVhjubj)}(hhh]jM)}(h3The address whose absolute page offset is required.h]h3The address whose absolute page offset is required.}(hj˃hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjǃhMVhjȃubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjǃhMVhj^ubeh}(h]h ]h"]h$]h&]uh1jhjBubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMXhjBubjM)}(hThis returns the anonymous page offset of **address**, which is the page offset the address possessed at the time the VMA was first faulted.h](h*This returns the anonymous page offset of }(hjhhhNhNubj)}(h **address**h]haddress}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhW, which is the page offset the address possessed at the time the VMA was first faulted.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMWhjBubjM)}(hKFor anonymous mappings, this returns the same value as linear_page_index().h]hKFor anonymous mappings, this returns the same value as linear_page_index().}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMZhjBubjM)}(hFor MAP_PRIVATE file-backed mappings, this returns the anonymous page offset of **address**, which is the page offset the address possessed at the time the VMA was first faulted.h](hPFor MAP_PRIVATE file-backed mappings, this returns the anonymous page offset of }(hj3hhhNhNubj)}(h **address**h]haddress}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubhW, which is the page offset the address possessed at the time the VMA was first faulted.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM\hjBubjM)}(hFIt is not valid to call this function for shared file-backed mappings.h]hFIt is not valid to call this function for shared file-backed mappings.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM`hjBubjM)}(h **Return**h]j)}(hjeh]hReturn}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMbhjBubjM)}(hAThe absolute anonymous page offset of **address** within **vma**.h](h&The absolute anonymous page offset of }(hj{hhhNhNubj)}(h **address**h]haddress}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh within }(hj{hhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMchjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_trylock (C function)c.folio_trylockhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h(bool folio_trylock (struct folio *folio)h]h)}(h'bool folio_trylock(struct folio *folio)h](j)}(hj-h]hbool}(hj΄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʄhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hj܄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʄhhhjۄhMubh)}(h folio_trylockh]j)}(h folio_trylockh]h folio_trylock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjʄhhhjۄhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj*modnameN classnameNjpjs)}jv]jy)}jljsbc.folio_trylockasbuh1hhjubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjVhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjʄhhhjۄhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjƄhhhjۄhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjۄhMhjÄhhubj4)}(hhh]jM)}(hAttempt to lock a folio.h]hAttempt to lock a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjÄhhhjۄhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to attempt to lock. **Description** Sometimes it is undesirable to wait for a folio to be unlocked (eg when the locks are being taken in the wrong order, or if making progress through a batch of folios is more important than processing them in order). Usually folio_lock() is the correct function to call. **Context** Any context. **Return** Whether the lock was successfully acquired.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]j)}(h6``struct folio *folio`` The folio to attempt to lock. h](j)}(h``struct folio *folio``h]jS)}(hj΅h]hstruct folio *folio}(hjЅhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj̅ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjȅubj)}(hhh]jM)}(hThe folio to attempt to lock.h]hThe folio to attempt to lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjȅubeh}(h]h ]h"]h$]h&]uh1jhjhMhjŅubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(hXSometimes it is undesirable to wait for a folio to be unlocked (eg when the locks are being taken in the wrong order, or if making progress through a batch of folios is more important than processing them in order). Usually folio_lock() is the correct function to call.h]hXSometimes it is undesirable to wait for a folio to be unlocked (eg when the locks are being taken in the wrong order, or if making progress through a batch of folios is more important than processing them in order). Usually folio_lock() is the correct function to call.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(h **Context**h]j)}(hj0h]hContext}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(h Any context.h]h Any context.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(h **Return**h]j)}(hjWh]hReturn}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(h+Whether the lock was successfully acquired.h]h+Whether the lock was successfully acquired.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_lock (C function) c.folio_lockhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h%void folio_lock (struct folio *folio)h]h)}(h$void folio_lock(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h folio_lockh]j)}(h folio_lockh]h folio_lock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjنhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjՆubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjՆubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsb c.folio_lockasbuh1hhjՆubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjՆubjF )}(hjI h]h*}(hj%hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjՆubj)}(hfolioh]hfolio}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjՆubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjцubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hLock this folio.h]hLock this folio.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjYhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjtjHjtjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to lock. **Description** The folio lock protects against many things, probably more than it should. It is primarily held while a folio is being brought uptodate, either from its backing file or from swap. It is also held while a folio is being truncated from its address_space, so holding the lock is sufficient to keep folio->mapping stable. The folio lock is also held while write() is modifying the page to provide POSIX atomicity guarantees (as long as the write does not cross a page boundary). Other modifications to the data in the folio do not hold the folio lock and can race with writes, eg DMA and stores to mapped pages. **Context** May sleep. If you need to acquire the locks of two or more folios, they must be in order of ascending index, if they are in the same address_space. If they are in different address_spaces, acquire the lock of the folio which belongs to the address_space which has the lowest address in memory first.h](jM)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjxubj)}(hhh]j)}(h+``struct folio *folio`` The folio to lock. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(hThe folio to lock.h]hThe folio to lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjxubjM)}(h**Description**h]j)}(hj؇h]h Description}(hjڇhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjևubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjxubjM)}(hX?The folio lock protects against many things, probably more than it should. It is primarily held while a folio is being brought uptodate, either from its backing file or from swap. It is also held while a folio is being truncated from its address_space, so holding the lock is sufficient to keep folio->mapping stable.h]hX?The folio lock protects against many things, probably more than it should. It is primarily held while a folio is being brought uptodate, either from its backing file or from swap. It is also held while a folio is being truncated from its address_space, so holding the lock is sufficient to keep folio->mapping stable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjxubjM)}(hX"The folio lock is also held while write() is modifying the page to provide POSIX atomicity guarantees (as long as the write does not cross a page boundary). Other modifications to the data in the folio do not hold the folio lock and can race with writes, eg DMA and stores to mapped pages.h]hX"The folio lock is also held while write() is modifying the page to provide POSIX atomicity guarantees (as long as the write does not cross a page boundary). Other modifications to the data in the folio do not hold the folio lock and can race with writes, eg DMA and stores to mapped pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjxubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjxubjM)}(hX-May sleep. If you need to acquire the locks of two or more folios, they must be in order of ascending index, if they are in the same address_space. If they are in different address_spaces, acquire the lock of the folio which belongs to the address_space which has the lowest address in memory first.h]hX-May sleep. If you need to acquire the locks of two or more folios, they must be in order of ascending index, if they are in the same address_space. If they are in different address_spaces, acquire the lock of the folio which belongs to the address_space which has the lowest address in memory first.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hlock_page (C function) c.lock_pagehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h"void lock_page (struct page *page)h]h)}(h!void lock_page(struct page *page)h](j)}(hvoidh]hvoid}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjahMubh)}(h lock_pageh]j)}(h lock_pageh]h lock_page}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1hhjOhhhjahMubj )}(h(struct page *page)h]j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljvsb c.lock_pageasbuh1hhjubj)}(h h]h }(hjΈhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj܈hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjOhhhjahMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjKhhhjahMubah}(h]jFah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjahMhjHhhubj4)}(hhh]jM)}(h$Lock the folio containing this page.h]h$Lock the folio containing this page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjHhhhjahMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj+jHj+jIjJjKuh1hhhhj#hNhNubj)}(hXS**Parameters** ``struct page *page`` The page to lock. **Description** See folio_lock() for a description of what the lock protects. This is a legacy function and new code should probably use folio_lock() instead. **Context** May sleep. Pages in the same folio share a lock, so do not attempt to lock two pages which share a folio.h](jM)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj/ubj)}(hhh]j)}(h(``struct page *page`` The page to lock. h](j)}(h``struct page *page``h]jS)}(hjTh]hstruct page *page}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjRubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjNubj)}(hhh]jM)}(hThe page to lock.h]hThe page to lock.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjihMhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihMhjKubah}(h]h ]h"]h$]h&]uh1jhj/ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj/ubjM)}(hSee folio_lock() for a description of what the lock protects. This is a legacy function and new code should probably use folio_lock() instead.h]hSee folio_lock() for a description of what the lock protects. This is a legacy function and new code should probably use folio_lock() instead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj/ubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj/ubjM)}(hjMay sleep. Pages in the same folio share a lock, so do not attempt to lock two pages which share a folio.h]hjMay sleep. Pages in the same folio share a lock, so do not attempt to lock two pages which share a folio.}(hj̉hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h folio_lock_killable (C function)c.folio_lock_killablehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h-int folio_lock_killable (struct folio *folio)h]h)}(h,int folio_lock_killable(struct folio *folio)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubh)}(hfolio_lock_killableh]j)}(hfolio_lock_killableh]hfolio_lock_killable}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj8hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj4ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubh)}(hhh]j)}(hfolioh]hfolio}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjXmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_lock_killableasbuh1hhj4ubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj4ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhjhhubj4)}(hhh]jM)}(h1Lock this folio, interruptible by a fatal signal.h]h1Lock this folio, interruptible by a fatal signal.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjӊjHjӊjIjJjKuh1hhhhj#hNhNubj)}(hXF**Parameters** ``struct folio *folio`` The folio to lock. **Description** Attempts to lock the folio, like folio_lock(), except that the sleep to acquire the lock is interruptible by a fatal signal. **Context** May sleep; see folio_lock(). **Return** 0 if the lock was acquired; -EINTR if a fatal signal was received.h](jM)}(h**Parameters**h]j)}(hj݊h]h Parameters}(hjߊhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjۊubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubj)}(hhh]j)}(h+``struct folio *folio`` The folio to lock. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(hThe folio to lock.h]hThe folio to lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj׊ubjM)}(h**Description**h]j)}(hj7h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubjM)}(h|Attempts to lock the folio, like folio_lock(), except that the sleep to acquire the lock is interruptible by a fatal signal.h]h|Attempts to lock the folio, like folio_lock(), except that the sleep to acquire the lock is interruptible by a fatal signal.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubjM)}(h **Context**h]j)}(hj^h]hContext}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubjM)}(hMay sleep; see folio_lock().h]hMay sleep; see folio_lock().}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubjM)}(hB0 if the lock was acquired; -EINTR if a fatal signal was received.h]hB0 if the lock was acquired; -EINTR if a fatal signal was received.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj׊ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*filemap_range_needs_writeback (C function)c.filemap_range_needs_writebackhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hfbool filemap_range_needs_writeback (struct address_space *mapping, loff_t start_byte, loff_t end_byte)h]h)}(hebool filemap_range_needs_writeback(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j)}(hj-h]hbool}(hjʋhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƋhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMWubj)}(h h]h }(hj؋hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƋhhhj׋hMWubh)}(hfilemap_range_needs_writebackh]j)}(hfilemap_range_needs_writebackh]hfilemap_range_needs_writeback}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjƋhhhj׋hMWubj )}(hC(struct address_space *mapping, loff_t start_byte, loff_t end_byte)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj&modnameN classnameNjpjs)}jv]jy)}jljsbc.filemap_range_needs_writebackasbuh1hhjubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjRhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t start_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj}modnameN classnameNjpjs)}jv]j@c.filemap_range_needs_writebackasbuh1hhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(h start_byteh]h start_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t end_byteh](h)}(hhh]j)}(hloff_th]hloff_t}(hjÌhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjŌmodnameN classnameNjpjs)}jv]j@c.filemap_range_needs_writebackasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hend_byteh]hend_byte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjƋhhhj׋hMWubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj‹hhhj׋hMWubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj׋hMWhjhhubj4)}(hhh]jM)}(h*check if range potentially needs writebackh]h*check if range potentially needs writeback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMWhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj׋hMWubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj1jHj1jIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address space within which to check ``loff_t start_byte`` offset in bytes where the range starts ``loff_t end_byte`` offset in bytes where the range ends (inclusive) **Description** Find at least one page in the range supplied, usually used to check if direct writing in this range will trigger a writeback. Used by O_DIRECT read/write with IOCB_NOWAIT, to see if the caller needs to do filemap_write_and_wait_range() before proceeding. **Return** ``true`` if the caller should do filemap_write_and_wait_range() before doing O_DIRECT to a page in this range, ``false`` otherwise.h](jM)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM[hj5ubj)}(hhh](j)}(hF``struct address_space *mapping`` address space within which to check h](j)}(h!``struct address_space *mapping``h]jS)}(hjZh]hstruct address_space *mapping}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMXhjTubj)}(hhh]jM)}(h#address space within which to checkh]h#address space within which to check}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjohMXhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohMXhjQubj)}(h=``loff_t start_byte`` offset in bytes where the range starts h](j)}(h``loff_t start_byte``h]jS)}(hjh]hloff_t start_byte}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMYhjubj)}(hhh]jM)}(h&offset in bytes where the range startsh]h&offset in bytes where the range starts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjQubj)}(hE``loff_t end_byte`` offset in bytes where the range ends (inclusive) h](j)}(h``loff_t end_byte``h]jS)}(hj̍h]hloff_t end_byte}(hj΍hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjʍubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMZhjƍubj)}(hhh]jM)}(h0offset in bytes where the range ends (inclusive)h]h0offset in bytes where the range ends (inclusive)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMZhjubah}(h]h ]h"]h$]h&]uh1jhjƍubeh}(h]h ]h"]h$]h&]uh1jhjhMZhjQubeh}(h]h ]h"]h$]h&]uh1jhj5ubjM)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM\hj5ubjM)}(hFind at least one page in the range supplied, usually used to check if direct writing in this range will trigger a writeback. Used by O_DIRECT read/write with IOCB_NOWAIT, to see if the caller needs to do filemap_write_and_wait_range() before proceeding.h]hFind at least one page in the range supplied, usually used to check if direct writing in this range will trigger a writeback. Used by O_DIRECT read/write with IOCB_NOWAIT, to see if the caller needs to do filemap_write_and_wait_range() before proceeding.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM[hj5ubjM)}(h **Return**h]j)}(hj.h]hReturn}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM`hj5ubjM)}(h``true`` if the caller should do filemap_write_and_wait_range() before doing O_DIRECT to a page in this range, ``false`` otherwise.h](jS)}(h``true``h]htrue}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjDubhg if the caller should do filemap_write_and_wait_range() before doing O_DIRECT to a page in this range, }(hjDhhhNhNubjS)}(h ``false``h]hfalse}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjDubh otherwise.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMahj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_control (C struct)c.readahead_controlhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hreadahead_controlh]h)}(hstruct readahead_controlh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMgubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMgubh)}(hreadahead_controlh]j)}(hjh]hreadahead_control}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMgubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMgubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMghjhhubj4)}(hhh]jM)}(hDescribes a readahead request.h]hDescribes a readahead request.}(hjՎhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMqhjҎhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMgubeh}(h]h ](jAstructeh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhj#hNhNubj)}(hX**Definition**:: struct readahead_control { struct file *file; struct address_space *mapping; struct file_ra_state *ra; }; **Members** ``file`` The file, used primarily by network filesystems for authentication. May be NULL if invoked internally by the filesystem. ``mapping`` Readahead this filesystem object. ``ra`` File readahead state. May be NULL.h](jM)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMuhjubj )}(hustruct readahead_control { struct file *file; struct address_space *mapping; struct file_ra_state *ra; };h]hustruct readahead_control { struct file *file; struct address_space *mapping; struct file_ra_state *ra; };}hjsbah}(h]h ]h"]h$]h&]jjuh1j hW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMwhjubjM)}(h **Members**h]j)}(hj#h]hMembers}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM}hjubj)}(hhh](j)}(h``file`` The file, used primarily by network filesystems for authentication. May be NULL if invoked internally by the filesystem. h](j)}(h``file``h]jS)}(hjBh]hfile}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM}hj<ubj)}(hhh]jM)}(hxThe file, used primarily by network filesystems for authentication. May be NULL if invoked internally by the filesystem.h]hxThe file, used primarily by network filesystems for authentication. May be NULL if invoked internally by the filesystem.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM|hjXubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhjWhM}hj9ubj)}(h.``mapping`` Readahead this filesystem object. h](j)}(h ``mapping``h]jS)}(hj|h]hmapping}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM~hjvubj)}(hhh]jM)}(h!Readahead this filesystem object.h]h!Readahead this filesystem object.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM~hjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjhM~hj9ubj)}(h*``ra`` File readahead state. May be NULL.h](j)}(h``ra``h]jS)}(hjh]hra}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM~hjubj)}(hhh]jM)}(h#File readahead state. May be NULL.h]h#File readahead state. May be NULL.}(hjΏhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjˏubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjʏhM~hj9ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj#hhubjM)}(hA readahead request is for consecutive pages. Filesystems which implement the ->readahead method should call readahead_folio() or __readahead_batch() in a loop and attempt to start reads into each folio in the request.h]hA readahead request is for consecutive pages. Filesystems which implement the ->readahead method should call readahead_folio() or __readahead_batch() in a loop and attempt to start reads into each folio in the request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMrhj#hhubjM)}(h\Most of the fields in this struct are private and should be accessed by the functions below.h]h\Most of the fields in this struct are private and should be accessed by the functions below.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMwhj#hhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&page_cache_sync_readahead (C function)c.page_cache_sync_readaheadhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hvoid page_cache_sync_readahead (struct address_space *mapping, struct file_ra_state *ra, struct file *file, pgoff_t index, unsigned long req_count)h]h)}(hvoid page_cache_sync_readahead(struct address_space *mapping, struct file_ra_state *ra, struct file *file, pgoff_t index, unsigned long req_count)h](j)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjShMubh)}(hpage_cache_sync_readaheadh]j)}(hpage_cache_sync_readaheadh]hpage_cache_sync_readahead}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1hhjAhhhjShMubj )}(ht(struct address_space *mapping, struct file_ra_state *ra, struct file *file, pgoff_t index, unsigned long req_count)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljhsbc.page_cache_sync_readaheadasbuh1hhj~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubjF )}(hjI h]h*}(hjΐhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj~ubj)}(hmappingh]hmapping}(hjېhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubj )}(hstruct file_ra_state *rah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h file_ra_stateh]h file_ra_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.page_cache_sync_readaheadasbuh1hhjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj>hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hrah]hra}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubj )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjdhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj`ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.page_cache_sync_readaheadasbuh1hhj`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj`ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjבhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԑubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjّmodnameN classnameNjpjs)}jv]jc.page_cache_sync_readaheadasbuh1hhjБubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjБubj)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjБubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubj )}(hunsigned long req_counth](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h req_counth]h req_count}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubeh}(h]h ]h"]h$]h&]jjuh1j hjAhhhjShMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj=hhhjShMubah}(h]j8ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjShMhj:hhubj4)}(hhh]jM)}(hgeneric file readaheadh]hgeneric file readahead}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj{hhubah}(h]h ]h"]h$]h&]uh1j3hj:hhhjShMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhj#hNhNubj)}(hX{**Parameters** ``struct address_space *mapping`` address_space which holds the pagecache and I/O vectors ``struct file_ra_state *ra`` file_ra_state which holds the readahead state ``struct file *file`` Used by the filesystem for authentication. ``pgoff_t index`` Index of first page to be read. ``unsigned long req_count`` Total number of pages being read by the caller. **Description** page_cache_sync_readahead() should be called when a cache miss happened: it will submit the read. The readahead logic may decide to piggyback more pages onto the read request if access patterns suggest it will improve performance.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh](j)}(hZ``struct address_space *mapping`` address_space which holds the pagecache and I/O vectors h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(h7address_space which holds the pagecache and I/O vectorsh]h7address_space which holds the pagecache and I/O vectors}(hjؒhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjԒhMhjՒubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjԒhMhjubj)}(hK``struct file_ra_state *ra`` file_ra_state which holds the readahead state h](j)}(h``struct file_ra_state *ra``h]jS)}(hjh]hstruct file_ra_state *ra}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(h-file_ra_state which holds the readahead stateh]h-file_ra_state which holds the readahead state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(hA``struct file *file`` Used by the filesystem for authentication. h](j)}(h``struct file *file``h]jS)}(hj1h]hstruct file *file}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj+ubj)}(hhh]jM)}(h*Used by the filesystem for authentication.h]h*Used by the filesystem for authentication.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjFhMhjGubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjubj)}(h2``pgoff_t index`` Index of first page to be read. h](j)}(h``pgoff_t index``h]jS)}(hjjh]h pgoff_t index}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjdubj)}(hhh]jM)}(hIndex of first page to be read.h]hIndex of first page to be read.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hL``unsigned long req_count`` Total number of pages being read by the caller. h](j)}(h``unsigned long req_count``h]jS)}(hjh]hunsigned long req_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(h/Total number of pages being read by the caller.h]h/Total number of pages being read by the caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjޓh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܓubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(hpage_cache_sync_readahead() should be called when a cache miss happened: it will submit the read. The readahead logic may decide to piggyback more pages onto the read request if access patterns suggest it will improve performance.h]hpage_cache_sync_readahead() should be called when a cache miss happened: it will submit the read. The readahead logic may decide to piggyback more pages onto the read request if access patterns suggest it will improve performance.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'page_cache_async_readahead (C function)c.page_cache_async_readaheadhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hvoid page_cache_async_readahead (struct address_space *mapping, struct file_ra_state *ra, struct file *file, struct folio *folio, unsigned long req_count)h]h)}(hvoid page_cache_async_readahead(struct address_space *mapping, struct file_ra_state *ra, struct file *file, struct folio *folio, unsigned long req_count)h](j)}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj1hMubh)}(hpage_cache_async_readaheadh]j)}(hpage_cache_async_readaheadh]hpage_cache_async_readahead}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj1hMubj )}(hz(struct address_space *mapping, struct file_ra_state *ra, struct file *file, struct folio *folio, unsigned long req_count)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj`hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj\ubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljFsbc.page_cache_async_readaheadasbuh1hhj\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj\ubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjXubj )}(hstruct file_ra_state *rah](j5)}(hj8h]hstruct}(hjҔhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjΔubj)}(h h]h }(hjߔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΔubh)}(hhh]j)}(h file_ra_stateh]h file_ra_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.page_cache_async_readaheadasbuh1hhjΔubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΔubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjΔubj)}(hrah]hra}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΔubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjXubj )}(hstruct file *fileh](j5)}(hj8h]hstruct}(hjBhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj>ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubh)}(hhh]j)}(hfileh]hfile}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjbmodnameN classnameNjpjs)}jv]jc.page_cache_async_readaheadasbuh1hhj>ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj>ubj)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjXubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjЕhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj͕ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjҕmodnameN classnameNjpjs)}jv]jc.page_cache_async_readaheadasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjXubj )}(hunsigned long req_counth](j)}(hunsignedh]hunsigned}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h req_counth]h req_count}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjXubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj1hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj1hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj1hMhjhhubj4)}(hhh]jM)}(hfile readahead for marked pagesh]hfile readahead for marked pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj1hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhj#hNhNubj)}(hX**Parameters** ``struct address_space *mapping`` address_space which holds the pagecache and I/O vectors ``struct file_ra_state *ra`` file_ra_state which holds the readahead state ``struct file *file`` Used by the filesystem for authentication. ``struct folio *folio`` The folio which triggered the readahead call. ``unsigned long req_count`` Total number of pages being read by the caller. **Description** page_cache_async_readahead() should be called when a page is used which is marked as PageReadahead; this is a marker to suggest that the application has used up enough of the readahead window that we should start pulling in more pages.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh](j)}(hZ``struct address_space *mapping`` address_space which holds the pagecache and I/O vectors h](j)}(h!``struct address_space *mapping``h]jS)}(hjŖh]hstruct address_space *mapping}(hjǖhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjÖubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(h7address_space which holds the pagecache and I/O vectorsh]h7address_space which holds the pagecache and I/O vectors}(hjޖhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjږhMhjۖubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjږhMhjubj)}(hK``struct file_ra_state *ra`` file_ra_state which holds the readahead state h](j)}(h``struct file_ra_state *ra``h]jS)}(hjh]hstruct file_ra_state *ra}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(h-file_ra_state which holds the readahead stateh]h-file_ra_state which holds the readahead state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``struct file *file`` Used by the filesystem for authentication. h](j)}(h``struct file *file``h]jS)}(hj7h]hstruct file *file}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj1ubj)}(hhh]jM)}(h*Used by the filesystem for authentication.h]h*Used by the filesystem for authentication.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjubj)}(hF``struct folio *folio`` The folio which triggered the readahead call. h](j)}(h``struct folio *folio``h]jS)}(hjph]hstruct folio *folio}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjjubj)}(hhh]jM)}(h-The folio which triggered the readahead call.h]h-The folio which triggered the readahead call.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hL``unsigned long req_count`` Total number of pages being read by the caller. h](j)}(h``unsigned long req_count``h]jS)}(hjh]hunsigned long req_count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubj)}(hhh]jM)}(h/Total number of pages being read by the caller.h]h/Total number of pages being read by the caller.}(hj—hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubjM)}(hpage_cache_async_readahead() should be called when a page is used which is marked as PageReadahead; this is a marker to suggest that the application has used up enough of the readahead window that we should start pulling in more pages.h]hpage_cache_async_readahead() should be called when a page is used which is marked as PageReadahead; this is a marker to suggest that the application has used up enough of the readahead window that we should start pulling in more pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_folio (C function)c.readahead_foliohNtauh1hhj#hhhNhNubh)}(hhh](h)}(h@struct folio * readahead_folio (struct readahead_control *ractl)h]h)}(h>struct folio *readahead_folio(struct readahead_control *ractl)h](j5)}(hj8h]hstruct}(hj)hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj%hhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhj6hMubh)}(hhh]j)}(hfolioh]hfolio}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjJmodnameN classnameNjpjs)}jv]jy)}jlreadahead_foliosbc.readahead_folioasbuh1hhj%hhhj6hMubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhj6hMubjF )}(hjI h]h*}(hjwhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj%hhhj6hMubh)}(hreadahead_folioh]j)}(hjfh]hreadahead_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj%hhhj6hMubj )}(h!(struct readahead_control *ractl)h]j )}(hstruct readahead_control *ractlh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hreadahead_controlh]hreadahead_control}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjØmodnameN classnameNjpjs)}jv]jdc.readahead_folioasbuh1hhjubj)}(h h]h }(hjߘhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hractlh]hractl}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj%hhhj6hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj!hhhj6hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj6hMhjhhubj4)}(hhh]jM)}(hGet the next folio to read.h]hGet the next folio to read.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj!hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj6hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj<jHj<jIjJjKuh1hhhhj#hNhNubj)}(hX **Parameters** ``struct readahead_control *ractl`` The current readahead request. **Context** The folio is locked. The caller should unlock the folio once all I/O to that folio has completed. **Return** A pointer to the next folio, or ``NULL`` if we are done.h](jM)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj@ubj)}(hhh]j)}(hC``struct readahead_control *ractl`` The current readahead request. h](j)}(h#``struct readahead_control *ractl``h]jS)}(hjeh]hstruct readahead_control *ractl}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj_ubj)}(hhh]jM)}(hThe current readahead request.h]hThe current readahead request.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMhj\ubah}(h]h ]h"]h$]h&]uh1jhj@ubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj@ubjM)}(hbThe folio is locked. The caller should unlock the folio once all I/O to that folio has completed.h]hbThe folio is locked. The caller should unlock the folio once all I/O to that folio has completed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj@ubjM)}(h **Return**h]j)}(hjǙh]hReturn}(hjəhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjřubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj@ubjM)}(h8A pointer to the next folio, or ``NULL`` if we are done.h](h A pointer to the next folio, or }(hjݙhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjݙubh if we are done.}(hjݙhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_pos (C function)c.readahead_poshNtauh1hhj#hhhNhNubh)}(hhh](h)}(h:loff_t readahead_pos (const struct readahead_control *rac)h]h)}(h9loff_t readahead_pos(const struct readahead_control *rac)h](h)}(hhh]j)}(hloff_th]hloff_t}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj#modnameN classnameNjpjs)}jv]jy)}jl readahead_possbc.readahead_posasbuh1hhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM ubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjBhM ubh)}(h readahead_posh]j)}(hj?h]h readahead_pos}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjBhM ubj )}(h%(const struct readahead_control *rac)h]j )}(h#const struct readahead_control *rach](j5)}(hjh]hconst}(hjphhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjlubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubh)}(hhh]j)}(hreadahead_controlh]hreadahead_control}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j=c.readahead_posasbuh1hhjlubj)}(h h]h }(hjǚhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubjF )}(hjI h]h*}(hj՚hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjlubj)}(hrach]hrac}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjBhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjBhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjBhM hjhhubj4)}(hhh]jM)}(h8The byte offset into the file of this readahead request.h]h8The byte offset into the file of this readahead request.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM hj hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjBhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj$jHj$jIjJjKuh1hhhhj#hNhNubj)}(hP**Parameters** ``const struct readahead_control *rac`` The readahead request.h](jM)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhj(ubj)}(hhh]j)}(h>``const struct readahead_control *rac`` The readahead request.h](j)}(h'``const struct readahead_control *rac``h]jS)}(hjMh]h#const struct readahead_control *rac}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjKubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjGubj)}(hhh]jM)}(hThe readahead request.h]hThe readahead request.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjcubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_length (C function)c.readahead_lengthhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h=size_t readahead_length (const struct readahead_control *rac)h]h)}(h``const struct readahead_control *rac`` The readahead request.h](j)}(h'``const struct readahead_control *rac``h]jS)}(hj֜h]h#const struct readahead_control *rac}(hj؜hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjԜubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjМubj)}(hhh]jM)}(hThe readahead request.h]hThe readahead request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjМubeh}(h]h ]h"]h$]h&]uh1jhjhMhj͜ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_index (C function)c.readahead_indexhNtauh1hhj#hhhNhNubh)}(hhh](h)}(h=pgoff_t readahead_index (const struct readahead_control *rac)h]h)}(hubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM#hj:ubj)}(hhh]j)}(h>``const struct readahead_control *rac`` The readahead request.h](j)}(h'``const struct readahead_control *rac``h]jS)}(hj_h]h#const struct readahead_control *rac}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM%hjYubj)}(hhh]jM)}(hThe readahead request.h]hThe readahead request.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM hjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthM%hjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hreadahead_count (C function)c.readahead_counthNtauh1hhj#hhhNhNubh)}(hhh](h)}(hBunsigned int readahead_count (const struct readahead_control *rac)h]h)}(hAunsigned int readahead_count(const struct readahead_control *rac)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM(ubj)}(h h]h }(hjȞhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjǞhM(ubj)}(hinth]hint}(hj֞hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjǞhM(ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjǞhM(ubh)}(hreadahead_counth]j)}(hreadahead_counth]hreadahead_count}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjǞhM(ubj )}(h%(const struct readahead_control *rac)h]j )}(h#const struct readahead_control *rach](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj-hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hreadahead_controlh]hreadahead_control}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjMmodnameN classnameNjpjs)}jv]jy)}jljsbc.readahead_countasbuh1hhjubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjyhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hrach]hrac}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjǞhM(ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjǞhM(ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjǞhM(hjhhubj4)}(hhh]jM)}(h.The number of pages in this readahead request.h]h.The number of pages in this readahead request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM(hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjǞhM(ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjȟjHjȟjIjJjKuh1hhhhj#hNhNubj)}(hP**Parameters** ``const struct readahead_control *rac`` The readahead request.h](jM)}(h**Parameters**h]j)}(hjҟh]h Parameters}(hjԟhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjПubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM,hj̟ubj)}(hhh]j)}(h>``const struct readahead_control *rac`` The readahead request.h](j)}(h'``const struct readahead_control *rac``h]jS)}(hjh]h#const struct readahead_control *rac}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM.hjubj)}(hhh]jM)}(hThe readahead request.h]hThe readahead request.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM)hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjubah}(h]h ]h"]h$]h&]uh1jhj̟ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#readahead_batch_length (C function)c.readahead_batch_lengthhNtauh1hhj#hhhNhNubh)}(hhh](h)}(hCsize_t readahead_batch_length (const struct readahead_control *rac)h]h)}(hBsize_t readahead_batch_length(const struct readahead_control *rac)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjPmodnameN classnameNjpjs)}jv]jy)}jlreadahead_batch_lengthsbc.readahead_batch_lengthasbuh1hhjGhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM1ubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGhhhjohM1ubh)}(hreadahead_batch_lengthh]j)}(hjlh]hreadahead_batch_length}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjGhhhjohM1ubj )}(h%(const struct readahead_control *rac)h]j )}(h#const struct readahead_control *rach](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjŠhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hreadahead_controlh]hreadahead_control}(hj֠hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӠubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjؠmodnameN classnameNjpjs)}jv]jjc.readahead_batch_lengthasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hrach]hrac}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjGhhhjohM1ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjChhhjohM1ubah}(h]j>ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjohM1hj@hhubj4)}(hhh]jM)}(h)The number of bytes in the current batch.h]h)The number of bytes in the current batch.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM1hj6hhubah}(h]h ]h"]h$]h&]uh1j3hj@hhhjohM1ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjQjHjQjIjJjKuh1hhhhj#hNhNubj)}(hP**Parameters** ``const struct readahead_control *rac`` The readahead request.h](jM)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM5hjUubj)}(hhh]j)}(h>``const struct readahead_control *rac`` The readahead request.h](j)}(h'``const struct readahead_control *rac``h]jS)}(hjzh]h#const struct readahead_control *rac}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM7hjtubj)}(hhh]jM)}(hThe readahead request.h]hThe readahead request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM2hjubah}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jhjhM7hjqubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)folio_mkwrite_check_truncate (C function)c.folio_mkwrite_check_truncatehNtauh1hhj#hhhNhNubh)}(hhh](h)}(h[ssize_t folio_mkwrite_check_truncate (const struct folio *folio, const struct inode *inode)h]h)}(hZssize_t folio_mkwrite_check_truncate(const struct folio *folio, const struct inode *inode)h](h)}(hhh]j)}(hssize_th]hssize_t}(hjסhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԡubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj١modnameN classnameNjpjs)}jv]jy)}jlfolio_mkwrite_check_truncatesbc.folio_mkwrite_check_truncateasbuh1hhjСhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjСhhhjhM@ubh)}(hfolio_mkwrite_check_truncateh]j)}(hjh]hfolio_mkwrite_check_truncate}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjСhhhjhM@ubj )}(h6(const struct folio *folio, const struct inode *inode)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj&hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj"ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj5)}(hj8h]hstruct}(hjAhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj"ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubh)}(hhh]j)}(hfolioh]hfolio}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjamodnameN classnameNjpjs)}jv]jc.folio_mkwrite_check_truncateasbuh1hhj"ubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj"ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst struct inode *inodeh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj̢hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj٢hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.folio_mkwrite_check_truncateasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hinodeh]hinode}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjСhhhjhM@ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj̡hhhjhM@ubah}(h]jǡah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM@hjɡhhubj4)}(hhh]jM)}(hcheck if folio was truncatedh]hcheck if folio was truncated}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM@hjJhhubah}(h]h ]h"]h$]h&]uh1j3hjɡhhhjhM@ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjejHjejIjJjKuh1hhhhj#hNhNubj)}(h**Parameters** ``const struct folio *folio`` the folio to check ``const struct inode *inode`` the inode to check the folio against **Return** the number of bytes in the folio up to EOF, or -EFAULT if the folio was truncated.h](jM)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMDhjiubj)}(hhh](j)}(h1``const struct folio *folio`` the folio to check h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMAhjubj)}(hhh]jM)}(hthe folio to checkh]hthe folio to check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMAhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMAhjubj)}(hC``const struct inode *inode`` the inode to check the folio against h](j)}(h``const struct inode *inode``h]jS)}(hjǣh]hconst struct inode *inode}(hjɣhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjţubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMBhjubj)}(hhh]jM)}(h$the inode to check the folio againsth]h$the inode to check the folio against}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjܣhMBhjݣubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjܣhMBhjubeh}(h]h ]h"]h$]h&]uh1jhjiubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMDhjiubjM)}(hRthe number of bytes in the folio up to EOF, or -EFAULT if the folio was truncated.h]hRthe number of bytes in the folio up to EOF, or -EFAULT if the folio was truncated.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMDhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi_blocks_per_folio (C function)c.i_blocks_per_foliohNtauh1hhj#hhhNhNubh)}(hhh](h)}(hVunsigned int i_blocks_per_folio (const struct inode *inode, const struct folio *folio)h]h)}(hUunsigned int i_blocks_per_folio(const struct inode *inode, const struct folio *folio)h](j)}(hunsignedh]hunsigned}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM\ubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjUhM\ubj)}(hinth]hint}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjUhM\ubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjUhM\ubh)}(hi_blocks_per_folioh]j)}(hi_blocks_per_folioh]hi_blocks_per_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjChhhjUhM\ubj )}(h6(const struct inode *inode, const struct folio *folio)h](j )}(hconst struct inode *inodeh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjȤhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hinodeh]hinode}(hj٤hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֤ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjۤmodnameN classnameNjpjs)}jv]jy)}jljsbc.i_blocks_per_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj-hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj)ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj5)}(hj8h]hstruct}(hjHhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj)ubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(hfolioh]hfolio}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjhmodnameN classnameNjpjs)}jv]jc.i_blocks_per_folioasbuh1hhj)ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj)ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjChhhjUhM\ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj?hhhjUhM\ubah}(h]j:ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjUhM\hj<hhubj4)}(hhh]jM)}(h"How many blocks fit in this folio.h]h"How many blocks fit in this folio.}(hjɥhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM\hjƥhhubah}(h]h ]h"]h$]h&]uh1j3hj<hhhjUhM\ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhj#hNhNubj)}(hXy**Parameters** ``const struct inode *inode`` The inode which contains the blocks. ``const struct folio *folio`` The folio. **Description** If the block size is larger than the size of this folio, return zero. **Context** The caller should hold a refcount on the folio to prevent it from being split. **Return** The number of filesystem blocks covered by this folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM`hjubj)}(hhh](j)}(hC``const struct inode *inode`` The inode which contains the blocks. h](j)}(h``const struct inode *inode``h]jS)}(hj h]hconst struct inode *inode}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM]hjubj)}(hhh]jM)}(h$The inode which contains the blocks.h]h$The inode which contains the blocks.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM]hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM]hjubj)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjCh]hconst struct folio *folio}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjAubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM^hj=ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjXhM^hjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhjXhM^hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj~h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM`hjubjM)}(hEIf the block size is larger than the size of this folio, return zero.h]hEIf the block size is larger than the size of this folio, return zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhM_hjubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMahjubjM)}(hNThe caller should hold a refcount on the folio to prevent it from being split.h]hNThe caller should hold a refcount on the folio to prevent it from being split.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMbhjubjM)}(h **Return**h]j)}(hj̦h]hReturn}(hjΦhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjʦubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMehjubjM)}(h6The number of filesystem blocks covered by this folio.h]h6The number of filesystem blocks covered by this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:86: ./include/linux/pagemap.hhMdhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubeh}(h]truncateah ]h"]truncateah$]h&]uh1hhjhhhhhKQubeh}(h]file-mapping-and-page-cacheah ]h"]file mapping and page cacheah$]h&]uh1hhhhhhhhK8ubh)}(hhh](h)}(h Memory poolsh]h Memory pools}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKZubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_exit (C function)c.mempool_exithNtauh1hhjhhhNhNubh)}(hhh](h)}(h(void mempool_exit (struct mempool *pool)h]h)}(h'void mempool_exit(struct mempool *pool)h](j)}(hvoidh]hvoid}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhj@hKubh)}(h mempool_exith]j)}(h mempool_exith]h mempool_exit}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1hhj.hhhj@hKubj )}(h(struct mempool *pool)h]j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hjohhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjkubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljUsbc.mempool_exitasbuh1hhjkubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjkubj)}(hpoolh]hpool}(hjȧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjgubah}(h]h ]h"]h$]h&]jjuh1j hj.hhhj@hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj*hhhj@hKubah}(h]j%ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj@hKhj'hhubj4)}(hhh]jM)}(h.exit a mempool initialized with mempool_init()h]h.exit a mempool initialized with mempool_init()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hj'hhhj@hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hXS**Parameters** ``struct mempool *pool`` pointer to the memory pool which was initialized with mempool_init(). **Description** Free all reserved elements in **pool** and **pool** itself. This function only sleeps if the free_fn() function sleeps. May be called on a zeroed but uninitialized mempool (i.e. allocated with kzalloc()).h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjubj)}(hhh]j)}(h_``struct mempool *pool`` pointer to the memory pool which was initialized with mempool_init(). h](j)}(h``struct mempool *pool``h]jS)}(hj3h]hstruct mempool *pool}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhj-ubj)}(hhh]jM)}(hEpointer to the memory pool which was initialized with mempool_init().h]hEpointer to the memory pool which was initialized with mempool_init().}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjIubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhjHhKhj*ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjoh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjubjM)}(hxFree all reserved elements in **pool** and **pool** itself. This function only sleeps if the free_fn() function sleeps.h](hFree all reserved elements in }(hjhhhNhNubj)}(h**pool**h]hpool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**pool**h]hpool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhE itself. This function only sleeps if the free_fn() function sleeps.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjubjM)}(hTMay be called on a zeroed but uninitialized mempool (i.e. allocated with kzalloc()).h]hTMay be called on a zeroed but uninitialized mempool (i.e. allocated with kzalloc()).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_destroy (C function)c.mempool_destroyhNtauh1hhjhhhNhNubh)}(hhh](h)}(h+void mempool_destroy (struct mempool *pool)h]h)}(h*void mempool_destroy(struct mempool *pool)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubh)}(hmempool_destroyh]j)}(hmempool_destroyh]hmempool_destroy}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKubj )}(h(struct mempool *pool)h]j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hj$hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hmempoolh]hmempool}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjDmodnameN classnameNjpjs)}jv]jy)}jlj sbc.mempool_destroyasbuh1hhj ubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjphhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hpoolh]hpool}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjߨhhhjhKubah}(h]jڨah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjܨhhubj4)}(hhh]jM)}(hdeallocate a memory poolh]hdeallocate a memory pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjܨhhhjhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mempool *pool`` pointer to the memory pool which was allocated via mempool_create(). **Description** Free all reserved elements in **pool** and **pool** itself. This function only sleeps if the free_fn() function sleeps.h](jM)}(h**Parameters**h]j)}(hjɩh]h Parameters}(hj˩hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjǩubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjéubj)}(hhh]j)}(h^``struct mempool *pool`` pointer to the memory pool which was allocated via mempool_create(). h](j)}(h``struct mempool *pool``h]jS)}(hjh]hstruct mempool *pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjubj)}(hhh]jM)}(hDpointer to the memory pool which was allocated via mempool_create().h]hDpointer to the memory pool which was allocated via mempool_create().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjߩubah}(h]h ]h"]h$]h&]uh1jhjéubjM)}(h**Description**h]j)}(hj$h]h Description}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjéubjM)}(hxFree all reserved elements in **pool** and **pool** itself. This function only sleeps if the free_fn() function sleeps.h](hFree all reserved elements in }(hj:hhhNhNubj)}(h**pool**h]hpool}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh and }(hj:hhhNhNubj)}(h**pool**h]hpool}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubhE itself. This function only sleeps if the free_fn() function sleeps.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chKhjéubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_init (C function)c.mempool_inithNtauh1hhjhhhNhNubh)}(hhh](h)}(hxint mempool_init (struct mempool *pool, int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data)h]h)}(hwint mempool_init(struct mempool *pool, int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h mempool_inith]j)}(h mempool_inith]h mempool_init}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hg(struct mempool *pool, int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data)h](j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hjʪhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjƪubj)}(h h]h }(hjתhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƪubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mempool_initasbuh1hhjƪubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƪubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjƪubj)}(hpoolh]hpool}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƪubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjªubj )}(h int min_nrh](j)}(hinth]hint}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hmin_nrh]hmin_nr}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjªubj )}(hmempool_alloc_t *alloc_fnh](h)}(hhh]j)}(hmempool_alloc_th]hmempool_alloc_t}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjvmodnameN classnameNjpjs)}jv]jc.mempool_initasbuh1hhjmubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjmubj)}(halloc_fnh]halloc_fn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjªubj )}(hmempool_free_t *free_fnh](h)}(hhh]j)}(hmempool_free_th]hmempool_free_t}(hjɫhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƫubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj˫modnameN classnameNjpjs)}jv]jc.mempool_initasbuh1hhj«ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj«ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj«ubj)}(hfree_fnh]hfree_fn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj«ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjªubj )}(hvoid *pool_datah](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj7hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h pool_datah]h pool_data}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjªubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hinitialize a memory poolh]hinitialize a memory pool}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjkhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXM**Parameters** ``struct mempool *pool`` pointer to the memory pool that should be initialized ``int min_nr`` the minimum number of elements guaranteed to be allocated for this pool. ``mempool_alloc_t *alloc_fn`` user-defined element-allocation function. ``mempool_free_t *free_fn`` user-defined element-freeing function. ``void *pool_data`` optional private data available to the user-defined functions. **Description** Like mempool_create(), but initializes the pool in (i.e. embedded in another structure). **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM!hjubj)}(hhh](j)}(hO``struct mempool *pool`` pointer to the memory pool that should be initialized h](j)}(h``struct mempool *pool``h]jS)}(hjh]hstruct mempool *pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubj)}(hhh]jM)}(h5pointer to the memory pool that should be initializedh]h5pointer to the memory pool that should be initialized}(hjȬhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjĬhMhjŬubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjĬhMhjubj)}(hX``int min_nr`` the minimum number of elements guaranteed to be allocated for this pool. h](j)}(h``int min_nr``h]jS)}(hjh]h int min_nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM hjubj)}(hhh]jM)}(hHthe minimum number of elements guaranteed to be allocated for this pool.h]hHthe minimum number of elements guaranteed to be allocated for this pool.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hH``mempool_alloc_t *alloc_fn`` user-defined element-allocation function. h](j)}(h``mempool_alloc_t *alloc_fn``h]jS)}(hj"h]hmempool_alloc_t *alloc_fn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM!hjubj)}(hhh]jM)}(h)user-defined element-allocation function.h]h)user-defined element-allocation function.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj7hM!hj8ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj7hM!hjubj)}(hC``mempool_free_t *free_fn`` user-defined element-freeing function. h](j)}(h``mempool_free_t *free_fn``h]jS)}(hj[h]hmempool_free_t *free_fn}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjYubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM"hjUubj)}(hhh]jM)}(h&user-defined element-freeing function.h]h&user-defined element-freeing function.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjphM"hjqubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjphM"hjubj)}(hS``void *pool_data`` optional private data available to the user-defined functions. h](j)}(h``void *pool_data``h]jS)}(hjh]hvoid *pool_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM#hjubj)}(hhh]jM)}(h>optional private data available to the user-defined functions.h]h>optional private data available to the user-defined functions.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM#hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM#hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjϭh]h Description}(hjѭhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjͭubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM%hjubjM)}(hXLike mempool_create(), but initializes the pool in (i.e. embedded in another structure).h]hXLike mempool_create(), but initializes the pool in (i.e. embedded in another structure).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM$hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM'hjubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubh+ on success, negative error code otherwise.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM(hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h mempool_create_node (C function)c.mempool_create_nodehNtauh1hhjhhhNhNubh)}(hhh](h)}(hstruct mempool * mempool_create_node (int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data, gfp_t gfp_mask, int node_id)h]h)}(hstruct mempool *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data, gfp_t gfp_mask, int node_id)h](j5)}(hj8h]hstruct}(hjIhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjEhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM5ubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEhhhjVhM5ubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]jy)}jlmempool_create_nodesbc.mempool_create_nodeasbuh1hhjEhhhjVhM5ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEhhhjVhM5ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjEhhhjVhM5ubh)}(hmempool_create_nodeh]j)}(hjh]hmempool_create_node}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjEhhhjVhM5ubj )}(hn(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void *pool_data, gfp_t gfp_mask, int node_id)h](j )}(h int min_nrh](j)}(hinth]hint}(hjîhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjѮhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmin_nrh]hmin_nr}(hj߮hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hmempool_alloc_t *alloc_fnh](h)}(hhh]j)}(hmempool_alloc_th]hmempool_alloc_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mempool_create_nodeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj'hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(halloc_fnh]halloc_fn}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hmempool_free_t *free_fnh](h)}(hhh]j)}(hmempool_free_th]hmempool_free_t}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjRmodnameN classnameNjpjs)}jv]jc.mempool_create_nodeasbuh1hhjIubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubjF )}(hjI h]h*}(hj|hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjIubj)}(hfree_fnh]hfree_fn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hvoid *pool_datah](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h pool_datah]h pool_data}(hj˯hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mempool_create_nodeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h int node_idh](j)}(hinth]hint}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hnode_idh]hnode_id}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjEhhhjVhM5ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjAhhhjVhM5ubah}(h]j<ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjVhM5hj>hhubj4)}(hhh]jM)}(hcreate a memory poolh]hcreate a memory pool}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM5hjohhubah}(h]h ]h"]h$]h&]uh1j3hj>hhhjVhM5ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXJ**Parameters** ``int min_nr`` the minimum number of elements guaranteed to be allocated for this pool. ``mempool_alloc_t *alloc_fn`` user-defined element-allocation function. ``mempool_free_t *free_fn`` user-defined element-freeing function. ``void *pool_data`` optional private data available to the user-defined functions. ``gfp_t gfp_mask`` memory allocation flags ``int node_id`` numa node to allocate on **Description** this function creates and allocates a guaranteed size, preallocated memory pool. The pool can be used from the mempool_alloc() and mempool_free() functions. This function might sleep. Both the alloc_fn() and the free_fn() functions might sleep - as long as the mempool_alloc() function is not called from IRQ contexts. **Return** pointer to the created memory pool object or ``NULL`` on error.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM9hjubj)}(hhh](j)}(hX``int min_nr`` the minimum number of elements guaranteed to be allocated for this pool. h](j)}(h``int min_nr``h]jS)}(hjh]h int min_nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM7hjubj)}(hhh]jM)}(hHthe minimum number of elements guaranteed to be allocated for this pool.h]hHthe minimum number of elements guaranteed to be allocated for this pool.}(hj̰hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM6hjɰubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjȰhM7hjubj)}(hH``mempool_alloc_t *alloc_fn`` user-defined element-allocation function. h](j)}(h``mempool_alloc_t *alloc_fn``h]jS)}(hjh]hmempool_alloc_t *alloc_fn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM8hjubj)}(hhh]jM)}(h)user-defined element-allocation function.h]h)user-defined element-allocation function.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM8hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM8hjubj)}(hC``mempool_free_t *free_fn`` user-defined element-freeing function. h](j)}(h``mempool_free_t *free_fn``h]jS)}(hj&h]hmempool_free_t *free_fn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj$ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM9hj ubj)}(hhh]jM)}(h&user-defined element-freeing function.h]h&user-defined element-freeing function.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;hM9hj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj;hM9hjubj)}(hS``void *pool_data`` optional private data available to the user-defined functions. h](j)}(h``void *pool_data``h]jS)}(hj_h]hvoid *pool_data}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM:hjYubj)}(hhh]jM)}(h>optional private data available to the user-defined functions.h]h>optional private data available to the user-defined functions.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjthM:hjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthM:hjubj)}(h+``gfp_t gfp_mask`` memory allocation flags h](j)}(h``gfp_t gfp_mask``h]jS)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM;hjubj)}(hhh]jM)}(hmemory allocation flagsh]hmemory allocation flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM;hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM;hjubj)}(h)``int node_id`` numa node to allocate on h](j)}(h``int node_id``h]jS)}(hjѱh]h int node_id}(hjӱhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjϱubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM<hj˱ubj)}(hhh]jM)}(hnuma node to allocate onh]hnuma node to allocate on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM<hjubah}(h]h ]h"]h$]h&]uh1jhj˱ubeh}(h]h ]h"]h$]h&]uh1jhjhM<hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM>hjubjM)}(hX>this function creates and allocates a guaranteed size, preallocated memory pool. The pool can be used from the mempool_alloc() and mempool_free() functions. This function might sleep. Both the alloc_fn() and the free_fn() functions might sleep - as long as the mempool_alloc() function is not called from IRQ contexts.h]hX>this function creates and allocates a guaranteed size, preallocated memory pool. The pool can be used from the mempool_alloc() and mempool_free() functions. This function might sleep. Both the alloc_fn() and the free_fn() functions might sleep - as long as the mempool_alloc() function is not called from IRQ contexts.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM=hjubjM)}(h **Return**h]j)}(hj3h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMChjubjM)}(h?pointer to the created memory pool object or ``NULL`` on error.h](h-pointer to the created memory pool object or }(hjIhhhNhNubjS)}(h``NULL``h]hNULL}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjIubh on error.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMDhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_resize (C function)c.mempool_resizehNtauh1hhjhhhNhNubh)}(hhh](h)}(h9int mempool_resize (struct mempool *pool, int new_min_nr)h]h)}(h8int mempool_resize(struct mempool *pool, int new_min_nr)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM[ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM[ubh)}(hmempool_resizeh]j)}(hmempool_resizeh]hmempool_resize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM[ubj )}(h&(struct mempool *pool, int new_min_nr)h](j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hjDzhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjòubj)}(h h]h }(hjԲhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjòubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mempool_resizeasbuh1hhjòubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjòubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjòubj)}(hpoolh]hpool}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjòubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hint new_min_nrh](j)}(hinth]hint}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(h new_min_nrh]h new_min_nr}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM[ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM[ubah}(h]j}ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM[hjhhubj4)}(hhh]jM)}(hresize an existing memory poolh]hresize an existing memory pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM[hj|hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM[ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mempool *pool`` pointer to the memory pool which was allocated via mempool_create(). ``int new_min_nr`` the new minimum number of elements guaranteed to be allocated for this pool. **Description** This function shrinks/grows the pool. In the case of growing, it cannot be guaranteed that the pool will be grown to the new size immediately, but new mempool_free() calls will refill it. This function may sleep. Note, the caller must guarantee that no mempool_destroy is called while this function is running. mempool_alloc() & mempool_free() might be called (eg. from IRQ contexts) while this function executes. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM_hjubj)}(hhh](j)}(h^``struct mempool *pool`` pointer to the memory pool which was allocated via mempool_create(). h](j)}(h``struct mempool *pool``h]jS)}(hjh]hstruct mempool *pool}(hj³hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM]hjubj)}(hhh]jM)}(hDpointer to the memory pool which was allocated via mempool_create().h]hDpointer to the memory pool which was allocated via mempool_create().}(hjٳhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM\hjֳubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjճhM]hjubj)}(h```int new_min_nr`` the new minimum number of elements guaranteed to be allocated for this pool. h](j)}(h``int new_min_nr``h]jS)}(hjh]hint new_min_nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM_hjubj)}(hhh]jM)}(hLthe new minimum number of elements guaranteed to be allocated for this pool.h]hLthe new minimum number of elements guaranteed to be allocated for this pool.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM^hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM_hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj6h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMahjubjM)}(hThis function shrinks/grows the pool. In the case of growing, it cannot be guaranteed that the pool will be grown to the new size immediately, but new mempool_free() calls will refill it. This function may sleep.h]hThis function shrinks/grows the pool. In the case of growing, it cannot be guaranteed that the pool will be grown to the new size immediately, but new mempool_free() calls will refill it. This function may sleep.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM`hjubjM)}(hNote, the caller must guarantee that no mempool_destroy is called while this function is running. mempool_alloc() & mempool_free() might be called (eg. from IRQ contexts) while this function executes.h]hNote, the caller must guarantee that no mempool_destroy is called while this function is running. mempool_alloc() & mempool_free() might be called (eg. from IRQ contexts) while this function executes.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMehjubjM)}(h **Return**h]j)}(hjlh]hReturn}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMihjubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh+ on success, negative error code otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMjhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_alloc_bulk (C function)c.mempool_alloc_bulkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hOint mempool_alloc_bulk (struct mempool *pool, void **elems, unsigned int count)h]h)}(hNint mempool_alloc_bulk(struct mempool *pool, void **elems, unsigned int count)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMubj)}(h h]h }(hjδhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjʹhMubh)}(hmempool_alloc_bulkh]j)}(hmempool_alloc_bulkh]hmempool_alloc_bulk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjܴubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjʹhMubj )}(h8(struct mempool *pool, void **elems, unsigned int count)h](j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mempool_alloc_bulkasbuh1hhjubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjHhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpoolh]hpool}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h void **elemsh](j)}(hvoidh]hvoid}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjjubj)}(helemsh]helems}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int counth](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj˵hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjٵhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjʹhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjʹhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjʹhMhjhhubj4)}(hhh]jM)}(h-allocate multiple elements from a memory poolh]h-allocate multiple elements from a memory pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjʹhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj7jHj7jIjJjKuh1hhhhjhNhNubj)}(hXN**Parameters** ``struct mempool *pool`` pointer to the memory pool ``void **elems`` partially or fully populated elements array ``unsigned int count`` number of entries in **elem** that need to be allocated **Description** Allocate **count** elements into **elems**. This is done by first calling into the alloc_fn supplied at pool initialization time, and dipping into the reserved pool when alloc_fn fails to allocate an element. On return all **count** elements in **elems** will be populated. **Return** Always 0. If it wasn't for %$#^$ alloc tags, it would return void.h](jM)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj;ubj)}(hhh](j)}(h4``struct mempool *pool`` pointer to the memory pool h](j)}(h``struct mempool *pool``h]jS)}(hj`h]hstruct mempool *pool}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjZubj)}(hhh]jM)}(hpointer to the memory poolh]hpointer to the memory pool}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjuhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjWubj)}(h=``void **elems`` partially or fully populated elements array h](j)}(h``void **elems``h]jS)}(hjh]h void **elems}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubj)}(hhh]jM)}(h+partially or fully populated elements arrayh]h+partially or fully populated elements array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjWubj)}(hO``unsigned int count`` number of entries in **elem** that need to be allocated h](j)}(h``unsigned int count``h]jS)}(hjҶh]hunsigned int count}(hjԶhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjжubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj̶ubj)}(hhh]jM)}(h7number of entries in **elem** that need to be allocatedh](hnumber of entries in }(hjhhhNhNubj)}(h**elem**h]helem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh that need to be allocated}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj̶ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjWubeh}(h]h ]h"]h$]h&]uh1jhj;ubjM)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj;ubjM)}(hAllocate **count** elements into **elems**. This is done by first calling into the alloc_fn supplied at pool initialization time, and dipping into the reserved pool when alloc_fn fails to allocate an element.h](h Allocate }(hj5hhhNhNubj)}(h **count**h]hcount}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh elements into }(hj5hhhNhNubj)}(h **elems**h]helems}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh. This is done by first calling into the alloc_fn supplied at pool initialization time, and dipping into the reserved pool when alloc_fn fails to allocate an element.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj;ubjM)}(h@On return all **count** elements in **elems** will be populated.h](hOn return all }(hjhhhhNhNubj)}(h **count**h]hcount}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh elements in }(hjhhhhNhNubj)}(h **elems**h]helems}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh will be populated.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj;ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj;ubjM)}(hCAlways 0. If it wasn't for %$#^$ alloc tags, it would return void.h]hEAlways 0. If it wasn’t for %$#^$ alloc tags, it would return void.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_alloc (C function)c.mempool_allochNtauh1hhjhhhNhNubh)}(hhh](h)}(h;void * mempool_alloc (struct mempool *pool, gfp_t gfp_mask)h]h)}(h9void *mempool_alloc(struct mempool *pool, gfp_t gfp_mask)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj޷hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj޷hhhjhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj޷hhhjhMubh)}(h mempool_alloch]j)}(h mempool_alloch]h mempool_alloc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj޷hhhjhMubj )}(h&(struct mempool *pool, gfp_t gfp_mask)h](j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hj,hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh)}(hhh]j)}(hmempoolh]hmempool}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjLmodnameN classnameNjpjs)}jv]jy)}jljsbc.mempool_allocasbuh1hhj(ubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF )}(hjI h]h*}(hjxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(ubj)}(hpoolh]hpool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jfc.mempool_allocasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfp_maskh]hgfp_mask}(hj͸hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubeh}(h]h ]h"]h$]h&]jjuh1j hj޷hhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjڷhhhjhMubah}(h]jշah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhj׷hhubj4)}(hhh]jM)}(h&allocate an element from a memory poolh]h&allocate an element from a memory pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj׷hhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mempool *pool`` pointer to the memory pool ``gfp_t gfp_mask`` GFP_* flags. ``__GFP_ZERO`` is not supported. **Description** Allocate an element from **pool**. This is done by first calling into the alloc_fn supplied at pool initialization time, and dipping into the reserved pool when alloc_fn fails to allocate an element. This function only sleeps if the alloc_fn callback sleeps, or when waiting for elements to become available in the pool. **Return** pointer to the allocated element or ``NULL`` when failing to allocate an element. Allocation failure can only happen when **gfp_mask** does not include ``__GFP_DIRECT_RECLAIM``.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM#hjubj)}(hhh](j)}(h4``struct mempool *pool`` pointer to the memory pool h](j)}(h``struct mempool *pool``h]jS)}(hj8h]hstruct mempool *pool}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM hj2ubj)}(hhh]jM)}(hpointer to the memory poolh]hpointer to the memory pool}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjMhM hjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhM hj/ubj)}(hB``gfp_t gfp_mask`` GFP_* flags. ``__GFP_ZERO`` is not supported. h](j)}(h``gfp_t gfp_mask``h]jS)}(hjqh]hgfp_t gfp_mask}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM!hjkubj)}(hhh]jM)}(h.GFP_* flags. ``__GFP_ZERO`` is not supported.h](hGFP_* flags. }(hjhhhNhNubjS)}(h``__GFP_ZERO``h]h __GFP_ZERO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh is not supported.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhM!hj/ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM#hjubjM)}(hAllocate an element from **pool**. This is done by first calling into the alloc_fn supplied at pool initialization time, and dipping into the reserved pool when alloc_fn fails to allocate an element.h](hAllocate an element from }(hjԹhhhNhNubj)}(h**pool**h]hpool}(hjܹhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԹubh. This is done by first calling into the alloc_fn supplied at pool initialization time, and dipping into the reserved pool when alloc_fn fails to allocate an element.}(hjԹhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM"hjubjM)}(hxThis function only sleeps if the alloc_fn callback sleeps, or when waiting for elements to become available in the pool.h]hxThis function only sleeps if the alloc_fn callback sleeps, or when waiting for elements to become available in the pool.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM&hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM)hjubjM)}(hpointer to the allocated element or ``NULL`` when failing to allocate an element. Allocation failure can only happen when **gfp_mask** does not include ``__GFP_DIRECT_RECLAIM``.h](h$pointer to the allocated element or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhO when failing to allocate an element. Allocation failure can only happen when }(hjhhhNhNubj)}(h **gfp_mask**h]hgfp_mask}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh does not include }(hjhhhNhNubjS)}(h``__GFP_DIRECT_RECLAIM``h]h__GFP_DIRECT_RECLAIM}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM*hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'mempool_alloc_preallocated (C function)c.mempool_alloc_preallocatedhNtauh1hhjhhhNhNubh)}(hhh](h)}(h8void * mempool_alloc_preallocated (struct mempool *pool)h]h)}(h6void *mempool_alloc_preallocated(struct mempool *pool)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhjhMWubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj}hhhjhMWubh)}(hmempool_alloc_preallocatedh]j)}(hmempool_alloc_preallocatedh]hmempool_alloc_preallocated}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj}hhhjhMWubj )}(h(struct mempool *pool)h]j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hj˺hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjǺubj)}(h h]h }(hjغhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǺubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mempool_alloc_preallocatedasbuh1hhjǺubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǺubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjǺubj)}(hpoolh]hpool}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjǺubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjúubah}(h]h ]h"]h$]h&]jjuh1j hj}hhhjhMWubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjyhhhjhMWubah}(h]jtah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMWhjvhhubj4)}(hhh]jM)}(hIallocate an element from preallocated elements belonging to a memory poolh]hIallocate an element from preallocated elements belonging to a memory pool}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMWhjKhhubah}(h]h ]h"]h$]h&]uh1j3hjvhhhjhMWubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjfjHjfjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mempool *pool`` pointer to the memory pool **Description** This function is similar to mempool_alloc(), but it only attempts allocating an element from the preallocated elements. It only takes a single spinlock_t and immediately returns if no preallocated elements are available. **Return** pointer to the allocated element or ``NULL`` if no elements are available.h](jM)}(h**Parameters**h]j)}(hjph]h Parameters}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM[hjjubj)}(hhh]j)}(h4``struct mempool *pool`` pointer to the memory pool h](j)}(h``struct mempool *pool``h]jS)}(hjh]hstruct mempool *pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMYhjubj)}(hhh]jM)}(hpointer to the memory poolh]hpointer to the memory pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjjubjM)}(h**Description**h]j)}(hjʻh]h Description}(hj̻hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȻubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM[hjjubjM)}(hThis function is similar to mempool_alloc(), but it only attempts allocating an element from the preallocated elements. It only takes a single spinlock_t and immediately returns if no preallocated elements are available.h]hThis function is similar to mempool_alloc(), but it only attempts allocating an element from the preallocated elements. It only takes a single spinlock_t and immediately returns if no preallocated elements are available.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMZhjjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM^hjjubjM)}(hJpointer to the allocated element or ``NULL`` if no elements are available.h](h$pointer to the allocated element or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh if no elements are available.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chM_hjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_free_bulk (C function)c.mempool_free_bulkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hWunsigned int mempool_free_bulk (struct mempool *pool, void **elems, unsigned int count)h]h)}(hVunsigned int mempool_free_bulk(struct mempool *pool, void **elems, unsigned int count)h](j)}(hunsignedh]hunsigned}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMlubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjVhMlubj)}(hinth]hint}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjVhMlubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjVhMlubh)}(hmempool_free_bulkh]j)}(hmempool_free_bulkh]hmempool_free_bulk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjDhhhjVhMlubj )}(h8(struct mempool *pool, void **elems, unsigned int count)h](j )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hmempoolh]hmempool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mempool_free_bulkasbuh1hhjubj)}(h h]h }(hj߼hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpoolh]hpool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h void **elemsh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj/hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hjI h]h*}(hj<hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(helemsh]helems}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int counth](j)}(hunsignedh]hunsigned}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hinth]hint}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjDhhhjVhMlubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj@hhhjVhMlubah}(h]j;ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjVhMlhj=hhubj4)}(hhh]jM)}(hreturn elements to a mempoolh]hreturn elements to a mempool}(hjĽhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMlhjhhubah}(h]h ]h"]h$]h&]uh1j3hj=hhhjVhMlubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjܽjHjܽjIjJjKuh1hhhhjhNhNubj)}(hXS**Parameters** ``struct mempool *pool`` pointer to the memory pool ``void **elems`` elements to return ``unsigned int count`` number of elements to return **Description** Returns a number of elements from the start of **elem** to **pool** if **pool** needs replenishing and sets their slots in **elem** to NULL. Other elements are left in **elem**. **Return** number of elements transferred to **pool**. Elements are always transferred from the beginning of **elem**, so the return value can be used as an offset into **elem** for the freeing the remaining elements in the caller.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMphjubj)}(hhh](j)}(h4``struct mempool *pool`` pointer to the memory pool h](j)}(h``struct mempool *pool``h]jS)}(hjh]hstruct mempool *pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMmhjubj)}(hhh]jM)}(hpointer to the memory poolh]hpointer to the memory pool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMmhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMmhjubj)}(h$``void **elems`` elements to return h](j)}(h``void **elems``h]jS)}(hj>h]h void **elems}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMnhj8ubj)}(hhh]jM)}(helements to returnh]helements to return}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjShMnhjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjShMnhjubj)}(h4``unsigned int count`` number of elements to return h](j)}(h``unsigned int count``h]jS)}(hjwh]hunsigned int count}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjuubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMohjqubj)}(hhh]jM)}(hnumber of elements to returnh]hnumber of elements to return}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMohjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjhMohjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMqhjubjM)}(hReturns a number of elements from the start of **elem** to **pool** if **pool** needs replenishing and sets their slots in **elem** to NULL. Other elements are left in **elem**.h](h/Returns a number of elements from the start of }(hjȾhhhNhNubj)}(h**elem**h]helem}(hjоhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȾubh to }(hjȾhhhNhNubj)}(h**pool**h]hpool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȾubh if }(hjȾhhhNhNubj)}(h**pool**h]hpool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȾubh, needs replenishing and sets their slots in }(hjȾhhhNhNubj)}(h**elem**h]helem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȾubh& to NULL. Other elements are left in }(hjȾhhhNhNubj)}(h**elem**h]helem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȾubh.}(hjȾhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMphjubjM)}(h **Return**h]j)}(hj3h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMthjubjM)}(hnumber of elements transferred to **pool**. Elements are always transferred from the beginning of **elem**, so the return value can be used as an offset into **elem** for the freeing the remaining elements in the caller.h](h"number of elements transferred to }(hjIhhhNhNubj)}(h**pool**h]hpool}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh9. Elements are always transferred from the beginning of }(hjIhhhNhNubj)}(h**elem**h]helem}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh4, so the return value can be used as an offset into }(hjIhhhNhNubj)}(h**elem**h]helem}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh6 for the freeing the remaining elements in the caller.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMuhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmempool_free (C function)c.mempool_freehNtauh1hhjhhhNhNubh)}(hhh](h)}(h7void mempool_free (void *element, struct mempool *pool)h]h)}(h6void mempool_free(void *element, struct mempool *pool)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h mempool_freeh]j)}(h mempool_freeh]h mempool_free}(hjϿhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj˿ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h%(void *element, struct mempool *pool)h](j )}(h void *elementh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(helementh]helement}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mempool *poolh](j5)}(hj8h]hstruct}(hj-hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj)ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(hmempoolh]hmempool}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjMmodnameN classnameNjpjs)}jv]jy)}jljѿsbc.mempool_freeasbuh1hhj)ubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubjF )}(hjI h]h*}(hjyhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj)ubj)}(hpoolh]hpool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hreturn an element to the pool.h]hreturn an element to the pool.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX)**Parameters** ``void *element`` element to return ``struct mempool *pool`` pointer to the memory pool **Description** Returns **element** to **pool** if it needs replenishing, else frees it using the free_fn callback in **pool**. This function only sleeps if the free_fn callback sleeps.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubj)}(hhh](j)}(h$``void *element`` element to return h](j)}(h``void *element``h]jS)}(hjh]h void *element}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubj)}(hhh]jM)}(helement to returnh]helement to return}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h4``struct mempool *pool`` pointer to the memory pool h](j)}(h``struct mempool *pool``h]jS)}(hj*h]hstruct mempool *pool}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj(ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhj$ubj)}(hhh]jM)}(hpointer to the memory poolh]hpointer to the memory pool}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj?hMhj@ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjeh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubjM)}(hoReturns **element** to **pool** if it needs replenishing, else frees it using the free_fn callback in **pool**.h](hReturns }(hj{hhhNhNubj)}(h **element**h]helement}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh to }(hj{hhhNhNubj)}(h**pool**h]hpool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubhG if it needs replenishing, else frees it using the free_fn callback in }(hj{hhhNhNubj)}(h**pool**h]hpool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubh.}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubjM)}(h9This function only sleeps if the free_fn callback sleeps.h]h9This function only sleeps if the free_fn callback sleeps.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:92: ./mm/mempool.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] memory-poolsah ]h"] memory poolsah$]h&]uh1hhhhhhhhKZubh)}(hhh](h)}(h More Memory Management Functionsh]h More Memory Management Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK`ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"zap_special_vma_range (C function)c.zap_special_vma_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hbvoid zap_special_vma_range (struct vm_area_struct *vma, unsigned long address, unsigned long size)h]h)}(havoid zap_special_vma_range(struct vm_area_struct *vma, unsigned long address, unsigned long size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMO ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMO ubh)}(hzap_special_vma_rangeh]j)}(hzap_special_vma_rangeh]hzap_special_vma_range}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMO ubj )}(hG(struct vm_area_struct *vma, unsigned long address, unsigned long size)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjEhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjAubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjemodnameN classnameNjpjs)}jv]jy)}jlj+sbc.zap_special_vma_rangeasbuh1hhjAubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjAubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubj )}(hunsigned long addressh](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)}(haddressh]haddress}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubj )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMO ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMO ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMO hjhhubj4)}(hhh]jM)}(h1zap all page table entries in a special vma rangeh]h1zap all page table entries in a special vma range}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMO hjghhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMO ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXj**Parameters** ``struct vm_area_struct *vma`` the vma covering the range to zap ``unsigned long address`` starting address of the range to zap ``unsigned long size`` number of bytes to zap **Description** This function does nothing when the provided address range is not fully contained in **vma**, or when the **vma** is not VM_PFNMAP or VM_MIXEDMAP.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMS hjubj)}(hhh](j)}(hA``struct vm_area_struct *vma`` the vma covering the range to zap h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMP hjubj)}(hhh]jM)}(h!the vma covering the range to zaph]h!the vma covering the range to zap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMP hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMP hjubj)}(h?``unsigned long address`` starting address of the range to zap h](j)}(h``unsigned long address``h]jS)}(hjh]hunsigned long address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMQ hjubj)}(hhh]jM)}(h$starting address of the range to zaph]h$starting address of the range to zap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMQ hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMQ hjubj)}(h.``unsigned long size`` number of bytes to zap h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMR hjubj)}(hhh]jM)}(hnumber of bytes to zaph]hnumber of bytes to zap}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2hMR hj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj2hMR hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjXh]h Description}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMT hjubjM)}(hThis function does nothing when the provided address range is not fully contained in **vma**, or when the **vma** is not VM_PFNMAP or VM_MIXEDMAP.h](hUThis function does nothing when the provided address range is not fully contained in }(hjnhhhNhNubj)}(h**vma**h]hvma}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh, or when the }(hjnhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh! is not VM_PFNMAP or VM_MIXEDMAP.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMS hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvm_insert_pages (C function)c.vm_insert_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hmint vm_insert_pages (struct vm_area_struct *vma, unsigned long addr, struct page **pages, unsigned long *num)h]h)}(hlint vm_insert_pages(struct vm_area_struct *vma, unsigned long addr, struct page **pages, unsigned long *num)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM9 ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM9 ubh)}(hvm_insert_pagesh]j)}(hvm_insert_pagesh]hvm_insert_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM9 ubj )}(hY(struct vm_area_struct *vma, unsigned long addr, struct page **pages, unsigned long *num)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.vm_insert_pagesasbuh1hhjubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjJhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page **pagesh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j8c.vm_insert_pagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpagesh]hpages}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long *numh](j)}(hunsignedh]hunsigned}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hlongh]hlong}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubjF )}(hjI h]h*}(hjvhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj:ubj)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM9 ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM9 ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM9 hjhhubj4)}(hhh]jM)}(h;insert multiple pages into user vma, batching the pmd lock.h]h;insert multiple pages into user vma, batching the pmd lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM9 hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM9 ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXP**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``unsigned long addr`` target start user address of these pages ``struct page **pages`` source kernel pages ``unsigned long *num`` in: number of pages to map. out: number of pages that were *not* mapped. (0 means all pages were successfully mapped). **Description** Preferred over vm_insert_page() when inserting multiple pages. In case of error, we may have mapped a subset of the provided pages. It is the caller's responsibility to account for this case. The same restrictions apply as in vm_insert_page().h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM= hjubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM: hjubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM: hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM: hjubj)}(h@``unsigned long addr`` target start user address of these pages h](j)}(h``unsigned long addr``h]jS)}(hj'h]hunsigned long addr}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM; hj!ubj)}(hhh]jM)}(h(target start user address of these pagesh]h(target start user address of these pages}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hM; hj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hM; hjubj)}(h,``struct page **pages`` source kernel pages h](j)}(h``struct page **pages``h]jS)}(hj`h]hstruct page **pages}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM< hjZubj)}(hhh]jM)}(hsource kernel pagesh]hsource kernel pages}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjuhM< hjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhM< hjubj)}(h``unsigned long *num`` in: number of pages to map. out: number of pages that were *not* mapped. (0 means all pages were successfully mapped). h](j)}(h``unsigned long *num``h]jS)}(hjh]hunsigned long *num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM> hjubj)}(hhh]jM)}(hvin: number of pages to map. out: number of pages that were *not* mapped. (0 means all pages were successfully mapped).h](h;in: number of pages to map. out: number of pages that were }(hjhhhNhNubjB)}(h*not*h]hnot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jAhjubh6 mapped. (0 means all pages were successfully mapped).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM= hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM> hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM@ hjubjM)}(h>Preferred over vm_insert_page() when inserting multiple pages.h]h>Preferred over vm_insert_page() when inserting multiple pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM? hjubjM)}(hIn case of error, we may have mapped a subset of the provided pages. It is the caller's responsibility to account for this case.h]hIn case of error, we may have mapped a subset of the provided pages. It is the caller’s responsibility to account for this case.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMA hjubjM)}(h3The same restrictions apply as in vm_insert_page().h]h3The same restrictions apply as in vm_insert_page().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMD hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvm_insert_page (C function)c.vm_insert_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(hVint vm_insert_page (struct vm_area_struct *vma, unsigned long addr, struct page *page)h]h)}(hUint vm_insert_page(struct vm_area_struct *vma, unsigned long addr, struct page *page)h](j)}(hinth]hint}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM{ ubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFhhhjXhM{ ubh)}(hvm_insert_pageh]j)}(hvm_insert_pageh]hvm_insert_page}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1hhjFhhhjXhM{ ubj )}(hC(struct vm_area_struct *vma, unsigned long addr, struct page *page)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljmsbc.vm_insert_pageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](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)}(haddrh]haddr}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjJhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjFubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(hpageh]hpage}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]jc.vm_insert_pageasbuh1hhjFubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjFubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjFhhhjXhM{ ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjBhhhjXhM{ ubah}(h]j=ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjXhM{ hj?hhubj4)}(hhh]jM)}(h insert single page into user vmah]h insert single page into user vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM{ hjhhubah}(h]h ]h"]h$]h&]uh1j3hj?hhhjXhM{ ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``unsigned long addr`` target user address of this page ``struct page *page`` source kernel page **Description** This allows drivers to insert individual pages they've allocated into a user vma. The zeropage is supported in some VMAs, see vm_mixed_zeropage_allowed(). The page has to be a nice clean _individual_ kernel allocation. If you allocate a compound page, you need to have marked it as such (__GFP_COMP), or manually just split the page up yourself (see split_page()). NOTE! Traditionally this was done with "remap_pfn_range()" which took an arbitrary page protection parameter. This doesn't allow that. Your vma protection will have to be set up correctly, which means that if you want a shared writable mapping, you'd better ask for a shared writable mapping! The page does not need to be reserved. Usually this function is called from f_op->mmap() handler under mm->mmap_lock write-lock, so it can change vma->vm_flags. Caller must set VM_MIXEDMAP on vma if it wants to call this function from other places, for example from page-fault handler. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj h]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM| hjubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!hM| hj"ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj!hM| hjubj)}(h8``unsigned long addr`` target user address of this page h](j)}(h``unsigned long addr``h]jS)}(hjEh]hunsigned long addr}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM} hj?ubj)}(hhh]jM)}(h target user address of this pageh]h target user address of this page}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhM} hj[ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhM} hjubj)}(h)``struct page *page`` source kernel page h](j)}(h``struct page *page``h]jS)}(hj~h]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj|ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM~ hjxubj)}(hhh]jM)}(hsource kernel pageh]hsource kernel page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM~ hjubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jhjhM~ hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(hThis allows drivers to insert individual pages they've allocated into a user vma. The zeropage is supported in some VMAs, see vm_mixed_zeropage_allowed().h]hThis allows drivers to insert individual pages they’ve allocated into a user vma. The zeropage is supported in some VMAs, see vm_mixed_zeropage_allowed().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(hThe page has to be a nice clean _individual_ kernel allocation. If you allocate a compound page, you need to have marked it as such (__GFP_COMP), or manually just split the page up yourself (see split_page()).h]hThe page has to be a nice clean _individual_ kernel allocation. If you allocate a compound page, you need to have marked it as such (__GFP_COMP), or manually just split the page up yourself (see split_page()).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(hX$NOTE! Traditionally this was done with "remap_pfn_range()" which took an arbitrary page protection parameter. This doesn't allow that. Your vma protection will have to be set up correctly, which means that if you want a shared writable mapping, you'd better ask for a shared writable mapping!h]hX,NOTE! Traditionally this was done with “remap_pfn_range()” which took an arbitrary page protection parameter. This doesn’t allow that. Your vma protection will have to be set up correctly, which means that if you want a shared writable mapping, you’d better ask for a shared writable mapping!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h&The page does not need to be reserved.h]h&The page does not need to be reserved.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(hUsually this function is called from f_op->mmap() handler under mm->mmap_lock write-lock, so it can change vma->vm_flags. Caller must set VM_MIXEDMAP on vma if it wants to call this function from other places, for example from page-fault handler.h]hUsually this function is called from f_op->mmap() handler under mm->mmap_lock write-lock, so it can change vma->vm_flags. Caller must set VM_MIXEDMAP on vma if it wants to call this function from other places, for example from page-fault handler.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubh+ on success, negative error code otherwise.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvm_map_pages (C function)c.vm_map_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hUint vm_map_pages (struct vm_area_struct *vma, struct page **pages, unsigned long num)h]h)}(hTint vm_map_pages(struct vm_area_struct *vma, struct page **pages, unsigned long num)h](j)}(hinth]hint}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhj}hM ubh)}(h vm_map_pagesh]j)}(h vm_map_pagesh]h vm_map_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjkhhhj}hM ubj )}(hD(struct vm_area_struct *vma, struct page **pages, unsigned long num)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.vm_map_pagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page **pagesh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj>modnameN classnameNjpjs)}jv]jc.vm_map_pagesasbuh1hhjubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hjI h]h*}(hjuhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpagesh]hpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long numh](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)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjkhhhj}hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjghhhj}hM ubah}(h]jbah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj}hM hjdhhubj4)}(hhh]jM)}(h6maps range of kernel pages starts with non zero offseth]h6maps range of kernel pages starts with non zero offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjdhhhj}hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``struct page **pages`` pointer to array of source kernel pages ``unsigned long num`` number of pages in page array **Description** Maps an object consisting of **num** pages, catering for the user's requested vm_pgoff If we fail to insert any page into the vma, the function will return immediately leaving any previously inserted pages present. Callers from the mmap handler may immediately return the error as their caller will destroy the vma, removing any successfully inserted pages. Other callers should make their own arrangements for calling unmap_region(). **Context** Process context. Called by mmap handlers. **Return** 0 on success and error code otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj>h]hstruct vm_area_struct *vma}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hj8ubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjShM hjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjShM hj5ubj)}(h@``struct page **pages`` pointer to array of source kernel pages h](j)}(h``struct page **pages``h]jS)}(hjwh]hstruct page **pages}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjuubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjqubj)}(hhh]jM)}(h'pointer to array of source kernel pagesh]h'pointer to array of source kernel pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjhM hj5ubj)}(h4``unsigned long num`` number of pages in page array h](j)}(h``unsigned long num``h]jS)}(hjh]hunsigned long num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(hnumber of pages in page arrayh]hnumber of pages in page array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj5ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(hVMaps an object consisting of **num** pages, catering for the user's requested vm_pgoffh](hMaps an object consisting of }(hjhhhNhNubj)}(h**num**h]hnum}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh4 pages, catering for the user’s requested vm_pgoff}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(hX\If we fail to insert any page into the vma, the function will return immediately leaving any previously inserted pages present. Callers from the mmap handler may immediately return the error as their caller will destroy the vma, removing any successfully inserted pages. Other callers should make their own arrangements for calling unmap_region().h]hX\If we fail to insert any page into the vma, the function will return immediately leaving any previously inserted pages present. Callers from the mmap handler may immediately return the error as their caller will destroy the vma, removing any successfully inserted pages. Other callers should make their own arrangements for calling unmap_region().}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h **Context**h]j)}(hj3h]hContext}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h)Process context. Called by mmap handlers.h]h)Process context. Called by mmap handlers.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h **Return**h]j)}(hjZh]hReturn}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h&0 on success and error code otherwise.h]h&0 on success and error code otherwise.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvm_map_pages_zero (C function)c.vm_map_pages_zerohNtauh1hhjhhhNhNubh)}(hhh](h)}(hZint vm_map_pages_zero (struct vm_area_struct *vma, struct page **pages, unsigned long num)h]h)}(hYint vm_map_pages_zero(struct vm_area_struct *vma, struct page **pages, unsigned long num)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hvm_map_pages_zeroh]j)}(hvm_map_pages_zeroh]hvm_map_pages_zero}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(hD(struct vm_area_struct *vma, struct page **pages, unsigned long num)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.vm_map_pages_zeroasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj(hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page **pagesh](j5)}(hj8h]hstruct}(hjNhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjJubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubh)}(hhh]j)}(hpageh]hpage}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjnmodnameN classnameNjpjs)}jv]jc.vm_map_pages_zeroasbuh1hhjJubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjJubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjJubj)}(hpagesh]hpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long numh](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)}(hnumh]hnum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h1map range of kernel pages starts with zero offseth]h1map range of kernel pages starts with zero offset}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hj*hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjEjHjEjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``struct page **pages`` pointer to array of source kernel pages ``unsigned long num`` number of pages in page array **Description** Similar to vm_map_pages(), except that it explicitly sets the offset to 0. This function is intended for the drivers that did not consider vm_pgoff. **Context** Process context. Called by mmap handlers. **Return** 0 on success and error code otherwise.h](jM)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjnh]hstruct vm_area_struct *vma}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjlubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjhubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhM hjeubj)}(h@``struct page **pages`` pointer to array of source kernel pages h](j)}(h``struct page **pages``h]jS)}(hjh]hstruct page **pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(h'pointer to array of source kernel pagesh]h'pointer to array of source kernel pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjeubj)}(h4``unsigned long num`` number of pages in page array h](j)}(h``unsigned long num``h]jS)}(hjh]hunsigned long num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(hnumber of pages in page arrayh]hnumber of pages in page array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjeubeh}(h]h ]h"]h$]h&]uh1jhjIubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubjM)}(hSimilar to vm_map_pages(), except that it explicitly sets the offset to 0. This function is intended for the drivers that did not consider vm_pgoff.h]hSimilar to vm_map_pages(), except that it explicitly sets the offset to 0. This function is intended for the drivers that did not consider vm_pgoff.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubjM)}(h **Context**h]j)}(hjBh]hContext}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubjM)}(h)Process context. Called by mmap handlers.h]h)Process context. Called by mmap handlers.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubjM)}(h **Return**h]j)}(hjih]hReturn}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubjM)}(h&0 on success and error code otherwise.h]h&0 on success and error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h vmf_insert_pfn_prot (C function)c.vmf_insert_pfn_prothNtauh1hhjhhhNhNubh)}(hhh](h)}(hsvm_fault_t vmf_insert_pfn_prot (struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, pgprot_t pgprot)h]h)}(hrvm_fault_t vmf_insert_pfn_prot(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, pgprot_t pgprot)h](h)}(hhh]j)}(h vm_fault_th]h vm_fault_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvmf_insert_pfn_protsbc.vmf_insert_pfn_protasbuh1hhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM% ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM% ubh)}(hvmf_insert_pfn_proth]j)}(hjh]hvmf_insert_pfn_prot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM% ubj )}(hT(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, pgprot_t pgprot)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jc.vmf_insert_pfn_protasbuh1hhjubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjJhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hpgprot_t pgproth](h)}(hhh]j)}(hpgprot_th]hpgprot_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.vmf_insert_pfn_protasbuh1hhjubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpgproth]hpgprot}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM% ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM% ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM% hjhhubj4)}(hhh]jM)}(h5insert single pfn into user vma with specified pgproth]h5insert single pfn into user vma with specified pgprot}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM% hjhhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM% ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``unsigned long addr`` target user address of this page ``unsigned long pfn`` source kernel pfn ``pgprot_t pgprot`` pgprot flags for the inserted page **Description** This is exactly like vmf_insert_pfn(), except that it allows drivers to override pgprot on a per-page basis. This only makes sense for IO mappings, and it makes no sense for COW mappings. In general, using multiple vmas is preferable; vmf_insert_pfn_prot should only be used if using multiple VMAs is impractical. pgprot typically only differs from **vma->vm_page_prot** when drivers set caching- and encryption bits different than those of **vma->vm_page_prot**, because the caching- or encryption mode may not be known at mmap() time. This is ok as long as **vma->vm_page_prot** is not used by the core vm to set caching and encryption bits for those vmas (except for COW pages). This is ensured by core vm only modifying these page table entries using functions that don't touch caching- or encryption bits, using pte_modify() if needed. (See for example mprotect()). Also when new page-table entries are created, this is only done using the fault() callback, and never using the value of vma->vm_page_prot, except for page-table entries that point to anonymous pages as the result of COW. **Context** Process context. May allocate using ``GFP_KERNEL``. **Return** vm_fault_t value.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM) hjubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM& hjubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM& hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM& hjubj)}(h8``unsigned long addr`` target user address of this page h](j)}(h``unsigned long addr``h]jS)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM' hjubj)}(hhh]jM)}(h target user address of this pageh]h target user address of this page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM' hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM' hjubj)}(h(``unsigned long pfn`` source kernel pfn h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM( hjubj)}(hhh]jM)}(hsource kernel pfnh]hsource kernel pfn}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hM( hj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hM( hjubj)}(h7``pgprot_t pgprot`` pgprot flags for the inserted page h](j)}(h``pgprot_t pgprot``h]jS)}(hjWh]hpgprot_t pgprot}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM) hjQubj)}(hhh]jM)}(h"pgprot flags for the inserted pageh]h"pgprot flags for the inserted page}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhM) hjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhM) hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM+ hjubjM)}(hlThis is exactly like vmf_insert_pfn(), except that it allows drivers to override pgprot on a per-page basis.h]hlThis is exactly like vmf_insert_pfn(), except that it allows drivers to override pgprot on a per-page basis.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM* hjubjM)}(hThis only makes sense for IO mappings, and it makes no sense for COW mappings. In general, using multiple vmas is preferable; vmf_insert_pfn_prot should only be used if using multiple VMAs is impractical.h]hThis only makes sense for IO mappings, and it makes no sense for COW mappings. In general, using multiple vmas is preferable; vmf_insert_pfn_prot should only be used if using multiple VMAs is impractical.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM- hjubjM)}(hpgprot typically only differs from **vma->vm_page_prot** when drivers set caching- and encryption bits different than those of **vma->vm_page_prot**, because the caching- or encryption mode may not be known at mmap() time.h](h#pgprot typically only differs from }(hjhhhNhNubj)}(h**vma->vm_page_prot**h]hvma->vm_page_prot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhG when drivers set caching- and encryption bits different than those of }(hjhhhNhNubj)}(h**vma->vm_page_prot**h]hvma->vm_page_prot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhJ, because the caching- or encryption mode may not be known at mmap() time.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM2 hjubjM)}(hXMThis is ok as long as **vma->vm_page_prot** is not used by the core vm to set caching and encryption bits for those vmas (except for COW pages). This is ensured by core vm only modifying these page table entries using functions that don't touch caching- or encryption bits, using pte_modify() if needed. (See for example mprotect()).h](hThis is ok as long as }(hjhhhNhNubj)}(h**vma->vm_page_prot**h]hvma->vm_page_prot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX$ is not used by the core vm to set caching and encryption bits for those vmas (except for COW pages). This is ensured by core vm only modifying these page table entries using functions that don’t touch caching- or encryption bits, using pte_modify() if needed. (See for example mprotect()).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM6 hjubjM)}(hAlso when new page-table entries are created, this is only done using the fault() callback, and never using the value of vma->vm_page_prot, except for page-table entries that point to anonymous pages as the result of COW.h]hAlso when new page-table entries are created, this is only done using the fault() callback, and never using the value of vma->vm_page_prot, except for page-table entries that point to anonymous pages as the result of COW.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM< hjubjM)}(h **Context**h]j)}(hj+h]hContext}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMA hjubjM)}(h4Process context. May allocate using ``GFP_KERNEL``.h](h%Process context. May allocate using }(hjAhhhNhNubjS)}(h``GFP_KERNEL``h]h GFP_KERNEL}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjAubh.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMB hjubjM)}(h **Return**h]j)}(hjdh]hReturn}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMD hjubjM)}(hvm_fault_t value.h]hvm_fault_t value.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMC hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmf_insert_pfn (C function)c.vmf_insert_pfnhNtauh1hhjhhhNhNubh)}(hhh](h)}(h]vm_fault_t vmf_insert_pfn (struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)h]h)}(h\vm_fault_t vmf_insert_pfn(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)h](h)}(hhh]j)}(h vm_fault_th]h vm_fault_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvmf_insert_pfnsbc.vmf_insert_pfnasbuh1hhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMa ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMa ubh)}(hvmf_insert_pfnh]j)}(hjh]hvmf_insert_pfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMa ubj )}(hC(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.vmf_insert_pfnasbuh1hhjubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjEhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMa ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMa ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMa hjhhubj4)}(hhh]jM)}(hinsert single pfn into user vmah]hinsert single pfn into user vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMa hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMa ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj6jHj6jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``unsigned long addr`` target user address of this page ``unsigned long pfn`` source kernel pfn **Description** Similar to vm_insert_page, this allows drivers to insert individual pages they've allocated into a user vma. Same comments apply. This function should only be called from a vm_ops->fault handler, and in that case the handler should return the result of this function. vma cannot be a COW mapping. As this is called only for pages that do not currently exist, we do not need to flush old virtual caches or the TLB. **Context** Process context. May allocate using ``GFP_KERNEL``. **Return** vm_fault_t value.h](jM)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMe hj:ubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj_h]hstruct vm_area_struct *vma}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMb hjYubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjthMb hjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthMb hjVubj)}(h8``unsigned long addr`` target user address of this page h](j)}(h``unsigned long addr``h]jS)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMc hjubj)}(hhh]jM)}(h target user address of this pageh]h target user address of this page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMc hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMc hjVubj)}(h(``unsigned long pfn`` source kernel pfn h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMd hjubj)}(hhh]jM)}(hsource kernel pfnh]hsource kernel pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMd hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMd hjVubeh}(h]h ]h"]h$]h&]uh1jhj:ubjM)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMf hj:ubjM)}(hSimilar to vm_insert_page, this allows drivers to insert individual pages they've allocated into a user vma. Same comments apply.h]hSimilar to vm_insert_page, this allows drivers to insert individual pages they’ve allocated into a user vma. Same comments apply.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMe hj:ubjM)}(hThis function should only be called from a vm_ops->fault handler, and in that case the handler should return the result of this function.h]hThis function should only be called from a vm_ops->fault handler, and in that case the handler should return the result of this function.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMh hj:ubjM)}(hvma cannot be a COW mapping.h]hvma cannot be a COW mapping.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMk hj:ubjM)}(htAs this is called only for pages that do not currently exist, we do not need to flush old virtual caches or the TLB.h]htAs this is called only for pages that do not currently exist, we do not need to flush old virtual caches or the TLB.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMm hj:ubjM)}(h **Context**h]j)}(hj`h]hContext}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMp hj:ubjM)}(h4Process context. May allocate using ``GFP_KERNEL``.h](h%Process context. May allocate using }(hjvhhhNhNubjS)}(h``GFP_KERNEL``h]h GFP_KERNEL}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubh.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMq hj:ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMs hj:ubjM)}(hvm_fault_t value.h]hvm_fault_t value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMr hj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hremap_pfn_range (C function)c.remap_pfn_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hzint remap_pfn_range (struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t prot)h]h)}(hyint remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t prot)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hremap_pfn_rangeh]j)}(hremap_pfn_rangeh]hremap_pfn_range}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(hf(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn, unsigned long size, pgprot_t prot)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj;modnameN classnameNjpjs)}jv]jy)}jljsbc.remap_pfn_rangeasbuh1hhjubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjghhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](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)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hlongh]hlong}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hsizeh]hsize}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgprot_t proth](h)}(hhh]j)}(hpgprot_th]hpgprot_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jUc.remap_pfn_rangeasbuh1hhj|ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hproth]hprot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h remap kernel memory to userspaceh]h remap kernel memory to userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``unsigned long addr`` target page aligned user address to start at ``unsigned long pfn`` page frame number of kernel physical memory address ``unsigned long size`` size of mapping area ``pgprot_t prot`` page protection flags for this mapping **Note** this is only safe if the mm semaphore is held when called. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hM hj0ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/hM hjubj)}(hD``unsigned long addr`` target page aligned user address to start at h](j)}(h``unsigned long addr``h]jS)}(hjSh]hunsigned long addr}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjMubj)}(hhh]jM)}(h,target page aligned user address to start ath]h,target page aligned user address to start at}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhM hjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjhhM hjubj)}(hJ``unsigned long pfn`` page frame number of kernel physical memory address h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(h3page frame number of kernel physical memory addressh]h3page frame number of kernel physical memory address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h,``unsigned long size`` size of mapping area h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(hsize of mapping areah]hsize of mapping area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h9``pgprot_t prot`` page protection flags for this mapping h](j)}(h``pgprot_t prot``h]jS)}(hjh]h pgprot_t prot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubj)}(hhh]jM)}(h&page protection flags for this mappingh]h&page protection flags for this mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Note**h]j)}(hj9h]hNote}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h:this is only safe if the mm semaphore is held when called.h]h:this is only safe if the mm semaphore is held when called.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h **Return**h]j)}(hj`h]hReturn}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubh+ on success, negative error code otherwise.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvm_iomap_memory (C function)c.vm_iomap_memoryhNtauh1hhjhhhNhNubh)}(hhh](h)}(hVint vm_iomap_memory (struct vm_area_struct *vma, phys_addr_t start, unsigned long len)h]h)}(hUint vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMR ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMR ubh)}(hvm_iomap_memoryh]j)}(hvm_iomap_memoryh]hvm_iomap_memory}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMR ubj )}(hB(struct vm_area_struct *vma, phys_addr_t start, unsigned long len)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.vm_iomap_memoryasbuh1hhjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj<hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hphys_addr_t starth](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjgmodnameN classnameNjpjs)}jv]j*c.vm_iomap_memoryasbuh1hhj^ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long lenh](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)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMR ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMR ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMR hjhhubj4)}(hhh]jM)}(hremap memory to userspaceh]hremap memory to userspace}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMR hj hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMR ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj$jHj$jIjJjKuh1hhhhjhNhNubj)}(hX.**Parameters** ``struct vm_area_struct *vma`` user vma to map to ``phys_addr_t start`` start of the physical memory to be mapped ``unsigned long len`` size of area **Description** This is a simplified io_remap_pfn_range() for common driver use. The driver just needs to give us the physical memory range to be mapped, we'll figure out the rest from the vma information. NOTE! Some drivers might want to tweak vma->vm_page_prot first to get whatever write-combining details or similar. **Return** ``0`` on success, negative error code otherwise.h](jM)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMV hj(ubj)}(hhh](j)}(h2``struct vm_area_struct *vma`` user vma to map to h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjMh]hstruct vm_area_struct *vma}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjKubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMS hjGubj)}(hhh]jM)}(huser vma to map toh]huser vma to map to}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjbhMS hjcubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMS hjDubj)}(h@``phys_addr_t start`` start of the physical memory to be mapped h](j)}(h``phys_addr_t start``h]jS)}(hjh]hphys_addr_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMT hjubj)}(hhh]jM)}(h)start of the physical memory to be mappedh]h)start of the physical memory to be mapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMT hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMT hjDubj)}(h#``unsigned long len`` size of area h](j)}(h``unsigned long len``h]jS)}(hjh]hunsigned long len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMU hjubj)}(hhh]jM)}(h size of areah]h size of area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMU hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMU hjDubeh}(h]h ]h"]h$]h&]uh1jhj(ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMW hj(ubjM)}(hThis is a simplified io_remap_pfn_range() for common driver use. The driver just needs to give us the physical memory range to be mapped, we'll figure out the rest from the vma information.h]hThis is a simplified io_remap_pfn_range() for common driver use. The driver just needs to give us the physical memory range to be mapped, we’ll figure out the rest from the vma information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMV hj(ubjM)}(hrNOTE! Some drivers might want to tweak vma->vm_page_prot first to get whatever write-combining details or similar.h]hrNOTE! Some drivers might want to tweak vma->vm_page_prot first to get whatever write-combining details or similar.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMZ hj(ubjM)}(h **Return**h]j)}(hj0h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM] hj(ubjM)}(h0``0`` on success, negative error code otherwise.h](jS)}(h``0``h]h0}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFubh+ on success, negative error code otherwise.}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM^ hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h unmap_mapping_pages (C function)c.unmap_mapping_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hcvoid unmap_mapping_pages (struct address_space *mapping, pgoff_t start, pgoff_t nr, bool even_cows)h]h)}(hbvoid unmap_mapping_pages(struct address_space *mapping, pgoff_t start, pgoff_t nr, bool even_cows)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hunmap_mapping_pagesh]j)}(hunmap_mapping_pagesh]hunmap_mapping_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hJ(struct address_space *mapping, pgoff_t start, pgoff_t nr, bool even_cows)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.unmap_mapping_pagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7modnameN classnameNjpjs)}jv]jc.unmap_mapping_pagesasbuh1hhj.ubj)}(h h]h }(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hstarth]hstart}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t nrh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.unmap_mapping_pagesasbuh1hhjvubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hbool even_cowsh](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h even_cowsh]h even_cows}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj{hhhjhMubah}(h]jvah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjxhhubj4)}(hhh]jM)}(hUnmap pages from processes.h]hUnmap pages from processes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjxhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX **Parameters** ``struct address_space *mapping`` The address space containing pages to be unmapped. ``pgoff_t start`` Index of first page to be unmapped. ``pgoff_t nr`` Number of pages to be unmapped. 0 to unmap to end of file. ``bool even_cows`` Whether to unmap even private COWed pages. **Description** Unmap the pages in this address space from any userspace process which has them mmaped. Generally, you want to remove COWed pages as well when a file is being truncated, but not when invalidating pages from the page cache.h](jM)}(h**Parameters**h]j)}(hj)h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhj#ubj)}(hhh](j)}(hU``struct address_space *mapping`` The address space containing pages to be unmapped. h](j)}(h!``struct address_space *mapping``h]jS)}(hjHh]hstruct address_space *mapping}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjBubj)}(hhh]jM)}(h2The address space containing pages to be unmapped.h]h2The address space containing pages to be unmapped.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj]hMhj?ubj)}(h6``pgoff_t start`` Index of first page to be unmapped. h](j)}(h``pgoff_t start``h]jS)}(hjh]h pgoff_t start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhj{ubj)}(hhh]jM)}(h#Index of first page to be unmapped.h]h#Index of first page to be unmapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj?ubj)}(hK``pgoff_t nr`` Number of pages to be unmapped. 0 to unmap to end of file. h](j)}(h``pgoff_t nr``h]jS)}(hjh]h pgoff_t nr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h;Number of pages to be unmapped. 0 to unmap to end of file.h]h;Number of pages to be unmapped. 0 to unmap to end of file.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj?ubj)}(h>``bool even_cows`` Whether to unmap even private COWed pages. h](j)}(h``bool even_cows``h]jS)}(hjh]hbool even_cows}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h*Whether to unmap even private COWed pages.h]h*Whether to unmap even private COWed pages.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj?ubeh}(h]h ]h"]h$]h&]uh1jhj#ubjM)}(h**Description**h]j)}(hj.h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhj#ubjM)}(hUnmap the pages in this address space from any userspace process which has them mmaped. Generally, you want to remove COWed pages as well when a file is being truncated, but not when invalidating pages from the page cache.h]hUnmap the pages in this address space from any userspace process which has them mmaped. Generally, you want to remove COWed pages as well when a file is being truncated, but not when invalidating pages from the page cache.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h unmap_mapping_range (C function)c.unmap_mapping_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(huvoid unmap_mapping_range (struct address_space *mapping, loff_t const holebegin, loff_t const holelen, int even_cows)h]h)}(htvoid unmap_mapping_range(struct address_space *mapping, loff_t const holebegin, loff_t const holelen, int even_cows)h](j)}(hvoidh]hvoid}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjhMubh)}(hunmap_mapping_rangeh]j)}(hunmap_mapping_rangeh]hunmap_mapping_range}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjohhhjhMubj )}(h\(struct address_space *mapping, loff_t const holebegin, loff_t const holelen, int even_cows)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.unmap_mapping_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t const holebeginh](h)}(hhh]j)}(hloff_th]hloff_t}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj'modnameN classnameNjpjs)}jv]jc.unmap_mapping_rangeasbuh1hhjubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hjh]hconst}(hjQhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h holebeginh]h holebegin}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t const holelenh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.unmap_mapping_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hholelenh]hholelen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h int even_cowsh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h even_cowsh]h even_cows}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjohhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjkhhhjhMubah}(h]jfah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhhubj4)}(hhh]jM)}(hunmap the portion of all mmaps in the specified address_space corresponding to the specified byte range in the underlying file.h]hunmap the portion of all mmaps in the specified address_space corresponding to the specified byte range in the underlying file.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhj+hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjFjHjFjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` the address space containing mmaps to be unmapped. ``loff_t const holebegin`` byte in first page to unmap, relative to the start of the underlying file. This will be rounded down to a PAGE_SIZE boundary. Note that this is different from truncate_pagecache(), which must keep the partial page. In contrast, we must get rid of partial pages. ``loff_t const holelen`` size of prospective hole in bytes. This will be rounded up to a PAGE_SIZE boundary. A holelen of zero truncates to the end of the file. ``int even_cows`` 1 when truncating a file, unmap even private COWed pages; but 0 when invalidating pagecache, don't throw away private data.h](jM)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjJubj)}(hhh](j)}(hU``struct address_space *mapping`` the address space containing mmaps to be unmapped. h](j)}(h!``struct address_space *mapping``h]jS)}(hjoh]hstruct address_space *mapping}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjmubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjiubj)}(hhh]jM)}(h2the address space containing mmaps to be unmapped.h]h2the address space containing mmaps to be unmapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(hX$``loff_t const holebegin`` byte in first page to unmap, relative to the start of the underlying file. This will be rounded down to a PAGE_SIZE boundary. Note that this is different from truncate_pagecache(), which must keep the partial page. In contrast, we must get rid of partial pages. h](j)}(h``loff_t const holebegin``h]jS)}(hjh]hloff_t const holebegin}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(hXbyte in first page to unmap, relative to the start of the underlying file. This will be rounded down to a PAGE_SIZE boundary. Note that this is different from truncate_pagecache(), which must keep the partial page. In contrast, we must get rid of partial pages.h]hXbyte in first page to unmap, relative to the start of the underlying file. This will be rounded down to a PAGE_SIZE boundary. Note that this is different from truncate_pagecache(), which must keep the partial page. In contrast, we must get rid of partial pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h``loff_t const holelen`` size of prospective hole in bytes. This will be rounded up to a PAGE_SIZE boundary. A holelen of zero truncates to the end of the file. h](j)}(h``loff_t const holelen``h]jS)}(hjh]hloff_t const holelen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(hsize of prospective hole in bytes. This will be rounded up to a PAGE_SIZE boundary. A holelen of zero truncates to the end of the file.h]hsize of prospective hole in bytes. This will be rounded up to a PAGE_SIZE boundary. A holelen of zero truncates to the end of the file.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h``int even_cows`` 1 when truncating a file, unmap even private COWed pages; but 0 when invalidating pagecache, don't throw away private data.h](j)}(h``int even_cows``h]jS)}(hjh]h int even_cows}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h{1 when truncating a file, unmap even private COWed pages; but 0 when invalidating pagecache, don't throw away private data.h]h}1 when truncating a file, unmap even private COWed pages; but 0 when invalidating pagecache, don’t throw away private data.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1hMhj2ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjfubeh}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h follow_pfnmap_start (C function)c.follow_pfnmap_starthNtauh1hhjhhhNhNubh)}(hhh](h)}(h9int follow_pfnmap_start (struct follow_pfnmap_args *args)h]h)}(h8int follow_pfnmap_start(struct follow_pfnmap_args *args)h](j)}(hinth]hint}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMaubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhMaubh)}(hfollow_pfnmap_starth]j)}(hfollow_pfnmap_starth]hfollow_pfnmap_start}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjqhhhjhMaubj )D}(h!(struct follow_pfnmap_args *args)h]j )}(hstruct follow_pfnmap_args *argsh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfollow_pfnmap_argsh]hfollow_pfnmap_args}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.follow_pfnmap_startasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hargsh]hargs}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjqhhhjhMaubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjmhhhjhMaubah}(h]jhah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMahjjhhubj4)}(hhh]jM)}(h/Look up a pfn mapping at a user virtual addressh]h/Look up a pfn mapping at a user virtual address}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMahj2hhubah}(h]h ]h"]h$]h&]uh1j3hjjhhhjhMaubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjMjHjMjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct follow_pfnmap_args *args`` Pointer to struct **follow_pfnmap_args** **Description** The caller needs to setup args->vma and args->address to point to the virtual address as the target of such lookup. On a successful return, the results will be put into other output fields. After the caller finished using the fields, the caller must invoke another follow_pfnmap_end() to proper releases the locks and resources of such look up request. During the start() and end() calls, the results in **args** will be valid as proper locks will be held. After the end() is called, all the fields in **follow_pfnmap_args** will be invalid to be further accessed. Further use of such information after end() may require proper synchronizations by the caller with page table updates, otherwise it can create a security bug. If the PTE maps a refcounted page, callers are responsible to protect against invalidation with MMU notifiers; otherwise access to the PFN at a later point in time can trigger use-after-free. Only IO mappings and raw PFN mappings are allowed. The mmap semaphore should be taken for read, and the mmap semaphore cannot be released before the end() is invoked. This function must not be used to modify PTE content. **Return** zero on success, negative otherwise.h](jM)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMehjQubj)}(hhh]j)}(hM``struct follow_pfnmap_args *args`` Pointer to struct **follow_pfnmap_args** h](j)}(h#``struct follow_pfnmap_args *args``h]jS)}(hjvh]hstruct follow_pfnmap_args *args}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjtubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMbhjpubj)}(hhh]jM)}(h(Pointer to struct **follow_pfnmap_args**h](hPointer to struct }(hjhhhNhNubj)}(h**follow_pfnmap_args**h]hfollow_pfnmap_args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhjhMbhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhjhMbhjmubah}(h]h ]h"]h$]h&]uh1jhjQubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMdhjQubjM)}(hThe caller needs to setup args->vma and args->address to point to the virtual address as the target of such lookup. On a successful return, the results will be put into other output fields.h]hThe caller needs to setup args->vma and args->address to point to the virtual address as the target of such lookup. On a successful return, the results will be put into other output fields.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMchjQubjM)}(hAfter the caller finished using the fields, the caller must invoke another follow_pfnmap_end() to proper releases the locks and resources of such look up request.h]hAfter the caller finished using the fields, the caller must invoke another follow_pfnmap_end() to proper releases the locks and resources of such look up request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMghjQubjM)}(hXtDuring the start() and end() calls, the results in **args** will be valid as proper locks will be held. After the end() is called, all the fields in **follow_pfnmap_args** will be invalid to be further accessed. Further use of such information after end() may require proper synchronizations by the caller with page table updates, otherwise it can create a security bug.h](h3During the start() and end() calls, the results in }(hjhhhNhNubj)}(h**args**h]hargs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh[ will be valid as proper locks will be held. After the end() is called, all the fields in }(hjhhhNhNubj)}(h**follow_pfnmap_args**h]hfollow_pfnmap_args}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh will be invalid to be further accessed. Further use of such information after end() may require proper synchronizations by the caller with page table updates, otherwise it can create a security bug.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMkhjQubjM)}(hIf the PTE maps a refcounted page, callers are responsible to protect against invalidation with MMU notifiers; otherwise access to the PFN at a later point in time can trigger use-after-free.h]hIf the PTE maps a refcounted page, callers are responsible to protect against invalidation with MMU notifiers; otherwise access to the PFN at a later point in time can trigger use-after-free.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMrhjQubjM)}(hOnly IO mappings and raw PFN mappings are allowed. The mmap semaphore should be taken for read, and the mmap semaphore cannot be released before the end() is invoked.h]hOnly IO mappings and raw PFN mappings are allowed. The mmap semaphore should be taken for read, and the mmap semaphore cannot be released before the end() is invoked.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMvhjQubjM)}(h5This function must not be used to modify PTE content.h]h5This function must not be used to modify PTE content.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMzhjQubjM)}(h **Return**h]j)}(hjUh]hReturn}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM|hjQubjM)}(h$zero on success, negative otherwise.h]h$zero on success, negative otherwise.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chM}hjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfollow_pfnmap_end (C function)c.follow_pfnmap_endhNtauh1hhjhhhNhNubh)}(hhh](h)}(h8void follow_pfnmap_end (struct follow_pfnmap_args *args)h]h)}(h7void follow_pfnmap_end(struct follow_pfnmap_args *args)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfollow_pfnmap_endh]j)}(hfollow_pfnmap_endh]hfollow_pfnmap_end}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h!(struct follow_pfnmap_args *args)h]j )}(hstruct follow_pfnmap_args *argsh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfollow_pfnmap_argsh]hfollow_pfnmap_args}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.follow_pfnmap_endasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj#hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hargsh]hargs}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h#End a follow_pfnmap_start() processh]h#End a follow_pfnmap_start() process}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjWhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjrjHjrjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct follow_pfnmap_args *args`` Pointer to struct **follow_pfnmap_args** **Description** Must be used in pair of follow_pfnmap_start(). See the start() function above for more information.h](jM)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjvubj)}(hhh]j)}(hM``struct follow_pfnmap_args *args`` Pointer to struct **follow_pfnmap_args** h](j)}(h#``struct follow_pfnmap_args *args``h]jS)}(hjh]hstruct follow_pfnmap_args *args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h(Pointer to struct **follow_pfnmap_args**h](hPointer to struct }(hjhhhNhNubj)}(h**follow_pfnmap_args**h]hfollow_pfnmap_args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjvubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjvubjM)}(hdMust be used in pair of follow_pfnmap_start(). See the start() function above for more information.h]hdMust be used in pair of follow_pfnmap_start(). See the start() function above for more information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h generic_access_phys (C function)c.generic_access_physhNtauh1hhjhhhNhNubh)}(hhh](h)}(hgint generic_access_phys (struct vm_area_struct *vma, unsigned long addr, void *buf, int len, int write)h]h)}(hfint generic_access_phys(struct vm_area_struct *vma, unsigned long addr, void *buf, int len, int write)h](j)}(hinth]hint}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhj7hMubh)}(hgeneric_access_physh]j)}(hgeneric_access_physh]hgeneric_access_phys}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ](jjeh"]h$]h&]jjuh1hhj%hhhj7hMubj )}(hO(struct vm_area_struct *vma, unsigned long addr, void *buf, int len, int write)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjfhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjbubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljLsbc.generic_access_physasbuh1hhjbubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjbubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^ubj )}(hunsigned long addrh](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)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^ubj )}(h void *bufh](j)}(hvoidh]hvoid}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjF )}(hjI h]h*}(hjEhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj%ubj)}(hbufh]hbuf}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^ubj )}(hint lenh](j)}(hinth]hint}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hlenh]hlen}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^ubj )}(h int writeh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwriteh]hwrite}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj^ubeh}(h]h ]h"]h$]h&]jjuh1j hj%hhhj7hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj!hhhj7hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj7hMhjhhubj4)}(hhh]jM)}(h,generic implementation for iomem mmap accessh]h,generic implementation for iomem mmap access}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj7hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` the vma to access ``unsigned long addr`` userspace address, not relative offset within **vma** ``void *buf`` buffer to read/write ``int len`` length of transfer ``int write`` set to FOLL_WRITE when writing, otherwise reading **Description** This is a generic implementation for :c:type:`vm_operations_struct.access ` for an iomem mapping. This callback is used by access_process_vm() when the **vma** is not page based.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh](j)}(h1``struct vm_area_struct *vma`` the vma to access h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj'h]hstruct vm_area_struct *vma}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhj!ubj)}(hhh]jM)}(hthe vma to accessh]hthe vma to access}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhjubj)}(hM``unsigned long addr`` userspace address, not relative offset within **vma** h](j)}(h``unsigned long addr``h]jS)}(hj`h]hunsigned long addr}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjZubj)}(hhh]jM)}(h5userspace address, not relative offset within **vma**h](h.userspace address, not relative offset within }(hjyhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jLhjuhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjubj)}(h#``void *buf`` buffer to read/write h](j)}(h ``void *buf``h]jS)}(hjh]h void *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(hbuffer to read/writeh]hbuffer to read/write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``int len`` length of transfer h](j)}(h ``int len``h]jS)}(hjh]hint len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(hlength of transferh]hlength of transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h@``int write`` set to FOLL_WRITE when writing, otherwise reading h](j)}(h ``int write``h]jS)}(hjh]h int write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h1set to FOLL_WRITE when writing, otherwise readingh]h1set to FOLL_WRITE when writing, otherwise reading}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hMhj/ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj.hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjTh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubjM)}(hThis is a generic implementation for :c:type:`vm_operations_struct.access ` for an iomem mapping. This callback is used by access_process_vm() when the **vma** is not page based.h](h%This is a generic implementation for }(hjjhhhNhNubh)}(h<:c:type:`vm_operations_struct.access `h]jS)}(hjth]hvm_operations_struct.access}(hjvhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhjrubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1vm_operations_structuh1hhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjjubhM for an iomem mapping. This callback is used by access_process_vm() when the }(hjjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh is not page based.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hcopy_remote_vm_str (C function)c.copy_remote_vm_strhNtauh1hhjhhhNhNubh)}(hhh](h)}(hpint copy_remote_vm_str (struct task_struct *tsk, unsigned long addr, void *buf, int len, unsigned int gup_flags)h]h)}(hoint copy_remote_vm_str(struct task_struct *tsk, unsigned long addr, void *buf, int len, unsigned int gup_flags)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hcopy_remote_vm_strh]j)}(hcopy_remote_vm_strh]hcopy_remote_vm_str}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hY(struct task_struct *tsk, unsigned long addr, void *buf, int len, unsigned int gup_flags)h](j )}(hstruct task_struct *tskh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h task_structh]h task_struct}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj+modnameN classnameNjpjs)}jv]jy)}jljsbc.copy_remote_vm_strasbuh1hhjubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjWhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(htskh]htsk}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h void *bufh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hint lenh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlenh]hlen}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int gup_flagsh](j)}(hunsignedh]hunsigned}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hinth]hint}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h gup_flagsh]h gup_flags}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h3copy a string from another process's address space.h]h5copy a string from another process’s address space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct task_struct *tsk`` the task of the target address space ``unsigned long addr`` start address to read from ``void *buf`` destination buffer ``int len`` number of bytes to copy ``unsigned int gup_flags`` flags modifying lookup behaviour **Description** The caller must hold a reference on **mm**. **Return** number of bytes copied from **addr** (source) to **buf** (destination); not including the trailing NUL. Always guaranteed to leave NUL-terminated buffer. On any error, return -EFAULT.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh](j)}(hA``struct task_struct *tsk`` the task of the target address space h](j)}(h``struct task_struct *tsk``h]jS)}(hjh]hstruct task_struct *tsk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h$the task of the target address spaceh]h$the task of the target address space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h2``unsigned long addr`` start address to read from h](j)}(h``unsigned long addr``h]jS)}(hj!h]hunsigned long addr}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(hstart address to read fromh]hstart address to read from}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubj)}(h!``void *buf`` destination buffer h](j)}(h ``void *buf``h]jS)}(hjZh]h void *buf}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjTubj)}(hhh]jM)}(hdestination bufferh]hdestination buffer}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjohMhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohMhjubj)}(h$``int len`` number of bytes to copy h](j)}(h ``int len``h]jS)}(hjh]hint len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(hnumber of bytes to copyh]hnumber of bytes to copy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h<``unsigned int gup_flags`` flags modifying lookup behaviour h](j)}(h``unsigned int gup_flags``h]jS)}(hjh]hunsigned int gup_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubj)}(hhh]jM)}(h flags modifying lookup behaviourh]h flags modifying lookup behaviour}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubjM)}(h+The caller must hold a reference on **mm**.h](h$The caller must hold a reference on }(hjhhhNhNubj)}(h**mm**h]hmm}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubjM)}(h **Return**h]j)}(hj@h]hReturn}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubjM)}(hnumber of bytes copied from **addr** (source) to **buf** (destination); not including the trailing NUL. Always guaranteed to leave NUL-terminated buffer. On any error, return -EFAULT.h](hnumber of bytes copied from }(hjVhhhNhNubj)}(h**addr**h]haddr}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh (source) to }(hjVhhhNhNubj)}(h**buf**h]hbuf}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh (destination); not including the trailing NUL. Always guaranteed to leave NUL-terminated buffer. On any error, return -EFAULT.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:98: ./mm/memory.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&__get_pfnblock_flags_mask (C function)c.__get_pfnblock_flags_maskhNtauh1hhjhhhNhNubh)}(hhh](h)}(hhunsigned long __get_pfnblock_flags_mask (const struct page *page, unsigned long pfn, unsigned long mask)h]h)}(hgunsigned long __get_pfnblock_flags_mask(const struct page *page, unsigned long pfn, unsigned long mask)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h__get_pfnblock_flags_maskh]j)}(h__get_pfnblock_flags_maskh]h__get_pfnblock_flags_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h@(const struct page *page, unsigned long pfn, unsigned long mask)h](j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]jy)}jljsbc.__get_pfnblock_flags_maskasbuh1hhjubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjihhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long maskh](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)}(hmaskh]hmask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hKReturn the requested group of flags for a pageblock_nr_pages block of pagesh]hKReturn the requested group of flags for a pageblock_nr_pages block of pages}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj?hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjZjHjZjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` The page within the block of interest ``unsigned long pfn`` The target page frame number ``unsigned long mask`` mask of bits that the caller is interested in **Return** pageblock_bits flagsh](jM)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj^ubj)}(hhh](j)}(hB``const struct page *page`` The page within the block of interest h](j)}(h``const struct page *page``h]jS)}(hjh]hconst struct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj}ubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjzubj)}(h3``unsigned long pfn`` The target page frame number h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hThe target page frame numberh]hThe target page frame number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjzubj)}(hE``unsigned long mask`` mask of bits that the caller is interested in h](j)}(h``unsigned long mask``h]jS)}(hjh]hunsigned long mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h-mask of bits that the caller is interested inh]h-mask of bits that the caller is interested in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjzubeh}(h]h ]h"]h$]h&]uh1jhj^ubjM)}(h **Return**h]j)}(hj0h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj^ubjM)}(hpageblock_bits flagsh]hpageblock_bits flags}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hget_pfnblock_bit (C function)c.get_pfnblock_bithNtauh1hhjhhhNhNubh)}(hhh](h)}(h^bool get_pfnblock_bit (const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h]h)}(h]bool get_pfnblock_bit(const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h](j)}(hj-h]hbool}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhMubh)}(hget_pfnblock_bith]j)}(hget_pfnblock_bith]hget_pfnblock_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjqhhhjhMubj )}(hH(const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h](j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.get_pfnblock_bitasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hlongh]hlong}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hpfnh]hpfn}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum pageblock_bits pb_bith](j5)}(henumh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageblock_bitsh]hpageblock_bits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.get_pfnblock_bitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpb_bith]hpb_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjqhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjmhhhjhMubah}(h]jhah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjjhhubj4)}(hhh]jM)}(h/Check if a standalone bit of a pageblock is seth]h/Check if a standalone bit of a pageblock is set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` The page within the block of interest ``unsigned long pfn`` The target page frame number ``enum pageblock_bits pb_bit`` pageblock bit to check **Return** true if the bit is set, otherwise falseh](jM)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh](j)}(hB``const struct page *page`` The page within the block of interest h](j)}(h``const struct page *page``h]jS)}(hjEh]hconst struct page *page}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj?ubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhMhj[ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhMhj<ubj)}(h3``unsigned long pfn`` The target page frame number h](j)}(h``unsigned long pfn``h]jS)}(hj~h]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj|ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjxubj)}(hhh]jM)}(hThe target page frame numberh]hThe target page frame number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jhjhMhj<ubj)}(h6``enum pageblock_bits pb_bit`` pageblock bit to check h](j)}(h``enum pageblock_bits pb_bit``h]jS)}(hjh]henum pageblock_bits pb_bit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hpageblock bit to checkh]hpageblock bit to check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj<ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(h'true if the bit is set, otherwise falseh]h'true if the bit is set, otherwise false}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%get_pfnblock_migratetype (C function)c.get_pfnblock_migratetypehNtauh1hhjhhhNhNubh)}(hhh](h)}(hVenum migratetype get_pfnblock_migratetype (const struct page *page, unsigned long pfn)h]h)}(hUenum migratetype get_pfnblock_migratetype(const struct page *page, unsigned long pfn)h](j5)}(hjh]henum}(hj7hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj3hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhjDhMubh)}(hhh]j)}(h migratetypeh]h migratetype}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjXmodnameN classnameNjpjs)}jv]jy)}jlget_pfnblock_migratetypesbc.get_pfnblock_migratetypeasbuh1hhj3hhhjDhMubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhjDhMubh)}(hget_pfnblock_migratetypeh]j)}(hjth]hget_pfnblock_migratetype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj3hhhjDhMubj )}(h,(const struct page *page, unsigned long pfn)h](j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jrc.get_pfnblock_migratetypeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hlongh]hlong}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hpfnh]hpfn}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj3hhhjDhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj/hhhjDhMubah}(h]j*ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjDhMhj,hhubj4)}(hhh]jM)}(h%Return the migratetype of a pageblockh]h%Return the migratetype of a pageblock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj,hhhjDhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX9**Parameters** ``const struct page *page`` The page within the block of interest ``unsigned long pfn`` The target page frame number **Return** The migratetype of the pageblock **Description** Use get_pfnblock_migratetype() if caller already has both **page** and **pfn** to save a call to page_to_pfn().h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh](j)}(hB``const struct page *page`` The page within the block of interest h](j)}(h``const struct page *page``h]jS)}(hjh]hconst struct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``unsigned long pfn`` The target page frame number h](j)}(h``unsigned long pfn``h]jS)}(hj h]hunsigned long pfn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hThe target page frame numberh]hThe target page frame number}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hjFh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(h The migratetype of the pageblockh]h The migratetype of the pageblock}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(h**Description**h]j)}(hjmh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(hoUse get_pfnblock_migratetype() if caller already has both **page** and **pfn** to save a call to page_to_pfn().h](h:Use get_pfnblock_migratetype() if caller already has both }(hjhhhNhNubj)}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! to save a call to page_to_pfn().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&__set_pfnblock_flags_mask (C function)c.__set_pfnblock_flags_maskhNtauh1hhjhhhNhNubh)}(hhh](h)}(hnvoid __set_pfnblock_flags_mask (struct page *page, unsigned long pfn, unsigned long flags, unsigned long mask)h]h)}(hmvoid __set_pfnblock_flags_mask(struct page *page, unsigned long pfn, unsigned long flags, unsigned long mask)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h__set_pfnblock_flags_maskh]j)}(h__set_pfnblock_flags_maskh]h__set_pfnblock_flags_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hO(struct page *page, unsigned long pfn, unsigned long flags, unsigned long mask)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj3modnameN classnameNjpjs)}jv]jy)}jljsbc.__set_pfnblock_flags_maskasbuh1hhjubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj_hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long flagsh](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)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long maskh](j)}(hunsignedh]hunsigned}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hlongh]hlong}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hmaskh]hmask}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hHSet the requested group of flags for a pageblock_nr_pages block of pagesh]hHSet the requested group of flags for a pageblock_nr_pages block of pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct page *page`` The page within the block of interest ``unsigned long pfn`` The target page frame number ``unsigned long flags`` The flags to set ``unsigned long mask`` mask of bits that the caller is interested inh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh](j)}(h<``struct page *page`` The page within the block of interest h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``unsigned long pfn`` The target page frame number h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hThe target page frame numberh]hThe target page frame number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h)``unsigned long flags`` The flags to set h](j)}(h``unsigned long flags``h]jS)}(hj<h]hunsigned long flags}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj:ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj6ubj)}(hhh]jM)}(hThe flags to seth]hThe flags to set}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhjubj)}(hD``unsigned long mask`` mask of bits that the caller is interested inh](j)}(h``unsigned long mask``h]jS)}(hjuh]hunsigned long mask}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjsubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjoubj)}(hhh]jM)}(h-mask of bits that the caller is interested inh]h-mask of bits that the caller is interested in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hset_pfnblock_bit (C function)c.set_pfnblock_bithNtauh1hhjhhhNhNubh)}(hhh](h)}(h^void set_pfnblock_bit (const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h]h)}(h]void set_pfnblock_bit(const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hset_pfnblock_bith]j)}(hset_pfnblock_bith]hset_pfnblock_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hH(const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h](j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]jy)}jljsbc.set_pfnblock_bitasbuh1hhjubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjshhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum pageblock_bits pb_bith](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageblock_bitsh]hpageblock_bits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jac.set_pfnblock_bitasbuh1hhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpb_bith]hpb_bit}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h#Set a standalone bit of a pageblockh]h#Set a standalone bit of a pageblock}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj[hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjvjHjvjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` The page within the block of interest ``unsigned long pfn`` The target page frame number ``enum pageblock_bits pb_bit`` pageblock bit to seth](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjzubj)}(hhh](j)}(hB``const struct page *page`` The page within the block of interest h](j)}(h``const struct page *page``h]jS)}(hjh]hconst struct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``unsigned long pfn`` The target page frame number h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hThe target page frame numberh]hThe target page frame number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h3``enum pageblock_bits pb_bit`` pageblock bit to seth](j)}(h``enum pageblock_bits pb_bit``h]jS)}(hjh]henum pageblock_bits pb_bit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(hpageblock bit to seth]hpageblock bit to set}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhjubeh}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hclear_pfnblock_bit (C function)c.clear_pfnblock_bithNtauh1hhjhhhNhNubh)}(hhh](h)}(h`void clear_pfnblock_bit (const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h]h)}(h_void clear_pfnblock_bit(const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h](j)}(hvoidh]hvoid}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjyhMubh)}(hclear_pfnblock_bith]j)}(hclear_pfnblock_bith]hclear_pfnblock_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjghhhjyhMubj )}(hH(const struct page *page, unsigned long pfn, enum pageblock_bits pb_bit)h](j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.clear_pfnblock_bitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hlongh]hlong}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(h h]h }(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hpfnh]hpfn}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum pageblock_bits pb_bith](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageblock_bitsh]hpageblock_bits}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.clear_pfnblock_bitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpb_bith]hpb_bit}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjghhhjyhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjchhhjyhMubah}(h]j^ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjyhMhj`hhubj4)}(hhh]jM)}(h%Clear a standalone bit of a pageblockh]h%Clear a standalone bit of a pageblock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj`hhhjyhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` The page within the block of interest ``unsigned long pfn`` The target page frame number ``enum pageblock_bits pb_bit`` pageblock bit to clearh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh](j)}(hB``const struct page *page`` The page within the block of interest h](j)}(h``const struct page *page``h]jS)}(hj;h]hconst struct page *page}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj9ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj5ubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjPhMhjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhMhj2ubj)}(h3``unsigned long pfn`` The target page frame number h](j)}(h``unsigned long pfn``h]jS)}(hjth]hunsigned long pfn}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjrubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjnubj)}(hhh]jM)}(hThe target page frame numberh]hThe target page frame number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjhMhj2ubj)}(h5``enum pageblock_bits pb_bit`` pageblock bit to clearh](j)}(h``enum pageblock_bits pb_bit``h]jS)}(hjh]henum pageblock_bits pb_bit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hpageblock bit to clearh]hpageblock bit to clear}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj2ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&set_pageblock_migratetype (C function)c.set_pageblock_migratetypehNtauh1hhjhhhNhNubh)}(hhh](h)}(hPvoid set_pageblock_migratetype (struct page *page, enum migratetype migratetype)h]h)}(hOvoid set_pageblock_migratetype(struct page *page, enum migratetype migratetype)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hset_pageblock_migratetypeh]j)}(hset_pageblock_migratetypeh]hset_pageblock_migratetype}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h1(struct page *page, enum migratetype migratetype)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjDhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj@ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubh)}(hhh]j)}(hpageh]hpage}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjdmodnameN classnameNjpjs)}jv]jy)}jlj*sbc.set_pageblock_migratetypeasbuh1hhj@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj@ubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj<ubj )}(henum migratetype migratetypeh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h migratetypeh]h migratetype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j~c.set_pageblock_migratetypeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h migratetypeh]h migratetype}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj<ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h"Set the migratetype of a pageblockh]h"Set the migratetype of a pageblock}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM hj'hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjBjHjBjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct page *page`` The page within the block of interest ``enum migratetype migratetype`` migratetype to seth](jM)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjFubj)}(hhh](j)}(h<``struct page *page`` The page within the block of interest h](j)}(h``struct page *page``h]jS)}(hjkh]hstruct page *page}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM hjeubj)}(hhh]jM)}(h%The page within the block of interesth]h%The page within the block of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjhM hjbubj)}(h3``enum migratetype migratetype`` migratetype to seth](j)}(h ``enum migratetype migratetype``h]jS)}(hjh]henum migratetype migratetype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM hjubj)}(hhh]jM)}(hmigratetype to seth]hmigratetype to set}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjbubeh}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h+__move_freepages_block_isolate (C function) c.__move_freepages_block_isolatehNtauh1hhjhhhNhNubh)}(hhh](h)}(hXbool __move_freepages_block_isolate (struct zone *zone, struct page *page, bool isolate)h]h)}(hWbool __move_freepages_block_isolate(struct zone *zone, struct page *page, bool isolate)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM-ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hM-ubh)}(h__move_freepages_block_isolateh]j)}(h__move_freepages_block_isolateh]h__move_freepages_block_isolate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hM-ubj )}(h4(struct zone *zone, struct page *page, bool isolate)h](j )}(hstruct zone *zoneh](j5)}(hj8h]hstruct}(hj:hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj6ubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(hzoneh]hzone}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjZmodnameN classnameNjpjs)}jv]jy)}jlj sb c.__move_freepages_block_isolateasbuh1hhj6ubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6ubj)}(hzoneh]hzone}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jt c.__move_freepages_block_isolateasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubj )}(h bool isolateh](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hisolateh]hisolate}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj hM-ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hM-ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hM-hjhhubj4)}(hhh]jM)}(h+move free pages in block for page isolationh]h+move free pages in block for page isolation}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM-hj^hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hM-ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjyjHjyjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct zone *zone`` the zone ``struct page *page`` the pageblock page ``bool isolate`` to isolate the given pageblock or unisolate it **Description** This is similar to move_freepages_block(), but handles the special case encountered in page isolation, where the block of interest might be part of a larger buddy spanning multiple pageblocks. Unlike the regular page allocator path, which moves pages while stealing buddies off the freelist, page isolation is interested in arbitrary pfn ranges that may have overlapping buddies on both ends. This function handles that. Straddling buddies are split into individual pageblocks. Only the block of interest is moved. Returns ``true`` if pages could be moved, ``false`` otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM1hj}ubj)}(hhh](j)}(h``struct zone *zone`` the zone h](j)}(h``struct zone *zone``h]jS)}(hjh]hstruct zone *zone}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM.hjubj)}(hhh]jM)}(hthe zoneh]hthe zone}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM.hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjubj)}(h)``struct page *page`` the pageblock page h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM/hjubj)}(hhh]jM)}(hthe pageblock pageh]hthe pageblock page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM/hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM/hjubj)}(h@``bool isolate`` to isolate the given pageblock or unisolate it h](j)}(h``bool isolate``h]jS)}(hjh]h bool isolate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM0hjubj)}(hhh]jM)}(h.to isolate the given pageblock or unisolate ith]h.to isolate the given pageblock or unisolate it}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hM0hj*ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj)hM0hjubeh}(h]h ]h"]h$]h&]uh1jhj}ubjM)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM2hj}ubjM)}(hThis is similar to move_freepages_block(), but handles the special case encountered in page isolation, where the block of interest might be part of a larger buddy spanning multiple pageblocks.h]hThis is similar to move_freepages_block(), but handles the special case encountered in page isolation, where the block of interest might be part of a larger buddy spanning multiple pageblocks.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM1hj}ubjM)}(hUnlike the regular page allocator path, which moves pages while stealing buddies off the freelist, page isolation is interested in arbitrary pfn ranges that may have overlapping buddies on both ends.h]hUnlike the regular page allocator path, which moves pages while stealing buddies off the freelist, page isolation is interested in arbitrary pfn ranges that may have overlapping buddies on both ends.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM5hj}ubjM)}(hyThis function handles that. Straddling buddies are split into individual pageblocks. Only the block of interest is moved.h]hyThis function handles that. Straddling buddies are split into individual pageblocks. Only the block of interest is moved.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM9hj}ubjM)}(h>Returns ``true`` if pages could be moved, ``false`` otherwise.h](hReturns }(hjhhhNhNubjS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh if pages could be moved, }(hjhhhNhNubjS)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM<hj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$__putback_isolated_page (C function)c.__putback_isolated_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(hLvoid __putback_isolated_page (struct page *page, unsigned int order, int mt)h]h)}(hKvoid __putback_isolated_page(struct page *page, unsigned int order, int mt)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMf ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMf ubh)}(h__putback_isolated_pageh]j)}(h__putback_isolated_pageh]h__putback_isolated_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMf ubj )}(h/(struct page *page, unsigned int order, int mt)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj"hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjBmodnameN classnameNjpjs)}jv]jy)}jljsbc.__putback_isolated_pageasbuh1hhjubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjnhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(horderh]horder}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hint mth](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmth]hmt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMf ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMf ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMf hjhhubj4)}(hhh]jM)}(h/Return a now-isolated page back where we got ith]h/Return a now-isolated page back where we got it}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMf hj(hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMf ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjCjHjCjIjJjKuh1hhhhjhNhNubj)}(hX?**Parameters** ``struct page *page`` Page that was isolated ``unsigned int order`` Order of the isolated page ``int mt`` The page's pageblock's migratetype **Description** This function is meant to return a page pulled from the free lists via __isolate_free_page back to the free lists they were pulled from.h](jM)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMj hjGubj)}(hhh](j)}(h-``struct page *page`` Page that was isolated h](j)}(h``struct page *page``h]jS)}(hjlh]hstruct page *page}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMg hjfubj)}(hhh]jM)}(hPage that was isolatedh]hPage that was isolated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMg hjubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjhMg hjcubj)}(h2``unsigned int order`` Order of the isolated page h](j)}(h``unsigned int order``h]jS)}(hjh]hunsigned int order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMh hjubj)}(hhh]jM)}(hOrder of the isolated pageh]hOrder of the isolated page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMh hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMh hjcubj)}(h.``int mt`` The page's pageblock's migratetype h](j)}(h ``int mt``h]jS)}(hjh]hint mt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMi hjubj)}(hhh]jM)}(h"The page's pageblock's migratetypeh]h&The page’s pageblock’s migratetype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMi hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMi hjcubeh}(h]h ]h"]h$]h&]uh1jhjGubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMk hjGubjM)}(hThis function is meant to return a page pulled from the free lists via __isolate_free_page back to the free lists they were pulled from.h]hThis function is meant to return a page pulled from the free lists via __isolate_free_page back to the free lists they were pulled from.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMj hjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__free_pages (C function)c.__free_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h9void __free_pages (struct page *page, unsigned int order)h]h)}(h8void __free_pages(struct page *page, unsigned int order)h](j)}(hvoidh]hvoid}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjlhMubh)}(h __free_pagesh]j)}(h __free_pagesh]h __free_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjZhhhjlhMubj )}(h'(struct page *page, unsigned int order)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.__free_pagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hinth]hint}(hj) hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj7 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(horderh]horder}(hjE hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjZhhhjlhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjVhhhjlhMubah}(h]jQah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjlhMhjShhubj4)}(hhh]jM)}(h(Free pages allocated with alloc_pages().h]h(Free pages allocated with alloc_pages().}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjl hhubah}(h]h ]h"]h$]h&]uh1j3hjShhhjlhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct page *page`` The page pointer returned from alloc_pages(). ``unsigned int order`` The order of the allocation. **Description** This function can free multi-page allocations that are not compound pages. It does not check that the **order** passed in matches that of the allocation, so it is easy to leak memory. Freeing more memory than was allocated will probably emit a warning. If the last reference to this page is speculative, it will be released by put_page() which only frees the first page of a non-compound allocation. To prevent the remaining pages from being leaked, we free the subsequent pages here. If you want to use the page's reference count to decide when to free the allocation, you should allocate a compound page, and use put_page() instead of __free_pages(). **Context** May be called in interrupt context or while holding a normal spinlock, but not in NMI context or while holding a raw spinlock.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh](j)}(hD``struct page *page`` The page pointer returned from alloc_pages(). h](j)}(h``struct page *page``h]jS)}(hj h]hstruct page *page}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(h-The page pointer returned from alloc_pages().h]h-The page pointer returned from alloc_pages().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h4``unsigned int order`` The order of the allocation. h](j)}(h``unsigned int order``h]jS)}(hj h]hunsigned int order}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(hThe order of the allocation.h]hThe order of the allocation.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj$ h]h Description}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj" ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(hThis function can free multi-page allocations that are not compound pages. It does not check that the **order** passed in matches that of the allocation, so it is easy to leak memory. Freeing more memory than was allocated will probably emit a warning.h](hgThis function can free multi-page allocations that are not compound pages. It does not check that the }(hj: hhhNhNubj)}(h **order**h]horder}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj: ubh passed in matches that of the allocation, so it is easy to leak memory. Freeing more memory than was allocated will probably emit a warning.}(hj: hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(hXIf the last reference to this page is speculative, it will be released by put_page() which only frees the first page of a non-compound allocation. To prevent the remaining pages from being leaked, we free the subsequent pages here. If you want to use the page's reference count to decide when to free the allocation, you should allocate a compound page, and use put_page() instead of __free_pages().h]hXIf the last reference to this page is speculative, it will be released by put_page() which only frees the first page of a non-compound allocation. To prevent the remaining pages from being leaked, we free the subsequent pages here. If you want to use the page’s reference count to decide when to free the allocation, you should allocate a compound page, and use put_page() instead of __free_pages().}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(h **Context**h]j)}(hjl h]hContext}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(h~May be called in interrupt context or while holding a normal spinlock, but not in NMI context or while holding a raw spinlock.h]h~May be called in interrupt context or while holding a normal spinlock, but not in NMI context or while holding a raw spinlock.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfree_pages (C function) c.free_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h8void free_pages (unsigned long addr, unsigned int order)h]h)}(h7void free_pages(unsigned long addr, unsigned int order)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubh)}(h free_pagesh]j)}(h free_pagesh]h free_pages}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhj hMubj )}(h((unsigned long addr, unsigned int order)h](j )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(haddrh]haddr}(hj& hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hj? hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj; ubj)}(h h]h }(hjM hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj; ubj)}(hinth]hint}(hj[ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj; ubj)}(h h]h }(hji hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj; ubj)}(horderh]horder}(hjw hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj; ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhj hhubj4)}(hhh]jM)}(h-Free pages allocated with __get_free_pages().h]h-Free pages allocated with __get_free_pages().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hXg**Parameters** ``unsigned long addr`` The virtual address tied to a page returned from __get_free_pages(). ``unsigned int order`` The order of the allocation. **Description** This function behaves the same as __free_pages(). Use this function to free pages when you only have a valid virtual address. If you have the page, call __free_pages() instead.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh](j)}(h\``unsigned long addr`` The virtual address tied to a page returned from __get_free_pages(). h](j)}(h``unsigned long addr``h]jS)}(hj h]hunsigned long addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(hDThe virtual address tied to a page returned from __get_free_pages().h]hDThe virtual address tied to a page returned from __get_free_pages().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h4``unsigned int order`` The order of the allocation. h](j)}(h``unsigned int order``h]jS)}(hj h]hunsigned int order}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(hThe order of the allocation.h]hThe order of the allocation.}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj0 hMhj1 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj0 hMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjV h]h Description}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(hThis function behaves the same as __free_pages(). Use this function to free pages when you only have a valid virtual address. If you have the page, call __free_pages() instead.h]hThis function behaves the same as __free_pages(). Use this function to free pages when you only have a valid virtual address. If you have the page, call __free_pages() instead.}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](halloc_pages_exact (C function)c.alloc_pages_exacthNtauh1hhjhhhNhNubh)}(hhh](h)}(h6void * alloc_pages_exact (size_t size, gfp_t gfp_mask)h]h)}(h4void *alloc_pages_exact(size_t size, gfp_t gfp_mask)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj hhhj hMubh)}(halloc_pages_exacth]j)}(halloc_pages_exacth]halloc_pages_exact}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhj hMubj )}(h(size_t size, gfp_t gfp_mask)h](j )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jlj sbc.alloc_pages_exactasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hsizeh]hsize}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj2 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj4 modnameN classnameNjpjs)}jv]j c.alloc_pages_exactasbuh1hhj+ ubj)}(h h]h }(hjP hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ ubj)}(hgfp_maskh]hgfp_mask}(hj^ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhj hhubj4)}(hhh]jM)}(h5allocate an exact number physically-contiguous pages.h]h5allocate an exact number physically-contiguous pages.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX **Parameters** ``size_t size`` the number of bytes to allocate ``gfp_t gfp_mask`` GFP flags for the allocation, must not contain __GFP_COMP **Description** This function is similar to alloc_pages(), except that it allocates the minimum number of pages to satisfy the request. alloc_pages() can only allocate memory in power-of-two pages. This function is also limited by MAX_PAGE_ORDER. Memory allocated by this function must be released by free_pages_exact(). **Return** pointer to the allocated area or ``NULL`` in case of error.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh](j)}(h0``size_t size`` the number of bytes to allocate h](j)}(h``size_t size``h]jS)}(hj h]h size_t size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(hthe number of bytes to allocateh]hthe number of bytes to allocate}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(hM``gfp_t gfp_mask`` GFP flags for the allocation, must not contain __GFP_COMP h](j)}(h``gfp_t gfp_mask``h]jS)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubj)}(hhh]jM)}(h9GFP flags for the allocation, must not contain __GFP_COMPh]h9GFP flags for the allocation, must not contain __GFP_COMP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj=h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(hThis function is similar to alloc_pages(), except that it allocates the minimum number of pages to satisfy the request. alloc_pages() can only allocate memory in power-of-two pages.h]hThis function is similar to alloc_pages(), except that it allocates the minimum number of pages to satisfy the request. alloc_pages() can only allocate memory in power-of-two pages.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(h0This function is also limited by MAX_PAGE_ORDER.h]h0This function is also limited by MAX_PAGE_ORDER.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(hIMemory allocated by this function must be released by free_pages_exact().h]hIMemory allocated by this function must be released by free_pages_exact().}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubjM)}(h;pointer to the allocated area or ``NULL`` in case of error.h](h!pointer to the allocated area or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh in case of error.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"alloc_pages_exact_nid (C function)c.alloc_pages_exact_nidhNtauh1hhjhhhNhNubh)}(hhh](h)}(hCvoid * alloc_pages_exact_nid (int nid, size_t size, gfp_t gfp_mask)h]h)}(hAvoid *alloc_pages_exact_nid(int nid, size_t size, gfp_t gfp_mask)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMubh)}(halloc_pages_exact_nidh]j)}(halloc_pages_exact_nidh]halloc_pages_exact_nid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h&(int nid, size_t size, gfp_t gfp_mask)h](j )}(hint nidh](j)}(hinth]hint}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnidh]hnid}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]modnameN classnameNjpjs)}jv]jy)}jlj sbc.alloc_pages_exact_nidasbuh1hhjTubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jwc.alloc_pages_exact_nidasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfp_maskh]hgfp_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hBallocate an exact number of physically-contiguous pages on a node.h]hBallocate an exact number of physically-contiguous pages on a node.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int nid`` the preferred node ID where memory should be allocated ``size_t size`` the number of bytes to allocate ``gfp_t gfp_mask`` GFP flags for the allocation, must not contain __GFP_COMP **Description** Like alloc_pages_exact(), but try to allocate on node nid first before falling back. **Return** pointer to the allocated area or ``NULL`` in case of error.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh](j)}(hC``int nid`` the preferred node ID where memory should be allocated h](j)}(h ``int nid``h]jS)}(hj<h]hint nid}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj:ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj6ubj)}(hhh]jM)}(h6the preferred node ID where memory should be allocatedh]h6the preferred node ID where memory should be allocated}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhj3ubj)}(h0``size_t size`` the number of bytes to allocate h](j)}(h``size_t size``h]jS)}(hjuh]h size_t size}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjsubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjoubj)}(hhh]jM)}(hthe number of bytes to allocateh]hthe number of bytes to allocate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3ubj)}(hM``gfp_t gfp_mask`` GFP flags for the allocation, must not contain __GFP_COMP h](j)}(h``gfp_t gfp_mask``h]jS)}(hjh]hgfp_t gfp_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h9GFP flags for the allocation, must not contain __GFP_COMPh]h9GFP flags for the allocation, must not contain __GFP_COMP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(hTLike alloc_pages_exact(), but try to allocate on node nid first before falling back.h]hTLike alloc_pages_exact(), but try to allocate on node nid first before falling back.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(h;pointer to the allocated area or ``NULL`` in case of error.h](h!pointer to the allocated area or }(hj&hhhNhNubjS)}(h``NULL``h]hNULL}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubh in case of error.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfree_pages_exact (C function)c.free_pages_exacthNtauh1hhjhhhNhNubh)}(hhh](h)}(h/void free_pages_exact (void *virt, size_t size)h]h)}(h.void free_pages_exact(void *virt, size_t size)h](j)}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM)ubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjuhM)ubh)}(hfree_pages_exacth]j)}(hfree_pages_exacth]hfree_pages_exact}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjchhhjuhM)ubj )}(h(void *virt, size_t size)h](j )}(h void *virth](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvirth]hvirt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.free_pages_exactasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjchhhjuhM)ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj_hhhjuhM)ubah}(h]jZah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjuhM)hj\hhubj4)}(hhh]jM)}(h0release memory allocated via alloc_pages_exact()h]h0release memory allocated via alloc_pages_exact()}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM)hj>hhubah}(h]h ]h"]h$]h&]uh1j3hj\hhhjuhM)ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjYjHjYjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``void *virt`` the value returned by alloc_pages_exact. ``size_t size`` size of allocation, same value as passed to alloc_pages_exact(). **Description** Release the memory allocated by a previous call to alloc_pages_exact.h](jM)}(h**Parameters**h]j)}(hjch]h Parameters}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM-hj]ubj)}(hhh](j)}(h8``void *virt`` the value returned by alloc_pages_exact. h](j)}(h``void *virt``h]jS)}(hjh]h void *virt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM*hj|ubj)}(hhh]jM)}(h(the value returned by alloc_pages_exact.h]h(the value returned by alloc_pages_exact.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM*hjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhjhM*hjyubj)}(hQ``size_t size`` size of allocation, same value as passed to alloc_pages_exact(). h](j)}(h``size_t size``h]jS)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM+hjubj)}(hhh]jM)}(h@size of allocation, same value as passed to alloc_pages_exact().h]h@size of allocation, same value as passed to alloc_pages_exact().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjyubeh}(h]h ]h"]h$]h&]uh1jhj]ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM-hj]ubjM)}(hERelease the memory allocated by a previous call to alloc_pages_exact.h]hERelease the memory allocated by a previous call to alloc_pages_exact.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM,hj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hnr_free_zone_pages (C function)c.nr_free_zone_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h-unsigned long nr_free_zone_pages (int offset)h]h)}(h,unsigned long nr_free_zone_pages(int offset)h](j)}(hunsignedh]hunsigned}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM<ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhjIhM<ubj)}(hlongh]hlong}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhjIhM<ubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhjIhM<ubh)}(hnr_free_zone_pagesh]j)}(hnr_free_zone_pagesh]hnr_free_zone_pages}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ](jjeh"]h$]h&]jjuh1hhj7hhhjIhM<ubj )}(h (int offset)h]j )}(h int offseth](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hoffseth]hoffset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj7hhhjIhM<ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj3hhhjIhM<ubah}(h]j.ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjIhM<hj0hhubj4)}(hhh]jM)}(h+count number of pages beyond high watermarkh]h+count number of pages beyond high watermark}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM<hjhhubah}(h]h ]h"]h$]h&]uh1j3hj0hhhjIhM<ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXy**Parameters** ``int offset`` The zone index of the highest zone **Description** nr_free_zone_pages() counts the number of pages which are beyond the high watermark within all zones at or below a given zone index. For each zone, the number of pages is calculated as: nr_free_zone_pages = managed_pages - high_pages **Return** number of pages beyond high watermark.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM@hjubj)}(hhh]j)}(h2``int offset`` The zone index of the highest zone h](j)}(h``int offset``h]jS)}(hjh]h int offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM=hjubj)}(hhh]jM)}(h"The zone index of the highest zoneh]h"The zone index of the highest zone}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj0hM=hj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hM=hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM?hjubjM)}(hnr_free_zone_pages() counts the number of pages which are beyond the high watermark within all zones at or below a given zone index. For each zone, the number of pages is calculated as:h]hnr_free_zone_pages() counts the number of pages which are beyond the high watermark within all zones at or below a given zone index. For each zone, the number of pages is calculated as:}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM>hjubji)}(h0nr_free_zone_pages = managed_pages - high_pages h]jM)}(h/nr_free_zone_pages = managed_pages - high_pagesh]h/nr_free_zone_pages = managed_pages - high_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMBhj{ubah}(h]h ]h"]h$]h&]uh1jhhjhMBhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMDhjubjM)}(h&number of pages beyond high watermark.h]h&number of pages beyond high watermark.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMEhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!nr_free_buffer_pages (C function)c.nr_free_buffer_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h)unsigned long nr_free_buffer_pages (void)h]h)}(h(unsigned long nr_free_buffer_pages(void)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM\ubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM\ubh)}(hnr_free_buffer_pagesh]j)}(hnr_free_buffer_pagesh]hnr_free_buffer_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM\ubj )}(h(void)h]j )}(hvoidh]j)}(hvoidh]hvoid}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]noemphjjuh1j hj,ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM\ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM\ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM\hjhhubj4)}(hhh]jM)}(h+count number of pages beyond high watermarkh]h+count number of pages beyond high watermark}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM\hj[hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM\ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjvjHjvjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``void`` no arguments **Description** nr_free_buffer_pages() counts the number of pages which are beyond the high watermark within ZONE_DMA and ZONE_NORMAL. **Return** number of pages beyond high watermark within ZONE_DMA and ZONE_NORMAL.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM`hjzubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]jS)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chKhjubj)}(hhh]jM)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjzubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chKhjzubjM)}(hvnr_free_buffer_pages() counts the number of pages which are beyond the high watermark within ZONE_DMA and ZONE_NORMAL.h]hvnr_free_buffer_pages() counts the number of pages which are beyond the high watermark within ZONE_DMA and ZONE_NORMAL.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM]hjzubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM`hjzubjM)}(hFnumber of pages beyond high watermark within ZONE_DMA and ZONE_NORMAL.h]hFnumber of pages beyond high watermark within ZONE_DMA and ZONE_NORMAL.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMahjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h find_next_best_node (C function)c.find_next_best_nodehNtauh1hhjhhhNhNubh)}(hhh](h)}(h>int find_next_best_node (int node, nodemask_t *used_node_mask)h]h)}(h=int find_next_best_node(int node, nodemask_t *used_node_mask)h](j)}(hinth]hint}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhjThMubh)}(hfind_next_best_nodeh]j)}(hfind_next_best_nodeh]hfind_next_best_node}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ](jjeh"]h$]h&]jjuh1hhjBhhhjThMubj )}(h&(int node, nodemask_t *used_node_mask)h](j )}(hint nodeh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnodeh]hnode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{ubj )}(hnodemask_t *used_node_maskh](h)}(hhh]j)}(h nodemask_th]h nodemask_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljisbc.find_next_best_nodeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hused_node_maskh]hused_node_mask}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{ubeh}(h]h ]h"]h$]h&]jjuh1j hjBhhhjThMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj>hhhjThMubah}(h]j9ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjThMhj;hhubj4)}(hhh]jM)}(hEfind the next node that should appear in a given node's fallback listh]hGfind the next node that should appear in a given node’s fallback list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj;hhhjThMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj8jHj8jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int node`` node whose fallback list we're appending ``nodemask_t *used_node_mask`` nodemask_t of already used nodes **Description** We use a number of factors to determine which is the next node that should appear on a given node's fallback list. The node should not have appeared already in **node**'s fallback list, and it should be the next closest node according to the distance array (which contains arbitrary distance values from each node to each node in the system), and should also prefer nodes with no CPUs, since presumably they'll have very little allocation pressure on them otherwise. **Return** node id of the found node or ``NUMA_NO_NODE`` if no node is found.h](jM)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj<ubj)}(hhh](j)}(h6``int node`` node whose fallback list we're appending h](j)}(h ``int node``h]jS)}(hjah]hint node}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj[ubj)}(hhh]jM)}(h(node whose fallback list we're appendingh]h*node whose fallback list we’re appending}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMhjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjXubj)}(h@``nodemask_t *used_node_mask`` nodemask_t of already used nodes h](j)}(h``nodemask_t *used_node_mask``h]jS)}(hjh]hnodemask_t *used_node_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h nodemask_t of already used nodesh]h nodemask_t of already used nodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjXubeh}(h]h ]h"]h$]h&]uh1jhj<ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj<ubjM)}(hXWe use a number of factors to determine which is the next node that should appear on a given node's fallback list. The node should not have appeared already in **node**'s fallback list, and it should be the next closest node according to the distance array (which contains arbitrary distance values from each node to each node in the system), and should also prefer nodes with no CPUs, since presumably they'll have very little allocation pressure on them otherwise.h](hWe use a number of factors to determine which is the next node that should appear on a given node’s fallback list. The node should not have appeared already in }(hjhhhNhNubj)}(h**node**h]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX.’s fallback list, and it should be the next closest node according to the distance array (which contains arbitrary distance values from each node to each node in the system), and should also prefer nodes with no CPUs, since presumably they’ll have very little allocation pressure on them otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj<ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj<ubjM)}(hBnode id of the found node or ``NUMA_NO_NODE`` if no node is found.h](hnode id of the found node or }(hj$hhhNhNubjS)}(h``NUMA_NO_NODE``h]h NUMA_NO_NODE}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj$ubh if no node is found.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h free_reserved_pages (C function)c.free_reserved_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h@void free_reserved_pages (struct page *page, unsigned int order)h]h)}(h?void free_reserved_pages(struct page *page, unsigned int order)h](j)}(hvoidh]hvoid}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM#ubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjshM#ubh)}(hfree_reserved_pagesh]j)}(hfree_reserved_pagesh]hfree_reserved_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjahhhjshM#ubj )}(h'(struct page *page, unsigned int order)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.free_reserved_pagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(horderh]horder}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjahhhjshM#ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj]hhhjshM#ubah}(h]jXah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjshM#hjZhhubj4)}(hhh]jM)}(hfree reserved pagesh]hfree reserved pages}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM#hjshhubah}(h]h ]h"]h$]h&]uh1j3hjZhhhjshM#ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXX**Parameters** ``struct page *page`` First page to free. ``unsigned int order`` The page order to free. **Description** Free pages allocated through memblock during boot, letting the buddy manage them from now on. **page** must be naturally aligned to the order and the order must not exceed MAX_PAGE_ORDER. All pages must be reserved.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM'hjubj)}(hhh](j)}(h*``struct page *page`` First page to free. h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM$hjubj)}(hhh]jM)}(hFirst page to free.h]hFirst page to free.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM$hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM$hjubj)}(h/``unsigned int order`` The page order to free. h](j)}(h``unsigned int order``h]jS)}(hjh]hunsigned int order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM%hjubj)}(hhh]jM)}(hThe page order to free.h]hThe page order to free.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM%hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM%hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM'hjubjM)}(h]Free pages allocated through memblock during boot, letting the buddy manage them from now on.h]h]Free pages allocated through memblock during boot, letting the buddy manage them from now on.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM&hjubjM)}(hy**page** must be naturally aligned to the order and the order must not exceed MAX_PAGE_ORDER. All pages must be reserved.h](j)}(h**page**h]hpage}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubhq must be naturally aligned to the order and the order must not exceed MAX_PAGE_ORDER. All pages must be reserved.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM)hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"setup_per_zone_wmarks (C function)c.setup_per_zone_wmarkshNtauh1hhjhhhNhNubh)}(hhh](h)}(h!void setup_per_zone_wmarks (void)h]h)}(h void setup_per_zone_wmarks(void)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hsetup_per_zone_wmarksh]j)}(hsetup_per_zone_wmarksh]hsetup_per_zone_wmarks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(void)h]j )}(hvoidh]j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hIcalled when min_free_kbytes changes or when memory is hot-{added|removed}h]hIcalled when min_free_kbytes changes or when memory is hot-{added|removed}}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``void`` no arguments **Description** Ensures that the watermark[min,low,high] values for each zone are set correctly with respect to min_free_kbytes.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]jS)}(hj5h]hvoid}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chKhj/ubj)}(hhh]jM)}(h no argumentsh]h no arguments}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjJhKhjKubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhKhj,ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjph]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chKhjubjM)}(hpEnsures that the watermark[min,low,high] values for each zone are set correctly with respect to min_free_kbytes.h]hpEnsures that the watermark[min,low,high] values for each zone are set correctly with respect to min_free_kbytes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h __free_contig_range (C function)c.__free_contig_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hDvoid __free_contig_range (unsigned long pfn, unsigned long nr_pages)h]h)}(hCvoid __free_contig_range(unsigned long pfn, unsigned long nr_pages)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h__free_contig_rangeh]j)}(h__free_contig_rangeh]h__free_contig_range}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h+(unsigned long pfn, unsigned long nr_pages)h](j )}(hunsigned long pfnh](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)}(hpfnh]hpfn}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hlongh]hlong}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hnr_pagesh]hnr_pages}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h'Free contiguous range of order-0 pages.h]h'Free contiguous range of order-0 pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long pfn`` Page frame number of the first page in the range. ``unsigned long nr_pages`` Number of pages to free. **Description** For each order-0 struct page in the physically contiguous range, put a reference. Free any page who's reference count falls to zero. The implementation is functionally equivalent to, but significantly faster than calling __free_page() for each struct page in a loop. Memory allocated with alloc_pages(order>=1) then subsequently split to order-0 with split_page() is an example of appropriate contiguous pages that can be freed with this API. **Context** May be called in interrupt context or while holding a normal spinlock, but not in NMI context or while holding a raw spinlock.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh](j)}(hH``unsigned long pfn`` Page frame number of the first page in the range. h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(h1Page frame number of the first page in the range.h]h1Page frame number of the first page in the range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h4``unsigned long nr_pages`` Number of pages to free. h](j)}(h``unsigned long nr_pages``h]jS)}(hjh]hunsigned long nr_pages}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubj)}(hhh]jM)}(hNumber of pages to free.h]hNumber of pages to free.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj4hMhj5ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjZh]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(hX For each order-0 struct page in the physically contiguous range, put a reference. Free any page who's reference count falls to zero. The implementation is functionally equivalent to, but significantly faster than calling __free_page() for each struct page in a loop.h]hX For each order-0 struct page in the physically contiguous range, put a reference. Free any page who’s reference count falls to zero. The implementation is functionally equivalent to, but significantly faster than calling __free_page() for each struct page in a loop.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(hMemory allocated with alloc_pages(order>=1) then subsequently split to order-0 with split_page() is an example of appropriate contiguous pages that can be freed with this API.h]hMemory allocated with alloc_pages(order>=1) then subsequently split to order-0 with split_page() is an example of appropriate contiguous pages that can be freed with this API.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubjM)}(h~May be called in interrupt context or while holding a normal spinlock, but not in NMI context or while holding a raw spinlock.h]h~May be called in interrupt context or while holding a normal spinlock, but not in NMI context or while holding a raw spinlock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&alloc_contig_frozen_range (C function)c.alloc_contig_frozen_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hoint alloc_contig_frozen_range (unsigned long start, unsigned long end, acr_flags_t alloc_flags, gfp_t gfp_mask)h]h)}(hnint alloc_contig_frozen_range(unsigned long start, unsigned long end, acr_flags_t alloc_flags, gfp_t gfp_mask)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM]ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM]ubh)}(halloc_contig_frozen_rangeh]j)}(halloc_contig_frozen_rangeh]halloc_contig_frozen_range}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM]ubj )}(hQ(unsigned long start, unsigned long end, acr_flags_t alloc_flags, gfp_t gfp_mask)h](j )}(hunsigned long starth](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstarth]hstart}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long endh](j)}(hunsignedh]hunsigned}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hacr_flags_t alloc_flagsh](h)}(hhh]j)}(h acr_flags_th]h acr_flags_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.alloc_contig_frozen_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h alloc_flagsh]h alloc_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.alloc_contig_frozen_rangeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfp_maskh]hgfp_mask}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM]ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM]ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM]hjhhubj4)}(hhh]jaW)}(hhh]j/)}(h-tries to allocate given range of frozen pagesh]jM)}(hj\h]h-tries to allocate given range of frozen pages}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM]hjZubah}(h]h ]h"]h$]h&]uh1j/hjWhhhjkhNubah}(h]h ]h"]h$]h&]jWjWuh1j`WhjkhM]hjThhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM]ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long start`` start PFN to allocate ``unsigned long end`` one-past-the-last PFN to allocate ``acr_flags_t alloc_flags`` allocation information ``gfp_t gfp_mask`` GFP mask. Node/zone/placement hints are ignored; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim. **Description** The PFN range does not have to be pageblock aligned. The PFN range must belong to a single zone. The first thing this routine does is attempt to MIGRATE_ISOLATE all pageblocks in the range. Once isolated, the pageblocks should not be modified by others. All frozen pages which PFN is in [start, end) are allocated for the caller, and they could be freed with free_contig_frozen_range(), free_frozen_pages() also could be used to free compound frozen pages directly. **Return** zero on success or negative error code.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMahjubj)}(hhh](j)}(h.``unsigned long start`` start PFN to allocate h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM^hjubj)}(hhh]jM)}(hstart PFN to allocateh]hstart PFN to allocate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM^hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM^hjubj)}(h8``unsigned long end`` one-past-the-last PFN to allocate h](j)}(h``unsigned long end``h]jS)}(hjh]hunsigned long end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM_hjubj)}(hhh]jM)}(h!one-past-the-last PFN to allocateh]h!one-past-the-last PFN to allocate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM_hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM_hjubj)}(h3``acr_flags_t alloc_flags`` allocation information h](j)}(h``acr_flags_t alloc_flags``h]jS)}(hj h]hacr_flags_t alloc_flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM`hj ubj)}(hhh]jM)}(hallocation informationh]hallocation information}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1 hM`hj2 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj1 hM`hjubj)}(h``gfp_t gfp_mask`` GFP mask. Node/zone/placement hints are ignored; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim. h](j)}(h``gfp_t gfp_mask``h]jS)}(hjU h]hgfp_t gfp_mask}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjS ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMchjO ubj)}(hhh]jM)}(hGFP mask. Node/zone/placement hints are ignored; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim.h]hGFP mask. Node/zone/placement hints are ignored; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim.}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMahjk ubah}(h]h ]h"]h$]h&]uh1jhjO ubeh}(h]h ]h"]h$]h&]uh1jhjj hMchjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMehjubjM)}(h`The PFN range does not have to be pageblock aligned. The PFN range must belong to a single zone.h]h`The PFN range does not have to be pageblock aligned. The PFN range must belong to a single zone.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMdhjubjM)}(hThe first thing this routine does is attempt to MIGRATE_ISOLATE all pageblocks in the range. Once isolated, the pageblocks should not be modified by others.h]hThe first thing this routine does is attempt to MIGRATE_ISOLATE all pageblocks in the range. Once isolated, the pageblocks should not be modified by others.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMghjubjM)}(hAll frozen pages which PFN is in [start, end) are allocated for the caller, and they could be freed with free_contig_frozen_range(), free_frozen_pages() also could be used to free compound frozen pages directly.h]hAll frozen pages which PFN is in [start, end) are allocated for the caller, and they could be freed with free_contig_frozen_range(), free_frozen_pages() also could be used to free compound frozen pages directly.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMkhjubjM)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMphjubjM)}(h'zero on success or negative error code.h]h'zero on success or negative error code.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMqhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](halloc_contig_range (C function)c.alloc_contig_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hhint alloc_contig_range (unsigned long start, unsigned long end, acr_flags_t alloc_flags, gfp_t gfp_mask)h]h)}(hgint alloc_contig_range(unsigned long start, unsigned long end, acr_flags_t alloc_flags, gfp_t gfp_mask)h](j)}(hinth]hint}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hj*!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!hhhj)!hMubh)}(halloc_contig_rangeh]j)}(halloc_contig_rangeh]halloc_contig_range}(hj!sbc.alloc_contig_rangeasbuh1hhj!ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(h alloc_flagsh]h alloc_flags}(hj+"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjP!ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjG"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD"ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjI"modnameN classnameNjpjs)}jv]j"c.alloc_contig_rangeasbuh1hhj@"ubj)}(h h]h }(hje"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@"ubj)}(hgfp_maskh]hgfp_mask}(hjs"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@"ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjP!ubeh}(h]h ]h"]h$]h&]jjuh1j hj!hhhj)!hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj!hhhj)!hMubah}(h]j!ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj)!hMhj!hhubj4)}(hhh]jaW)}(hhh]j/)}(h&tries to allocate given range of pagesh]jM)}(hj"h]h&tries to allocate given range of pages}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj"ubah}(h]h ]h"]h$]h&]uh1j/hj"hhhj"hNubah}(h]h ]h"]h$]h&]jWjWuh1j`Whj"hMhj"hhubah}(h]h ]h"]h$]h&]uh1j3hj!hhhj)!hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj"jHj"jIjJjKuh1hhhhjhNhNubj)}(hXj**Parameters** ``unsigned long start`` start PFN to allocate ``unsigned long end`` one-past-the-last PFN to allocate ``acr_flags_t alloc_flags`` allocation information ``gfp_t gfp_mask`` GFP mask. **Description** This routine is a wrapper around alloc_contig_frozen_range(), it can't be used to allocate compound pages, the refcount of each allocated page will be set to one. All pages which PFN is in [start, end) are allocated for the caller, and should be freed with free_contig_range() or by manually calling __free_page() on each allocated page. **Return** zero on success or negative error code.h](jM)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj"ubj)}(hhh](j)}(h.``unsigned long start`` start PFN to allocate h](j)}(h``unsigned long start``h]jS)}(hj"h]hunsigned long start}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj"ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj"ubj)}(hhh]jM)}(hstart PFN to allocateh]hstart PFN to allocate}(hj #hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhj"ubj)}(h8``unsigned long end`` one-past-the-last PFN to allocate h](j)}(h``unsigned long end``h]jS)}(hj)#h]hunsigned long end}(hj+#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj'#ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj##ubj)}(hhh]jM)}(h!one-past-the-last PFN to allocateh]h!one-past-the-last PFN to allocate}(hjB#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>#hMhj?#ubah}(h]h ]h"]h$]h&]uh1jhj##ubeh}(h]h ]h"]h$]h&]uh1jhj>#hMhj"ubj)}(h3``acr_flags_t alloc_flags`` allocation information h](j)}(h``acr_flags_t alloc_flags``h]jS)}(hjb#h]hacr_flags_t alloc_flags}(hjd#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`#ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj\#ubj)}(hhh]jM)}(hallocation informationh]hallocation information}(hj{#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjw#hMhjx#ubah}(h]h ]h"]h$]h&]uh1jhj\#ubeh}(h]h ]h"]h$]h&]uh1jhjw#hMhj"ubj)}(h``gfp_t gfp_mask`` GFP mask. h](j)}(h``gfp_t gfp_mask``h]jS)}(hj#h]hgfp_t gfp_mask}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj#ubj)}(hhh]jM)}(h GFP mask.h]h GFP mask.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhj"ubeh}(h]h ]h"]h$]h&]uh1jhj"ubjM)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj"ubjM)}(hThis routine is a wrapper around alloc_contig_frozen_range(), it can't be used to allocate compound pages, the refcount of each allocated page will be set to one.h]hThis routine is a wrapper around alloc_contig_frozen_range(), it can’t be used to allocate compound pages, the refcount of each allocated page will be set to one.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj"ubjM)}(hAll pages which PFN is in [start, end) are allocated for the caller, and should be freed with free_contig_range() or by manually calling __free_page() on each allocated page.h]hAll pages which PFN is in [start, end) are allocated for the caller, and should be freed with free_contig_range() or by manually calling __free_page() on each allocated page.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM hj"ubjM)}(h **Return**h]j)}(hj $h]hReturn}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj $ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM hj"ubjM)}(h'zero on success or negative error code.h]h'zero on success or negative error code.}(hj"$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&alloc_contig_frozen_pages (C function)c.alloc_contig_frozen_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hostruct page * alloc_contig_frozen_pages (unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask)h]h)}(hmstruct page *alloc_contig_frozen_pages(unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask)h](j5)}(hj8h]hstruct}(hjQ$hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjM$hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMZubj)}(h h]h }(hj_$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM$hhhj^$hMZubh)}(hhh]j)}(hpageh]hpage}(hjp$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjr$modnameN classnameNjpjs)}jv]jy)}jlalloc_contig_frozen_pagessbc.alloc_contig_frozen_pagesasbuh1hhjM$hhhj^$hMZubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM$hhhj^$hMZubjF )}(hjI h]h*}(hj$hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjM$hhhj^$hMZubh)}(halloc_contig_frozen_pagesh]j)}(hj$h]halloc_contig_frozen_pages}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjM$hhhj^$hMZubj )}(hG(unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask)h](j )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hlongh]hlong}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hnr_pagesh]hnr_pages}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj!%modnameN classnameNjpjs)}jv]j$c.alloc_contig_frozen_pagesasbuh1hhj%ubj)}(h h]h }(hj=%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubj)}(hgfp_maskh]hgfp_mask}(hjK%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubj )}(hint nidh](j)}(hinth]hint}(hjd%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`%ubj)}(h h]h }(hjr%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`%ubj)}(hnidh]hnid}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubj )}(hnodemask_t *nodemaskh](h)}(hhh]j)}(h nodemask_th]h nodemask_t}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj%modnameN classnameNjpjs)}jv]j$c.alloc_contig_frozen_pagesasbuh1hhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjF )}(hjI h]h*}(hj%hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj%ubj)}(hnodemaskh]hnodemask}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubeh}(h]h ]h"]h$]h&]jjuh1j hjM$hhhj^$hMZubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjI$hhhj^$hMZubah}(h]jD$ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj^$hMZhjF$hhubj4)}(hhh]jaW)}(hhh]j/)}(h;tries to find and allocate contiguous range of frozen pagesh]jM)}(hj&h]h;tries to find and allocate contiguous range of frozen pages}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMZhj&ubah}(h]h ]h"]h$]h&]uh1j/hj%hhhj&hNubah}(h]h ]h"]h$]h&]jWjWuh1j`Whj&hMZhj%hhubah}(h]h ]h"]h$]h&]uh1j3hjF$hhhj^$hMZubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj)&jHj)&jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long nr_pages`` Number of contiguous pages to allocate ``gfp_t gfp_mask`` GFP mask. Node/zone/placement hints limit the search; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim. ``int nid`` Target node ``nodemask_t *nodemask`` Mask for other possible nodes **Description** This routine is a wrapper around alloc_contig_frozen_range(). It scans over zones on an applicable zonelist to find a contiguous pfn range which can then be tried for allocation with alloc_contig_frozen_range(). This routine is intended for allocation requests which can not be fulfilled with the buddy allocator. The allocated memory is always aligned to a page boundary. If nr_pages is a power of two, then allocated range is also guaranteed to be aligned to same nr_pages (e.g. 1GB request would be aligned to 1GB). Allocated frozen pages need be freed with free_contig_frozen_range(), or by manually calling free_frozen_pages() on each allocated frozen non-compound page, for compound frozen pages could be freed with free_frozen_pages() directly. **Return** pointer to contiguous frozen pages on success, or NULL if not successful.h](jM)}(h**Parameters**h]j)}(hj3&h]h Parameters}(hj5&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1&ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM^hj-&ubj)}(hhh](j)}(hB``unsigned long nr_pages`` Number of contiguous pages to allocate h](j)}(h``unsigned long nr_pages``h]jS)}(hjR&h]hunsigned long nr_pages}(hjT&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjP&ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM[hjL&ubj)}(hhh]jM)}(h&Number of contiguous pages to allocateh]h&Number of contiguous pages to allocate}(hjk&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjg&hM[hjh&ubah}(h]h ]h"]h$]h&]uh1jhjL&ubeh}(h]h ]h"]h$]h&]uh1jhjg&hM[hjI&ubj)}(h``gfp_t gfp_mask`` GFP mask. Node/zone/placement hints limit the search; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim. h](j)}(h``gfp_t gfp_mask``h]jS)}(hj&h]hgfp_t gfp_mask}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM^hj&ubj)}(hhh]jM)}(hGFP mask. Node/zone/placement hints limit the search; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim.h]hGFP mask. Node/zone/placement hints limit the search; only some action and reclaim modifiers are supported. Reclaim modifiers control allocation behavior during compaction/migration/reclaim.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM\hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hM^hjI&ubj)}(h``int nid`` Target node h](j)}(h ``int nid``h]jS)}(hj&h]hint nid}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM_hj&ubj)}(hhh]jM)}(h Target nodeh]h Target node}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj&hM_hj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hM_hjI&ubj)}(h7``nodemask_t *nodemask`` Mask for other possible nodes h](j)}(h``nodemask_t *nodemask``h]jS)}(hj&h]hnodemask_t *nodemask}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM`hj&ubj)}(hhh]jM)}(hMask for other possible nodesh]hMask for other possible nodes}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'hM`hj'ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj'hM`hjI&ubeh}(h]h ]h"]h$]h&]uh1jhj-&ubjM)}(h**Description**h]j)}(hj9'h]h Description}(hj;'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7'ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMbhj-&ubjM)}(hX9This routine is a wrapper around alloc_contig_frozen_range(). It scans over zones on an applicable zonelist to find a contiguous pfn range which can then be tried for allocation with alloc_contig_frozen_range(). This routine is intended for allocation requests which can not be fulfilled with the buddy allocator.h]hX9This routine is a wrapper around alloc_contig_frozen_range(). It scans over zones on an applicable zonelist to find a contiguous pfn range which can then be tried for allocation with alloc_contig_frozen_range(). This routine is intended for allocation requests which can not be fulfilled with the buddy allocator.}(hjO'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMahj-&ubjM)}(hThe allocated memory is always aligned to a page boundary. If nr_pages is a power of two, then allocated range is also guaranteed to be aligned to same nr_pages (e.g. 1GB request would be aligned to 1GB).h]hThe allocated memory is always aligned to a page boundary. If nr_pages is a power of two, then allocated range is also guaranteed to be aligned to same nr_pages (e.g. 1GB request would be aligned to 1GB).}(hj^'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMghj-&ubjM)}(hAllocated frozen pages need be freed with free_contig_frozen_range(), or by manually calling free_frozen_pages() on each allocated frozen non-compound page, for compound frozen pages could be freed with free_frozen_pages() directly.h]hAllocated frozen pages need be freed with free_contig_frozen_range(), or by manually calling free_frozen_pages() on each allocated frozen non-compound page, for compound frozen pages could be freed with free_frozen_pages() directly.}(hjm'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMkhj-&ubjM)}(h **Return**h]j)}(hj~'h]hReturn}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|'ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMphj-&ubjM)}(hIpointer to contiguous frozen pages on success, or NULL if not successful.h]hIpointer to contiguous frozen pages on success, or NULL if not successful.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMqhj-&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](halloc_contig_pages (C function)c.alloc_contig_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hhstruct page * alloc_contig_pages (unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask)h]h)}(hfstruct page *alloc_contig_pages(unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask)h](j5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj'hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj'hMubh)}(hhh]j)}(hpageh]hpage}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj'modnameN classnameNjpjs)}jv]jy)}jlalloc_contig_pagessbc.alloc_contig_pagesasbuh1hhj'hhhj'hMubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj'hMubjF )}(hjI h]h*}(hj(hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj'hhhj'hMubh)}(halloc_contig_pagesh]j)}(hj(h]halloc_contig_pages}(hj"(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj'hhhj'hMubj )}(hG(unsigned long nr_pages, gfp_t gfp_mask, int nid, nodemask_t *nodemask)h](j )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hj=(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9(ubj)}(h h]h }(hjK(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9(ubj)}(hlongh]hlong}(hjY(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9(ubj)}(h h]h }(hjg(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9(ubj)}(hnr_pagesh]hnr_pages}(hju(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5(ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj(modnameN classnameNjpjs)}jv]j'c.alloc_contig_pagesasbuh1hhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hgfp_maskh]hgfp_mask}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5(ubj )}(hint nidh](j)}(hinth]hint}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hnidh]hnid}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5(ubj )}(hnodemask_t *nodemaskh](h)}(hhh]j)}(h nodemask_th]h nodemask_t}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj )ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]j'c.alloc_contig_pagesasbuh1hhj)ubj)}(h h]h }(hj,)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubjF )}(hjI h]h*}(hj:)hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj)ubj)}(hnodemaskh]hnodemask}(hjG)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5(ubeh}(h]h ]h"]h$]h&]jjuh1j hj'hhhj'hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj'hhhj'hMubah}(h]j'ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj'hMhj'hhubj4)}(hhh]jaW)}(hhh]j/)}(h4tries to find and allocate contiguous range of pagesh]jM)}(hjv)h]h4tries to find and allocate contiguous range of pages}(hjx)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjt)ubah}(h]h ]h"]h$]h&]uh1j/hjq)hhhj)hNubah}(h]h ]h"]h$]h&]jWjWuh1j`Whj)hMhjn)hhubah}(h]h ]h"]h$]h&]uh1j3hj'hhhj'hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj)jHj)jIjJjKuh1hhhhjhNhNubj)}(hXA**Parameters** ``unsigned long nr_pages`` Number of contiguous pages to allocate ``gfp_t gfp_mask`` GFP mask. ``int nid`` Target node ``nodemask_t *nodemask`` Mask for other possible nodes **Description** This routine is a wrapper around alloc_contig_frozen_pages(), it can't be used to allocate compound pages, the refcount of each allocated page will be set to one. Allocated pages can be freed with free_contig_range() or by manually calling __free_page() on each allocated page. **Return** pointer to contiguous pages on success, or NULL if not successful.h](jM)}(h**Parameters**h]j)}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubj)}(hhh](j)}(hB``unsigned long nr_pages`` Number of contiguous pages to allocate h](j)}(h``unsigned long nr_pages``h]jS)}(hj)h]hunsigned long nr_pages}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubj)}(hhh]jM)}(h&Number of contiguous pages to allocateh]h&Number of contiguous pages to allocate}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj)ubj)}(h``gfp_t gfp_mask`` GFP mask. h](j)}(h``gfp_t gfp_mask``h]jS)}(hj)h]hgfp_t gfp_mask}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubj)}(hhh]jM)}(h GFP mask.h]h GFP mask.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj)ubj)}(h``int nid`` Target node h](j)}(h ``int nid``h]jS)}(hj6*h]hint nid}(hj8*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4*ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj0*ubj)}(hhh]jM)}(h Target nodeh]h Target node}(hjO*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjK*hMhjL*ubah}(h]h ]h"]h$]h&]uh1jhj0*ubeh}(h]h ]h"]h$]h&]uh1jhjK*hMhj)ubj)}(h7``nodemask_t *nodemask`` Mask for other possible nodes h](j)}(h``nodemask_t *nodemask``h]jS)}(hjo*h]hnodemask_t *nodemask}(hjq*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjm*ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhji*ubj)}(hhh]jM)}(hMask for other possible nodesh]hMask for other possible nodes}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhji*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)ubjM)}(h**Description**h]j)}(hj*h]h Description}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubjM)}(hThis routine is a wrapper around alloc_contig_frozen_pages(), it can't be used to allocate compound pages, the refcount of each allocated page will be set to one.h]hThis routine is a wrapper around alloc_contig_frozen_pages(), it can’t be used to allocate compound pages, the refcount of each allocated page will be set to one.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubjM)}(hrAllocated pages can be freed with free_contig_range() or by manually calling __free_page() on each allocated page.h]hrAllocated pages can be freed with free_contig_range() or by manually calling __free_page() on each allocated page.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubjM)}(h **Return**h]j)}(hj*h]hReturn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubjM)}(hBpointer to contiguous pages on success, or NULL if not successful.h]hBpointer to contiguous pages on success, or NULL if not successful.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%free_contig_frozen_range (C function)c.free_contig_frozen_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hIvoid free_contig_frozen_range (unsigned long pfn, unsigned long nr_pages)h]h)}(hHvoid free_contig_frozen_range(unsigned long pfn, unsigned long nr_pages)h](j)}(hvoidh]hvoid}(hj%+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!+hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hj4+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!+hhhj3+hMubh)}(hfree_contig_frozen_rangeh]j)}(hfree_contig_frozen_rangeh]hfree_contig_frozen_range}(hjF+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB+ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj!+hhhj3+hMubj )}(h+(unsigned long pfn, unsigned long nr_pages)h](j )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hjb+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^+ubj)}(h h]h }(hjp+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^+ubj)}(hlongh]hlong}(hj~+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^+ubj)}(hpfnh]hpfn}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjZ+ubj )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hlongh]hlong}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hnr_pagesh]hnr_pages}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjZ+ubeh}(h]h ]h"]h$]h&]jjuh1j hj!+hhhj3+hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj+hhhj3+hMubah}(h]j+ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj3+hMhj+hhubj4)}(hhh]jaW)}(hhh]j/)}(h)free the contiguous range of frozen pagesh]jM)}(hj,h]h)free the contiguous range of frozen pages}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj,ubah}(h]h ]h"]h$]h&]uh1j/hj,hhhj),hNubah}(h]h ]h"]h$]h&]jWjWuh1j`Whj),hMhj,hhubah}(h]h ]h"]h$]h&]uh1j3hj+hhhj3+hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj?,jHj?,jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``unsigned long pfn`` start PFN to free ``unsigned long nr_pages`` Number of contiguous frozen pages to free **Description** This can be used to free the allocated compound/non-compound frozen pages.h](jM)}(h**Parameters**h]j)}(hjI,h]h Parameters}(hjK,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG,ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjC,ubj)}(hhh](j)}(h(``unsigned long pfn`` start PFN to free h](j)}(h``unsigned long pfn``h]jS)}(hjh,h]hunsigned long pfn}(hjj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjf,ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjb,ubj)}(hhh]jM)}(hstart PFN to freeh]hstart PFN to free}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj},hMhj~,ubah}(h]h ]h"]h$]h&]uh1jhjb,ubeh}(h]h ]h"]h$]h&]uh1jhj},hMhj_,ubj)}(hE``unsigned long nr_pages`` Number of contiguous frozen pages to free h](j)}(h``unsigned long nr_pages``h]jS)}(hj,h]hunsigned long nr_pages}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj,ubj)}(hhh]jM)}(h)Number of contiguous frozen pages to freeh]h)Number of contiguous frozen pages to free}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj_,ubeh}(h]h ]h"]h$]h&]uh1jhjC,ubjM)}(h**Description**h]j)}(hj,h]h Description}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjC,ubjM)}(hJThis can be used to free the allocated compound/non-compound frozen pages.h]hJThis can be used to free the allocated compound/non-compound frozen pages.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhjC,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfree_contig_range (C function)c.free_contig_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hBvoid free_contig_range (unsigned long pfn, unsigned long nr_pages)h]h)}(hAvoid free_contig_range(unsigned long pfn, unsigned long nr_pages)h](j)}(hvoidh]hvoid}(hj!-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMubj)}(h h]h }(hj0-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj/-hMubh)}(hfree_contig_rangeh]j)}(hfree_contig_rangeh]hfree_contig_range}(hjB-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>-ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj-hhhj/-hMubj )}(h+(unsigned long pfn, unsigned long nr_pages)h](j )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj^-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ-ubj)}(h h]h }(hjl-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ-ubj)}(hlongh]hlong}(hjz-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ-ubj)}(hpfnh]hpfn}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjV-ubj )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hlongh]hlong}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hnr_pagesh]hnr_pages}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjV-ubeh}(h]h ]h"]h$]h&]jjuh1j hj-hhhj/-hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj-hhhj/-hMubah}(h]j-ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/-hMhj-hhubj4)}(hhh]jaW)}(hhh]j/)}(h"free the contiguous range of pagesh]jM)}(hj.h]h"free the contiguous range of pages}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj.ubah}(h]h ]h"]h$]h&]uh1j/hj.hhhj%.hNubah}(h]h ]h"]h$]h&]jWjWuh1j`Whj%.hMhj.hhubah}(h]h ]h"]h$]h&]uh1j3hj-hhhj/-hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj;.jHj;.jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``unsigned long pfn`` start PFN to free ``unsigned long nr_pages`` Number of contiguous pages to free **Description** This can be only used to free the allocated non-compound pages.h](jM)}(h**Parameters**h]j)}(hjE.h]h Parameters}(hjG.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC.ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj?.ubj)}(hhh](j)}(h(``unsigned long pfn`` start PFN to free h](j)}(h``unsigned long pfn``h]jS)}(hjd.h]hunsigned long pfn}(hjf.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjb.ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj^.ubj)}(hhh]jM)}(hstart PFN to freeh]hstart PFN to free}(hj}.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjy.hMhjz.ubah}(h]h ]h"]h$]h&]uh1jhj^.ubeh}(h]h ]h"]h$]h&]uh1jhjy.hMhj[.ubj)}(h>``unsigned long nr_pages`` Number of contiguous pages to free h](j)}(h``unsigned long nr_pages``h]jS)}(hj.h]hunsigned long nr_pages}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj.ubj)}(hhh]jM)}(h"Number of contiguous pages to freeh]h"Number of contiguous pages to free}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hMhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hMhj[.ubeh}(h]h ]h"]h$]h&]uh1jhj?.ubjM)}(h**Description**h]j)}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj?.ubjM)}(h?This can be only used to free the allocated non-compound pages.h]h?This can be only used to free the allocated non-compound pages.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMhj?.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](halloc_pages_nolock (C function)c.alloc_pages_nolockhNtauh1hhjhhhNhNubh)}(hhh](h)}(hOstruct page * alloc_pages_nolock (gfp_t gfp_flags, int nid, unsigned int order)h]h)}(hMstruct page *alloc_pages_nolock(gfp_t gfp_flags, int nid, unsigned int order)h](j5)}(hj8h]hstruct}(hj/hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj/hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMqubj)}(h h]h }(hj+/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhj*/hMqubh)}(hhh]j)}(hpageh]hpage}(hj/modnameN classnameNjpjs)}jv]jy)}jlalloc_pages_nolocksbc.alloc_pages_nolockasbuh1hhj/hhhj*/hMqubj)}(h h]h }(hj]/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhj*/hMqubjF )}(hjI h]h*}(hjk/hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj/hhhj*/hMqubh)}(halloc_pages_nolockh]j)}(hjZ/h]halloc_pages_nolock}(hj|/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx/ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj/hhhj*/hMqubj )}(h.(gfp_t gfp_flags, int nid, unsigned int order)h](j )}(hgfp_t gfp_flagsh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj/modnameN classnameNjpjs)}jv]jX/c.alloc_pages_nolockasbuh1hhj/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(h gfp_flagsh]h gfp_flags}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubj )}(hint nidh](j)}(hinth]hint}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hnidh]hnid}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(h h]h }(hj"0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hinth]hint}(hj00hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(h h]h }(hj>0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(horderh]horder}(hjL0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubeh}(h]h ]h"]h$]h&]jjuh1j hj/hhhj*/hMqubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj/hhhj*/hMqubah}(h]j/ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj*/hMqhj/hhubj4)}(hhh]jM)}(h3opportunistic reentrant allocation from any contexth]h3opportunistic reentrant allocation from any context}(hjv0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMqhjs0hhubah}(h]h ]h"]h$]h&]uh1j3hj/hhhj*/hMqubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj0jHj0jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``gfp_t gfp_flags`` GFP flags. Only __GFP_ACCOUNT, plus some flags that get set internally regardless (see ``gfp_nolock``) are allowed. ``int nid`` node to allocate from ``unsigned int order`` allocation order size **Description** Allocates pages of a given order from the given node. This is safe to call from any context where RCU is watching (from atomic, NMI, and also reentrant allocator -> tracepoint -> alloc_pages_nolock_noprof). Allocation is best effort and to be expected to fail easily so nobody should rely on the success. Failures are not reported via warn_alloc(). See always fail conditions below. **Return** allocated page or NULL on failure. NULL does not mean EBUSY or EAGAIN. It means ENOMEM. There is no reason to call it again and expect !NULL.h](jM)}(h**Parameters**h]j)}(hj0h]h Parameters}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMuhj0ubj)}(hhh](j)}(h``gfp_t gfp_flags`` GFP flags. Only __GFP_ACCOUNT, plus some flags that get set internally regardless (see ``gfp_nolock``) are allowed. h](j)}(h``gfp_t gfp_flags``h]jS)}(hj0h]hgfp_t gfp_flags}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMshj0ubj)}(hhh]jM)}(hsGFP flags. Only __GFP_ACCOUNT, plus some flags that get set internally regardless (see ``gfp_nolock``) are allowed.h](hWGFP flags. Only __GFP_ACCOUNT, plus some flags that get set internally regardless (see }(hj0hhhNhNubjS)}(h``gfp_nolock``h]h gfp_nolock}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0ubh) are allowed.}(hj0hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMrhj0ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj0hMshj0ubj)}(h"``int nid`` node to allocate from h](j)}(h ``int nid``h]jS)}(hj1h]hint nid}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMthj0ubj)}(hhh]jM)}(hnode to allocate fromh]hnode to allocate from}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj1hMthj1ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj1hMthj0ubj)}(h-``unsigned int order`` allocation order size h](j)}(h``unsigned int order``h]jS)}(hj<1h]hunsigned int order}(hj>1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj:1ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMuhj61ubj)}(hhh]jM)}(hallocation order sizeh]hallocation order size}(hjU1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjQ1hMuhjR1ubah}(h]h ]h"]h$]h&]uh1jhj61ubeh}(h]h ]h"]h$]h&]uh1jhjQ1hMuhj0ubeh}(h]h ]h"]h$]h&]uh1jhj0ubjM)}(h**Description**h]j)}(hjw1h]h Description}(hjy1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju1ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMwhj0ubjM)}(hX~Allocates pages of a given order from the given node. This is safe to call from any context where RCU is watching (from atomic, NMI, and also reentrant allocator -> tracepoint -> alloc_pages_nolock_noprof). Allocation is best effort and to be expected to fail easily so nobody should rely on the success. Failures are not reported via warn_alloc(). See always fail conditions below.h]hX~Allocates pages of a given order from the given node. This is safe to call from any context where RCU is watching (from atomic, NMI, and also reentrant allocator -> tracepoint -> alloc_pages_nolock_noprof). Allocation is best effort and to be expected to fail easily so nobody should rely on the success. Failures are not reported via warn_alloc(). See always fail conditions below.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chMvhj0ubjM)}(h **Return**h]j)}(hj1h]hReturn}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM}hj0ubjM)}(hallocated page or NULL on failure. NULL does not mean EBUSY or EAGAIN. It means ENOMEM. There is no reason to call it again and expect !NULL.h]hallocated page or NULL on failure. NULL does not mean EBUSY or EAGAIN. It means ENOMEM. There is no reason to call it again and expect !NULL.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:101: ./mm/page_alloc.chM~hj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hnuma_nearest_node (C function)c.numa_nearest_nodehNtauh1hhjhhhNhNubh)}(hhh](h)}(h4int numa_nearest_node (int node, unsigned int state)h]h)}(h3int numa_nearest_node(int node, unsigned int state)h](j)}(hinth]hint}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhj1hMubh)}(hnuma_nearest_nodeh]j)}(hnuma_nearest_nodeh]hnuma_nearest_node}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj1hhhj1hMubj )}(h(int node, unsigned int state)h](j )}(hint nodeh](j)}(hinth]hint}(hj 2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(h h]h }(hj.2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hnodeh]hnode}(hj<2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubj )}(hunsigned int stateh](j)}(hunsignedh]hunsigned}(hjU2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ2ubj)}(h h]h }(hjc2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ2ubj)}(hinth]hint}(hjq2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ2ubj)}(hstateh]hstate}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQ2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubeh}(h]h ]h"]h$]h&]jjuh1j hj1hhhj1hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj1hhhj1hMubah}(h]j1ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj1hMhj1hhubj4)}(hhh]jM)}(hFind nearest node by stateh]hFind nearest node by state}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2hhubah}(h]h ]h"]h$]h&]uh1j3hj1hhhj1hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj2jHj2jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int node`` Node id to start the search ``unsigned int state`` State to filter the search **Description** Lookup the closest node by distance if **nid** is not in state. **Return** this **node** if it is in state, otherwise the closest node by distanceh](jM)}(h**Parameters**h]j)}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2ubj)}(hhh](j)}(h)``int node`` Node id to start the search h](j)}(h ``int node``h]jS)}(hj2h]hint node}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2ubj)}(hhh]jM)}(hNode id to start the searchh]hNode id to start the search}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj 3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj 3hMhj2ubj)}(h2``unsigned int state`` State to filter the search h](j)}(h``unsigned int state``h]jS)}(hj13h]hunsigned int state}(hj33hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/3ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj+3ubj)}(hhh]jM)}(hState to filter the searchh]hState to filter the search}(hjJ3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjF3hMhjG3ubah}(h]h ]h"]h$]h&]uh1jhj+3ubeh}(h]h ]h"]h$]h&]uh1jhjF3hMhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2ubjM)}(h**Description**h]j)}(hjl3h]h Description}(hjn3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj3ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2ubjM)}(h?Lookup the closest node by distance if **nid** is not in state.h](h'Lookup the closest node by distance if }(hj3hhhNhNubj)}(h**nid**h]hnid}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh is not in state.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2ubjM)}(h **Return**h]j)}(hj3h]hReturn}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2ubjM)}(hGthis **node** if it is in state, otherwise the closest node by distanceh](hthis }(hj3hhhNhNubj)}(h**node**h]hnode}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh: if it is in state, otherwise the closest node by distance}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"nearest_node_nodemask (C function)c.nearest_node_nodemaskhNtauh1hhjhhhNhNubh)}(hhh](h)}(h6int nearest_node_nodemask (int node, nodemask_t *mask)h]h)}(h5int nearest_node_nodemask(int node, nodemask_t *mask)h](j)}(hinth]hint}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM7ubj)}(h h]h }(hj 4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhj 4hM7ubh)}(hnearest_node_nodemaskh]j)}(hnearest_node_nodemaskh]hnearest_node_nodemask}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj3hhhj 4hM7ubj )}(h(int node, nodemask_t *mask)h](j )}(hint nodeh](j)}(hinth]hint}(hj94hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj54ubj)}(h h]h }(hjG4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj54ubj)}(hnodeh]hnode}(hjU4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj54ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj14ubj )}(hnodemask_t *maskh](h)}(hhh]j)}(h nodemask_th]h nodemask_t}(hjq4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn4ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjs4modnameN classnameNjpjs)}jv]jy)}jlj4sbc.nearest_node_nodemaskasbuh1hhjj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj4ubjF )}(hjI h]h*}(hj4hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjj4ubj)}(hmaskh]hmask}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj14ubeh}(h]h ]h"]h$]h&]jjuh1j hj3hhhj 4hM7ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj3hhhj 4hM7ubah}(h]j3ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj 4hM7hj3hhubj4)}(hhh]jM)}(h@Find the node in **mask** at the nearest distance from **node**.h](hFind the node in }(hj4hhhNhNubj)}(h**mask**h]hmask}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh at the nearest distance from }(hj4hhhNhNubj)}(h**node**h]hnode}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM7hj4hhubah}(h]h ]h"]h$]h&]uh1j3hj3hhhj 4hM7ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj5jHj5jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int node`` a valid node ID to start the search from. ``nodemask_t *mask`` a pointer to a nodemask representing the allowed nodes. **Description** This function iterates over all nodes in **mask** and calculates the distance from the starting **node**, then it returns the node ID that is the closest to **node**, or MAX_NUMNODES if no node is found. Note that **node** must be a valid node ID usable with node_distance(), providing an invalid node ID (e.g., NUMA_NO_NODE) may result in crashes or unexpected behavior.h](jM)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM;hj5ubj)}(hhh](j)}(h7``int node`` a valid node ID to start the search from. h](j)}(h ``int node``h]jS)}(hj;5h]hint node}(hj=5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj95ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM:hj55ubj)}(hhh]jM)}(h)a valid node ID to start the search from.h]h)a valid node ID to start the search from.}(hjT5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjP5hM:hjQ5ubah}(h]h ]h"]h$]h&]uh1jhj55ubeh}(h]h ]h"]h$]h&]uh1jhjP5hM:hj25ubj)}(hM``nodemask_t *mask`` a pointer to a nodemask representing the allowed nodes. h](j)}(h``nodemask_t *mask``h]jS)}(hjt5h]hnodemask_t *mask}(hjv5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjr5ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM;hjn5ubj)}(hhh]jM)}(h7a pointer to a nodemask representing the allowed nodes.h]h7a pointer to a nodemask representing the allowed nodes.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5hM;hj5ubah}(h]h ]h"]h$]h&]uh1jhjn5ubeh}(h]h ]h"]h$]h&]uh1jhj5hM;hj25ubeh}(h]h ]h"]h$]h&]uh1jhj5ubjM)}(h**Description**h]j)}(hj5h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM=hj5ubjM)}(hThis function iterates over all nodes in **mask** and calculates the distance from the starting **node**, then it returns the node ID that is the closest to **node**, or MAX_NUMNODES if no node is found.h](h)This function iterates over all nodes in }(hj5hhhNhNubj)}(h**mask**h]hmask}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh/ and calculates the distance from the starting }(hj5hhhNhNubj)}(h**node**h]hnode}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh5, then it returns the node ID that is the closest to }(hj5hhhNhNubj)}(h**node**h]hnode}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh&, or MAX_NUMNODES if no node is found.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM<hj5ubjM)}(hNote that **node** must be a valid node ID usable with node_distance(), providing an invalid node ID (e.g., NUMA_NO_NODE) may result in crashes or unexpected behavior.h](h Note that }(hj 6hhhNhNubj)}(h**node**h]hnode}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 6ubh must be a valid node ID usable with node_distance(), providing an invalid node ID (e.g., NUMA_NO_NODE) may result in crashes or unexpected behavior.}(hj 6hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM@hj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$folio_can_map_prot_numa (C function)c.folio_can_map_prot_numahNtauh1hhjhhhNhNubh)}(hhh](h)}(hobool folio_can_map_prot_numa (struct folio *folio, struct vm_area_struct *vma, bool is_private_single_threaded)h]h)}(hnbool folio_can_map_prot_numa(struct folio *folio, struct vm_area_struct *vma, bool is_private_single_threaded)h](j)}(hj-h]hbool}(hjK6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG6hhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM:ubj)}(h h]h }(hjY6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG6hhhjX6hM:ubh)}(hfolio_can_map_prot_numah]j)}(hfolio_can_map_prot_numah]hfolio_can_map_prot_numa}(hjk6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg6ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjG6hhhjX6hM:ubj )}(hR(struct folio *folio, struct vm_area_struct *vma, bool is_private_single_threaded)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj6hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(hfolioh]hfolio}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj6modnameN classnameNjpjs)}jv]jy)}jljm6sbc.folio_can_map_prot_numaasbuh1hhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjF )}(hjI h]h*}(hj6hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6ubj)}(hfolioh]hfolio}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj6hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj6ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7modnameN classnameNjpjs)}jv]j6c.folio_can_map_prot_numaasbuh1hhj6ubj)}(h h]h }(hj57hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjF )}(hjI h]h*}(hjC7hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6ubj)}(hvmah]hvma}(hjP7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubj )}(hbool is_private_single_threadedh](j)}(hj-h]hbool}(hji7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje7ubj)}(h h]h }(hjv7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje7ubj)}(his_private_single_threadedh]his_private_single_threaded}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubeh}(h]h ]h"]h$]h&]jjuh1j hjG6hhhjX6hM:ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjC6hhhjX6hM:ubah}(h]j>6ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjX6hM:hj@6hhubj4)}(hhh]jM)}(h)check whether the folio can map prot numah]h)check whether the folio can map prot numa}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM:hj7hhubah}(h]h ]h"]h$]h&]uh1j3hj@6hhhjX6hM:ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj7jHj7jIjJjKuh1hhhhjhNhNubj)}(hXn**Parameters** ``struct folio *folio`` The folio whose mapping considered for being made NUMA hintable ``struct vm_area_struct *vma`` The VMA that the folio belongs to. ``bool is_private_single_threaded`` Is this a single-threaded private VMA or not **Description** This function checks to see if the folio actually indicates that we need to make the mapping one which causes a NUMA hinting fault, as there are cases where it's simply unnecessary, and the folio's access time is adjusted for memory tiering if prot numa needed. **Return** True if the mapping of the folio needs to be changed, false otherwise.h](jM)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM>hj7ubj)}(hhh](j)}(hX``struct folio *folio`` The folio whose mapping considered for being made NUMA hintable h](j)}(h``struct folio *folio``h]jS)}(hj7h]hstruct folio *folio}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj7ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM;hj7ubj)}(hhh]jM)}(h?The folio whose mapping considered for being made NUMA hintableh]h?The folio whose mapping considered for being made NUMA hintable}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj8hM;hj8ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj8hM;hj7ubj)}(hB``struct vm_area_struct *vma`` The VMA that the folio belongs to. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj(8h]hstruct vm_area_struct *vma}(hj*8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&8ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM<hj"8ubj)}(hhh]jM)}(h"The VMA that the folio belongs to.h]h"The VMA that the folio belongs to.}(hjA8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=8hM<hj>8ubah}(h]h ]h"]h$]h&]uh1jhj"8ubeh}(h]h ]h"]h$]h&]uh1jhj=8hM<hj7ubj)}(hQ``bool is_private_single_threaded`` Is this a single-threaded private VMA or not h](j)}(h#``bool is_private_single_threaded``h]jS)}(hja8h]hbool is_private_single_threaded}(hjc8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_8ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM=hj[8ubj)}(hhh]jM)}(h,Is this a single-threaded private VMA or noth]h,Is this a single-threaded private VMA or not}(hjz8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjv8hM=hjw8ubah}(h]h ]h"]h$]h&]uh1jhj[8ubeh}(h]h ]h"]h$]h&]uh1jhjv8hM=hj7ubeh}(h]h ]h"]h$]h&]uh1jhj7ubjM)}(h**Description**h]j)}(hj8h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM?hj7ubjM)}(hXThis function checks to see if the folio actually indicates that we need to make the mapping one which causes a NUMA hinting fault, as there are cases where it's simply unnecessary, and the folio's access time is adjusted for memory tiering if prot numa needed.h]hX This function checks to see if the folio actually indicates that we need to make the mapping one which causes a NUMA hinting fault, as there are cases where it’s simply unnecessary, and the folio’s access time is adjusted for memory tiering if prot numa needed.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM>hj7ubjM)}(h **Return**h]j)}(hj8h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMChj7ubjM)}(hFTrue if the mapping of the folio needs to be changed, false otherwise.h]hFTrue if the mapping of the folio needs to be changed, false otherwise.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMDhj7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](halloc_pages_mpol (C function)c.alloc_pages_mpolhNtauh1hhjhhhNhNubh)}(hhh](h)}(hkstruct page * alloc_pages_mpol (gfp_t gfp, unsigned int order, struct mempolicy *pol, pgoff_t ilx, int nid)h]h)}(histruct page *alloc_pages_mpol(gfp_t gfp, unsigned int order, struct mempolicy *pol, pgoff_t ilx, int nid)h](j5)}(hj8h]hstruct}(hj9hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj9hhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhj9hM ubh)}(hhh]j)}(hpageh]hpage}(hj'9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)9modnameN classnameNjpjs)}jv]jy)}jlalloc_pages_mpolsbc.alloc_pages_mpolasbuh1hhj9hhhj9hM ubj)}(h h]h }(hjH9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhj9hM ubjF )}(hjI h]h*}(hjV9hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj9hhhj9hM ubh)}(halloc_pages_mpolh]j)}(hjE9h]halloc_pages_mpol}(hjg9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc9ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj9hhhj9hM ubj )}(hL(gfp_t gfp, unsigned int order, struct mempolicy *pol, pgoff_t ilx, int nid)h](j )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]jC9c.alloc_pages_mpolasbuh1hhj~9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~9ubj)}(hgfph]hgfp}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz9ubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hinth]hint}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(horderh]horder}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz9ubj )}(hstruct mempolicy *polh](j5)}(hj8h]hstruct}(hj:hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj:ubj)}(h h]h }(hj(:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubh)}(hhh]j)}(h mempolicyh]h mempolicy}(hj9:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6:ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj;:modnameN classnameNjpjs)}jv]jC9c.alloc_pages_mpolasbuh1hhj:ubj)}(h h]h }(hjW:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubjF )}(hjI h]h*}(hje:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj:ubj)}(hpolh]hpol}(hjr:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz9ubj )}(h pgoff_t ilxh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj:modnameN classnameNjpjs)}jv]jC9c.alloc_pages_mpolasbuh1hhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hilxh]hilx}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz9ubj )}(hint nidh](j)}(hinth]hint}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hnidh]hnid}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz9ubeh}(h]h ]h"]h$]h&]jjuh1j hj9hhhj9hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj9hhhj9hM ubah}(h]j8ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj9hM hj8hhubj4)}(hhh]jM)}(h+Allocate pages according to NUMA mempolicy.h]h+Allocate pages according to NUMA mempolicy.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj;hhubah}(h]h ]h"]h$]h&]uh1j3hj8hhhj9hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj1;jHj1;jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``gfp_t gfp`` GFP flags. ``unsigned int order`` Order of the page allocation. ``struct mempolicy *pol`` Pointer to the NUMA mempolicy. ``pgoff_t ilx`` Index for interleave mempolicy (also distinguishes alloc_pages()). ``int nid`` Preferred node (usually numa_node_id() but **mpol** may override it). **Return** The page on success or NULL if allocation fails.h](jM)}(h**Parameters**h]j)}(hj;;h]h Parameters}(hj=;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9;ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj5;ubj)}(hhh](j)}(h``gfp_t gfp`` GFP flags. h](j)}(h ``gfp_t gfp``h]jS)}(hjZ;h]h gfp_t gfp}(hj\;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjX;ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjT;ubj)}(hhh]jM)}(h GFP flags.h]h GFP flags.}(hjs;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjo;hM hjp;ubah}(h]h ]h"]h$]h&]uh1jhjT;ubeh}(h]h ]h"]h$]h&]uh1jhjo;hM hjQ;ubj)}(h5``unsigned int order`` Order of the page allocation. h](j)}(h``unsigned int order``h]jS)}(hj;h]hunsigned int order}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj;ubj)}(hhh]jM)}(hOrder of the page allocation.h]hOrder of the page allocation.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;hM hj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hjQ;ubj)}(h9``struct mempolicy *pol`` Pointer to the NUMA mempolicy. h](j)}(h``struct mempolicy *pol``h]jS)}(hj;h]hstruct mempolicy *pol}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj;ubj)}(hhh]jM)}(hPointer to the NUMA mempolicy.h]hPointer to the NUMA mempolicy.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;hM hj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hM hjQ;ubj)}(hS``pgoff_t ilx`` Index for interleave mempolicy (also distinguishes alloc_pages()). h](j)}(h``pgoff_t ilx``h]jS)}(hj<h]h pgoff_t ilx}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj;ubj)}(hhh]jM)}(hBIndex for interleave mempolicy (also distinguishes alloc_pages()).h]hBIndex for interleave mempolicy (also distinguishes alloc_pages()).}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hM hj<ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj<hM hjQ;ubj)}(hR``int nid`` Preferred node (usually numa_node_id() but **mpol** may override it). h](j)}(h ``int nid``h]jS)}(hj><h]hint nid}(hj@<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<<ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj8<ubj)}(hhh]jM)}(hEPreferred node (usually numa_node_id() but **mpol** may override it).h](h+Preferred node (usually numa_node_id() but }(hjW<hhhNhNubj)}(h**mpol**h]hmpol}(hj_<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW<ubh may override it).}(hjW<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjS<hM hjT<ubah}(h]h ]h"]h$]h&]uh1jhj8<ubeh}(h]h ]h"]h$]h&]uh1jhjS<hM hjQ;ubeh}(h]h ]h"]h$]h&]uh1jhj5;ubjM)}(h **Return**h]j)}(hj<h]hReturn}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj5;ubjM)}(h0The page on success or NULL if allocation fails.h]h0The page on success or NULL if allocation fails.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj5;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvma_alloc_folio (C function)c.vma_alloc_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hestruct folio * vma_alloc_folio (gfp_t gfp, int order, struct vm_area_struct *vma, unsigned long addr)h]h)}(hcstruct folio *vma_alloc_folio(gfp_t gfp, int order, struct vm_area_struct *vma, unsigned long addr)h](j5)}(hj8h]hstruct}(hj<hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj<hhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhj<hM ubh)}(hhh]j)}(hfolioh]hfolio}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj<modnameN classnameNjpjs)}jv]jy)}jlvma_alloc_foliosbc.vma_alloc_folioasbuh1hhj<hhhj<hM ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhj<hM ubjF )}(hjI h]h*}(hj=hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj<hhhj<hM ubh)}(hvma_alloc_folioh]j)}(hj =h]hvma_alloc_folio}(hj/=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+=ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj<hhhj<hM ubj )}(hF(gfp_t gfp, int order, struct vm_area_struct *vma, unsigned long addr)h](j )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjM=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJ=ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjO=modnameN classnameNjpjs)}jv]j =c.vma_alloc_folioasbuh1hhjF=ubj)}(h h]h }(hjk=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF=ubj)}(hgfph]hgfp}(hjy=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjF=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjB=ubj )}(h int orderh](j)}(hinth]hint}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj)}(horderh]horder}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjB=ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj=hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]j =c.vma_alloc_folioasbuh1hhj=ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubjF )}(hjI h]h*}(hj>hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj=ubj)}(hvmah]hvma}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjB=ubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hj7>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3>ubj)}(h h]h }(hjE>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3>ubj)}(hlongh]hlong}(hjS>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3>ubj)}(h h]h }(hja>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3>ubj)}(haddrh]haddr}(hjo>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjB=ubeh}(h]h ]h"]h$]h&]jjuh1j hj<hhhj<hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj<hhhj<hM ubah}(h]j<ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj<hM hj<hhubj4)}(hhh]jM)}(hAllocate a folio for a VMA.h]hAllocate a folio for a VMA.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>hhubah}(h]h ]h"]h$]h&]uh1j3hj<hhhj<hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj>jHj>jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``gfp_t gfp`` GFP flags. ``int order`` Order of the folio. ``struct vm_area_struct *vma`` Pointer to VMA. ``unsigned long addr`` Virtual address of the allocation. Must be inside **vma**. **Description** Allocate a folio for a specific address in **vma**, using the appropriate NUMA policy. The caller must hold the mmap_lock of the mm_struct of the VMA to prevent it from going away. Should be used for all allocations for folios that will be mapped into user space, excepting hugetlbfs, and excepting where direct use of folio_alloc_mpol() is more appropriate. **Return** The folio on success or NULL if allocation fails.h](jM)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>ubj)}(hhh](j)}(h``gfp_t gfp`` GFP flags. h](j)}(h ``gfp_t gfp``h]jS)}(hj>h]h gfp_t gfp}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>ubj)}(hhh]jM)}(h GFP flags.h]h GFP flags.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>hM hj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hM hj>ubj)}(h"``int order`` Order of the folio. h](j)}(h ``int order``h]jS)}(hj?h]h int order}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj ?ubj)}(hhh]jM)}(hOrder of the folio.h]hOrder of the folio.}(hj,?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(?hM hj)?ubah}(h]h ]h"]h$]h&]uh1jhj ?ubeh}(h]h ]h"]h$]h&]uh1jhj(?hM hj>ubj)}(h/``struct vm_area_struct *vma`` Pointer to VMA. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjL?h]hstruct vm_area_struct *vma}(hjN?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjJ?ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjF?ubj)}(hhh]jM)}(hPointer to VMA.h]hPointer to VMA.}(hje?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhja?hM hjb?ubah}(h]h ]h"]h$]h&]uh1jhjF?ubeh}(h]h ]h"]h$]h&]uh1jhja?hM hj>ubj)}(hS``unsigned long addr`` Virtual address of the allocation. Must be inside **vma**. h](j)}(h``unsigned long addr``h]jS)}(hj?h]hunsigned long addr}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj?ubj)}(hhh]jM)}(h;Virtual address of the allocation. Must be inside **vma**.h](h3Virtual address of the allocation. Must be inside }(hj?hhhNhNubj)}(h**vma**h]hvma}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj?hM hj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj?hM hj>ubeh}(h]h ]h"]h$]h&]uh1jhj>ubjM)}(h**Description**h]j)}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>ubjM)}(hXhAllocate a folio for a specific address in **vma**, using the appropriate NUMA policy. The caller must hold the mmap_lock of the mm_struct of the VMA to prevent it from going away. Should be used for all allocations for folios that will be mapped into user space, excepting hugetlbfs, and excepting where direct use of folio_alloc_mpol() is more appropriate.h](h+Allocate a folio for a specific address in }(hj?hhhNhNubj)}(h**vma**h]hvma}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubhX6, using the appropriate NUMA policy. The caller must hold the mmap_lock of the mm_struct of the VMA to prevent it from going away. Should be used for all allocations for folios that will be mapped into user space, excepting hugetlbfs, and excepting where direct use of folio_alloc_mpol() is more appropriate.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>ubjM)}(h **Return**h]j)}(hj @h]hReturn}(hj @hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj @ubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>ubjM)}(h1The folio on success or NULL if allocation fails.h]h1The folio on success or NULL if allocation fails.}(hj!@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](halloc_pages (C function) c.alloc_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h9struct page * alloc_pages (gfp_t gfp, unsigned int order)h]h)}(h7struct page *alloc_pages(gfp_t gfp, unsigned int order)h](j5)}(hj8h]hstruct}(hjP@hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjL@hhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM ubj)}(h h]h }(hj^@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL@hhhj]@hM ubh)}(hhh]j)}(hpageh]hpage}(hjo@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjq@modnameN classnameNjpjs)}jv]jy)}jl alloc_pagessb c.alloc_pagesasbuh1hhjL@hhhj]@hM ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL@hhhj]@hM ubjF )}(hjI h]h*}(hj@hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjL@hhhj]@hM ubh)}(h alloc_pagesh]j)}(hj@h]h alloc_pages}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjL@hhhj]@hM ubj )}(h(gfp_t gfp, unsigned int order)h](j )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@modnameN classnameNjpjs)}jv]j@ c.alloc_pagesasbuh1hhj@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(hgfph]hgfp}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj@ubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hj AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hinth]hint}(hj.AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hjHubj )}(hstruct mempolicy **mpolh](j5)}(hj8h]hstruct}(hjHhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjHubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubh)}(hhh]j)}(h mempolicyh]h mempolicy}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjHmodnameN classnameNjpjs)}jv]jy)}jlj,Hsbc.mpol_parse_strasbuh1hhjHubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubjF )}(hjI h]h*}(hjHhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjHubjF )}(hjI h]h*}(hjHhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjHubj)}(hmpolh]hmpol}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj>Hubeh}(h]h ]h"]h$]h&]jjuh1j hjHhhhjHhMO ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjHhhhjHhMO ubah}(h]jGah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjHhMO hjGhhubj4)}(hhh]jM)}(h7parse string to mempolicy, for tmpfs mpol mount option.h]h7parse string to mempolicy, for tmpfs mpol mount option.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMO hjIhhubah}(h]h ]h"]h$]h&]uh1j3hjGhhhjHhMO ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj0IjHj0IjIjJjKuh1hhhhjhNhNubj)}(hX **Parameters** ``char *str`` string containing mempolicy to parse ``struct mempolicy **mpol`` pointer to struct mempolicy pointer, returned on success. **Description** Format of input: [=][:] **Return** ``0`` on success, else ``1``h](jM)}(h**Parameters**h]j)}(hj:Ih]h Parameters}(hj[=][:] h](j)}(hFormat of input:h]hFormat of input:}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMS hjIubj)}(hhh]jM)}(h[=][:]h]h[=][:]}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhMS hjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjIhMS hjIubah}(h]h ]h"]h$]h&]uh1jhj4IubjM)}(h **Return**h]j)}(hjJh]hReturn}(hj JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMU hj4IubjM)}(h``0`` on success, else ``1``h](jS)}(h``0``h]h0}(hj8JhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4Jubh on success, else }(hj4JhhhNhNubjS)}(h``1``h]h1}(hjJJhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4Jubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chMV hj4Iubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmpol_to_str (C function) c.mpol_to_strhNtauh1hhjhhhNhNubh)}(hhh](h)}(hBvoid mpol_to_str (char *buffer, int maxlen, struct mempolicy *pol)h]h)}(hAvoid mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol)h](j)}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{JhhhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{JhhhjJhM ubh)}(h mpol_to_strh]j)}(h mpol_to_strh]h mpol_to_str}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]jjuh1hhj{JhhhjJhM ubj )}(h1(char *buffer, int maxlen, struct mempolicy *pol)h](j )}(h char *bufferh](j)}(hcharh]hchar}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubjF )}(hjI h]h*}(hjJhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjJubj)}(hbufferh]hbuffer}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjJubj )}(h int maxlenh](j)}(hinth]hint}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(h h]h }(hj KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubj)}(hmaxlenh]hmaxlen}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjJubj )}(hstruct mempolicy *polh](j5)}(hj8h]hstruct}(hj3KhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj/Kubj)}(h h]h }(hj@KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Kubh)}(hhh]j)}(h mempolicyh]h mempolicy}(hjQKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNKubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjSKmodnameN classnameNjpjs)}jv]jy)}jljJsb c.mpol_to_strasbuh1hhj/Kubj)}(h h]h }(hjqKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/KubjF )}(hjI h]h*}(hjKhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj/Kubj)}(hpolh]hpol}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Kubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjJubeh}(h]h ]h"]h$]h&]jjuh1j hj{JhhhjJhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjwJhhhjJhM ubah}(h]jrJah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjJhM hjtJhhubj4)}(hhh]jM)}(h)format a mempolicy structure for printingh]h)format a mempolicy structure for printing}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjKhhubah}(h]h ]h"]h$]h&]uh1j3hjtJhhhjJhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjKjHjKjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``char *buffer`` to contain formatted mempolicy string ``int maxlen`` length of **buffer** ``struct mempolicy *pol`` pointer to mempolicy to be formatted **Description** Convert **pol** into a string. If **buffer** is too short, truncate the string. Recommend a **maxlen** of at least 51 for the longest mode, "weighted interleave", plus the longest flag flags, "relative|balancing", and to display at least a few node ids.h](jM)}(h**Parameters**h]j)}(hjKh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjKubj)}(hhh](j)}(h7``char *buffer`` to contain formatted mempolicy string h](j)}(h``char *buffer``h]jS)}(hjKh]h char *buffer}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjKubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjKubj)}(hhh]jM)}(h%to contain formatted mempolicy stringh]h%to contain formatted mempolicy string}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj LhM hj Lubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhj LhM hjKubj)}(h$``int maxlen`` length of **buffer** h](j)}(h``int maxlen``h]jS)}(hj0Lh]h int maxlen}(hj2LhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.Lubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hj*Lubj)}(hhh]jM)}(hlength of **buffer**h](h length of }(hjILhhhNhNubj)}(h **buffer**h]hbuffer}(hjQLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjILubeh}(h]h ]h"]h$]h&]uh1jLhjELhM hjFLubah}(h]h ]h"]h$]h&]uh1jhj*Lubeh}(h]h ]h"]h$]h&]uh1jhjELhM hjKubj)}(h?``struct mempolicy *pol`` pointer to mempolicy to be formatted h](j)}(h``struct mempolicy *pol``h]jS)}(hjwLh]hstruct mempolicy *pol}(hjyLhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjuLubah}(h]h ]h"]h$]h&]uh1jhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjqLubj)}(hhh]jM)}(h$pointer to mempolicy to be formattedh]h$pointer to mempolicy to be formatted}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhM hjLubah}(h]h ]h"]h$]h&]uh1jhjqLubeh}(h]h ]h"]h$]h&]uh1jhjLhM hjKubeh}(h]h ]h"]h$]h&]uh1jhjKubjM)}(h**Description**h]j)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjKubjM)}(hConvert **pol** into a string. If **buffer** is too short, truncate the string. Recommend a **maxlen** of at least 51 for the longest mode, "weighted interleave", plus the longest flag flags, "relative|balancing", and to display at least a few node ids.h](hConvert }(hjLhhhNhNubj)}(h**pol**h]hpol}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh into a string. If }(hjLhhhNhNubj)}(h **buffer**h]hbuffer}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh0 is too short, truncate the string. Recommend a }(hjLhhhNhNubj)}(h **maxlen**h]hmaxlen}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh of at least 51 for the longest mode, “weighted interleave”, plus the longest flag flags, “relative|balancing”, and to display at least a few node ids.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhO/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:102: ./mm/mempolicy.chM hjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hsoftleaf_t (C type) c.softleaf_thNtauh1hhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhNubh)}(hhh](h)}(h softleaf_th]h)}(htype softleaf_th](j5)}(hjUh]htype}(hj.MhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj*MhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKubj)}(h h]h }(hjPhMmhjOubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]jS)}(hjcPh]h{unnamed_union}}(hjePhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjaPubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhj]Pubj)}(hhh]jM)}(h anonymoush]h anonymous}(hj|PhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjxPhKhjyPubah}(h]h ]h"]h$]h&]uh1jhj]Pubeh}(h]h ]h"]h$]h&]uh1jhjxPhKhjOubj)}(h~``index`` Offset within the file, in units of pages. For anonymous memory, this is the index from the beginning of the mmap. h](j)}(h ``index``h]jS)}(hjPh]hindex}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjPubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMohjPubj)}(hhh]jM)}(hsOffset within the file, in units of pages. For anonymous memory, this is the index from the beginning of the mmap.h]hsOffset within the file, in units of pages. For anonymous memory, this is the index from the beginning of the mmap.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMnhjPubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjPhMohjOubj)}(hU``share`` number of DAX mappings that reference this folio. See dax_associate_entry. h](j)}(h ``share``h]jS)}(hjPh]hshare}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjPubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMqhjPubj)}(hhh]jM)}(hJnumber of DAX mappings that reference this folio. See dax_associate_entry.h]hJnumber of DAX mappings that reference this folio. See dax_associate_entry.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMphjPubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjPhMqhjOubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]jS)}(hjQh]h{unnamed_union}}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhj Qubj)}(hhh]jM)}(h anonymoush]h anonymous}(hj)QhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%QhKhj&Qubah}(h]h ]h"]h$]h&]uh1jhj Qubeh}(h]h ]h"]h$]h&]uh1jhj%QhKhjOubj)}(hD``private`` Filesystem per-folio data (see folio_attach_private()). h](j)}(h ``private``h]jS)}(hjIQh]hprivate}(hjKQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjGQubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMrhjCQubj)}(hhh]jM)}(h7Filesystem per-folio data (see folio_attach_private()).h]h7Filesystem per-folio data (see folio_attach_private()).}(hjbQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj^QhMrhj_Qubah}(h]h ]h"]h$]h&]uh1jhjCQubeh}(h]h ]h"]h$]h&]uh1jhj^QhMrhjOubj)}(h9``swap`` Used for swp_entry_t if folio_test_swapcache(). h](j)}(h``swap``h]jS)}(hjQh]hswap}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMshj|Qubj)}(hhh]jM)}(h/Used for swp_entry_t if folio_test_swapcache().h]h/Used for swp_entry_t if folio_test_swapcache().}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjQhMshjQubah}(h]h ]h"]h$]h&]uh1jhj|Qubeh}(h]h ]h"]h$]h&]uh1jhjQhMshjOubj)}(hT``migrate_info`` Stores migration state (anon_vma pointer and FOLIO_WAS_* markers). h](j)}(h``migrate_info``h]jS)}(hjQh]h migrate_info}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMuhjQubj)}(hhh]jM)}(hBStores migration state (anon_vma pointer and FOLIO_WAS_* markers).h]hBStores migration state (anon_vma pointer and FOLIO_WAS_* markers).}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMthjQubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjQhMuhjOubj)}(h``_mapcount`` Do not access this member directly. Use folio_mapcount() to find out how many times this folio is mapped by userspace. h](j)}(h ``_mapcount``h]jS)}(hjQh]h _mapcount}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMwhjQubj)}(hhh]jM)}(hwDo not access this member directly. Use folio_mapcount() to find out how many times this folio is mapped by userspace.h]hwDo not access this member directly. Use folio_mapcount() to find out how many times this folio is mapped by userspace.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMvhj Rubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhj RhMwhjOubj)}(h~``_refcount`` Do not access this member directly. Use folio_ref_count() to find how many references there are to this folio. h](j)}(h ``_refcount``h]jS)}(hj/Rh]h _refcount}(hj1RhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj-Rubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMyhj)Rubj)}(hhh]jM)}(hoDo not access this member directly. Use folio_ref_count() to find how many references there are to this folio.h]hoDo not access this member directly. Use folio_ref_count() to find how many references there are to this folio.}(hjHRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMxhjERubah}(h]h ]h"]h$]h&]uh1jhj)Rubeh}(h]h ]h"]h$]h&]uh1jhjDRhMyhjOubj)}(h*``memcg_data`` Memory Control Group data. h](j)}(h``memcg_data``h]jS)}(hjiRh]h memcg_data}(hjkRhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgRubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMzhjcRubj)}(hhh]jM)}(hMemory Control Group data.h]hMemory Control Group data.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~RhMzhjRubah}(h]h ]h"]h$]h&]uh1jhjcRubeh}(h]h ]h"]h$]h&]uh1jhj~RhMzhjOubj)}(hH``_unused_slab_obj_exts`` Placeholder to match obj_exts in struct slab. h](j)}(h``_unused_slab_obj_exts``h]jS)}(hjRh]h_unused_slab_obj_exts}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjRubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjRubj)}(hhh]jM)}(h-Placeholder to match obj_exts in struct slab.h]h-Placeholder to match obj_exts in struct slab.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjRhMhjRubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jhjRhMhjOubj)}(h6``virtual`` Virtual address in the kernel direct map. h](j)}(h ``virtual``h]jS)}(hjRh]hvirtual}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjRubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM|hjRubj)}(hhh]jM)}(h)Virtual address in the kernel direct map.h]h)Virtual address in the kernel direct map.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjRhM|hjRubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jhjRhM|hjOubj)}(hK``_last_cpupid`` IDs of last CPU and last process that accessed the folio. h](j)}(h``_last_cpupid``h]jS)}(hjSh]h _last_cpupid}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjSubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM}hjSubj)}(hhh]jM)}(h9IDs of last CPU and last process that accessed the folio.h]h9IDs of last CPU and last process that accessed the folio.}(hj-ShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)ShM}hj*Subah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhj)ShM}hjOubj)}(h@``_large_mapcount`` Do not use directly, call folio_mapcount(). h](j)}(h``_large_mapcount``h]jS)}(hjMSh]h_large_mapcount}(hjOShhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjKSubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjGSubj)}(hhh]jM)}(h+Do not use directly, call folio_mapcount().h]h+Do not use directly, call folio_mapcount().}(hjfShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjbShMhjcSubah}(h]h ]h"]h$]h&]uh1jhjGSubeh}(h]h ]h"]h$]h&]uh1jhjbShMhjOubj)}(h@``_nr_pages_mapped`` Do not use outside of rmap and debug code. h](j)}(h``_nr_pages_mapped``h]jS)}(hjSh]h_nr_pages_mapped}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjSubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjSubj)}(hhh]jM)}(h*Do not use outside of rmap and debug code.h]h*Do not use outside of rmap and debug code.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjShMhjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjShMhjOubj)}(hH``_entire_mapcount`` Do not use directly, call folio_entire_mapcount(). h](j)}(h``_entire_mapcount``h]jS)}(hjSh]h_entire_mapcount}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjSubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM~hjSubj)}(hhh]jM)}(h2Do not use directly, call folio_entire_mapcount().h]h2Do not use directly, call folio_entire_mapcount().}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjShM~hjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjShM~hjOubj)}(hB``_pincount`` Do not use directly, call folio_maybe_dma_pinned(). h](j)}(h ``_pincount``h]jS)}(hjSh]h _pincount}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjSubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjSubj)}(hhh]jM)}(h3Do not use directly, call folio_maybe_dma_pinned().h]h3Do not use directly, call folio_maybe_dma_pinned().}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ThMhjTubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhj ThMhjOubj)}(h5``_mm_id_mapcount`` Do not use outside of rmap code. h](j)}(h``_mm_id_mapcount``h]jS)}(hj1Th]h_mm_id_mapcount}(hj3ThhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/Tubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj+Tubj)}(hhh]jM)}(h Do not use outside of rmap code.h]h Do not use outside of rmap code.}(hjJThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjFThMhjGTubah}(h]h ]h"]h$]h&]uh1jhj+Tubeh}(h]h ]h"]h$]h&]uh1jhjFThMhjOubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]jS)}(hjjTh]h{unnamed_union}}(hjlThhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhTubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhjdTubj)}(hhh]jM)}(h anonymoush]h anonymous}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjThKhjTubah}(h]h ]h"]h$]h&]uh1jhjdTubeh}(h]h ]h"]h$]h&]uh1jhjThKhjOubj)}(h,``_mm_id`` Do not use outside of rmap code. h](j)}(h ``_mm_id``h]jS)}(hjTh]h_mm_id}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjTubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjTubj)}(hhh]jM)}(h Do not use outside of rmap code.h]h Do not use outside of rmap code.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjThMhjTubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjThMhjOubj)}(h-``_mm_ids`` Do not use outside of rmap code. h](j)}(h ``_mm_ids``h]jS)}(hjTh]h_mm_ids}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjTubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjTubj)}(hhh]jM)}(h Do not use outside of rmap code.h]h Do not use outside of rmap code.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjThMhjTubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjThMhjOubj)}(h:``_nr_pages`` Do not use directly, call folio_nr_pages(). h](j)}(h ``_nr_pages``h]jS)}(hjUh]h _nr_pages}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjUubj)}(hhh]jM)}(h+Do not use directly, call folio_nr_pages().h]h+Do not use directly, call folio_nr_pages().}(hj.UhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*UhMhj+Uubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhj*UhMhjOubj)}(h=``_deferred_list`` Folios to be split under memory pressure. h](j)}(h``_deferred_list``h]jS)}(hjNUh]h_deferred_list}(hjPUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLUubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjHUubj)}(hhh]jM)}(h)Folios to be split under memory pressure.h]h)Folios to be split under memory pressure.}(hjgUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjcUhMhjdUubah}(h]h ]h"]h$]h&]uh1jhjHUubeh}(h]h ]h"]h$]h&]uh1jhjcUhMhjOubj)}(hH``_entire_mapcount`` Do not use directly, call folio_entire_mapcount(). h](j)}(h``_entire_mapcount``h]jS)}(hjUh]h_entire_mapcount}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM~hjUubj)}(hhh]jM)}(h2Do not use directly, call folio_entire_mapcount().h]h2Do not use directly, call folio_entire_mapcount().}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjUhM~hjUubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjUhM~hjOubj)}(hB``_pincount`` Do not use directly, call folio_maybe_dma_pinned(). h](j)}(h ``_pincount``h]jS)}(hjUh]h _pincount}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjUubj)}(hhh]jM)}(h3Do not use directly, call folio_maybe_dma_pinned().h]h3Do not use directly, call folio_maybe_dma_pinned().}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjUhMhjUubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjUhMhjOubj)}(hE``_hugetlb_subpool`` Do not use directly, use accessor in hugetlb.h. h](j)}(h``_hugetlb_subpool``h]jS)}(hjUh]h_hugetlb_subpool}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjUubj)}(hhh]jM)}(h/Do not use directly, use accessor in hugetlb.h.h]h/Do not use directly, use accessor in hugetlb.h.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjOubj)}(hK``_hugetlb_cgroup`` Do not use directly, use accessor in hugetlb_cgroup.h. h](j)}(h``_hugetlb_cgroup``h]jS)}(hj2Vh]h_hugetlb_cgroup}(hj4VhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0Vubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj,Vubj)}(hhh]jM)}(h6Do not use directly, use accessor in hugetlb_cgroup.h.h]h6Do not use directly, use accessor in hugetlb_cgroup.h.}(hjKVhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjGVhMhjHVubah}(h]h ]h"]h$]h&]uh1jhj,Vubeh}(h]h ]h"]h$]h&]uh1jhjGVhMhjOubj)}(hP``_hugetlb_cgroup_rsvd`` Do not use directly, use accessor in hugetlb_cgroup.h. h](j)}(h``_hugetlb_cgroup_rsvd``h]jS)}(hjkVh]h_hugetlb_cgroup_rsvd}(hjmVhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiVubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjeVubj)}(hhh]jM)}(h6Do not use directly, use accessor in hugetlb_cgroup.h.h]h6Do not use directly, use accessor in hugetlb_cgroup.h.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jhjeVubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjOubj)}(hD``_hugetlb_hwpoison`` Do not use directly, call raw_hwp_list_head().h](j)}(h``_hugetlb_hwpoison``h]jS)}(hjVh]h_hugetlb_hwpoison}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjVubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjVubj)}(hhh]jM)}(h.Do not use directly, call raw_hwp_list_head().h]h.Do not use directly, call raw_hwp_list_head().}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjVubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjOubeh}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj"MhNubjM)}(h**Description**h]j)}(hjVh]h Description}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjhhubjM)}(hXA folio is a physically, virtually and logically contiguous set of bytes. It is a power-of-two in size, and it is aligned to that same power-of-two. It is at least as large as ``PAGE_SIZE``. If it is in the page cache, it is at a file offset which is a multiple of that power-of-two. It may be mapped into userspace at an address which is at an arbitrary page offset, but its kernel virtual address is aligned to its size.h](hA folio is a physically, virtually and logically contiguous set of bytes. It is a power-of-two in size, and it is aligned to that same power-of-two. It is at least as large as }(hjVhhhNhNubjS)}(h ``PAGE_SIZE``h]h PAGE_SIZE}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjVubh. If it is in the page cache, it is at a file offset which is a multiple of that power-of-two. It may be mapped into userspace at an address which is at an arbitrary page offset, but its kernel virtual address is aligned to its size.}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hptdesc (C struct)c.ptdeschNtauh1hhjhhhj"MhNubh)}(hhh](h)}(hptdesch]h)}(h struct ptdesch](j5)}(hj8h]hstruct}(hj7WhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj3WhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMubj)}(h h]h }(hjEWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3WhhhjDWhMubh)}(hptdesch]j)}(hj1Wh]hptdesc}(hjWWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSWubah}(h]h ](jjeh"]h$]h&]jjuh1hhj3WhhhjDWhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj/WhhhjDWhMubah}(h]j*Wah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjDWhMhj,Whhubj4)}(hhh]jM)}(h"Memory descriptor for page tables.h]h"Memory descriptor for page tables.}(hjyWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM*hjvWhhubah}(h]h ]h"]h$]h&]uh1j3hj,WhhhjDWhMubeh}(h]h ](jAstructeh"]h$]h&]jFjAjGjWjHjWjIjJjKuh1hhhhjhj"MhNubj)}(hX**Definition**:: struct ptdesc { memdesc_flags_t pt_flags; union { struct rcu_head pt_rcu_head; struct list_head pt_list; struct { unsigned long _pt_pad_1; pgtable_t pmd_huge_pte; }; }; unsigned long __page_mapping; union { pgoff_t pt_index; struct mm_struct *pt_mm; atomic_t pt_frag_refcount; #ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING; atomic_t pt_share_count; #endif; }; union { unsigned long _pt_pad_2; #if ALLOC_SPLIT_PTLOCKS; spinlock_t *ptl; #else; spinlock_t ptl; #endif; }; unsigned int __page_type; atomic_t __page_refcount; #ifdef CONFIG_MEMCG; unsigned long pt_memcg_data; #endif; }; **Members** ``pt_flags`` enum pt_flags plus zone/node/section. ``{unnamed_union}`` anonymous ``pt_rcu_head`` For freeing page table pages. ``pt_list`` List of used page tables. Used for s390 gmap shadow pages (which are not linked into the user page tables) and x86 pgds. ``{unnamed_struct}`` anonymous ``_pt_pad_1`` Padding that aliases with page's compound head. ``pmd_huge_pte`` Protected by ptdesc->ptl, used for THPs. ``__page_mapping`` Aliases with page->mapping. Unused for page tables. ``{unnamed_union}`` anonymous ``pt_index`` Used for s390 gmap. ``pt_mm`` Used for x86 pgds. ``pt_frag_refcount`` For fragmented page table tracking. Powerpc only. ``pt_share_count`` Used for HugeTLB PMD page table share count. ``{unnamed_union}`` anonymous ``_pt_pad_2`` Padding to ensure proper alignment. ``ptl`` Lock for the page table. ``ptl`` Lock for the page table. ``__page_type`` Same as page->page_type. Unused for page tables. ``__page_refcount`` Same as page refcount. ``pt_memcg_data`` Memcg data. Tracked for page tables here.h](jM)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh:}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM.hjWubj )}(hXstruct ptdesc { memdesc_flags_t pt_flags; union { struct rcu_head pt_rcu_head; struct list_head pt_list; struct { unsigned long _pt_pad_1; pgtable_t pmd_huge_pte; }; }; unsigned long __page_mapping; union { pgoff_t pt_index; struct mm_struct *pt_mm; atomic_t pt_frag_refcount; #ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING; atomic_t pt_share_count; #endif; }; union { unsigned long _pt_pad_2; #if ALLOC_SPLIT_PTLOCKS; spinlock_t *ptl; #else; spinlock_t ptl; #endif; }; unsigned int __page_type; atomic_t __page_refcount; #ifdef CONFIG_MEMCG; unsigned long pt_memcg_data; #endif; };h]hXstruct ptdesc { memdesc_flags_t pt_flags; union { struct rcu_head pt_rcu_head; struct list_head pt_list; struct { unsigned long _pt_pad_1; pgtable_t pmd_huge_pte; }; }; unsigned long __page_mapping; union { pgoff_t pt_index; struct mm_struct *pt_mm; atomic_t pt_frag_refcount; #ifdef CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING; atomic_t pt_share_count; #endif; }; union { unsigned long _pt_pad_2; #if ALLOC_SPLIT_PTLOCKS; spinlock_t *ptl; #else; spinlock_t ptl; #endif; }; unsigned int __page_type; atomic_t __page_refcount; #ifdef CONFIG_MEMCG; unsigned long pt_memcg_data; #endif; };}hjWsbah}(h]h ]h"]h$]h&]jjuh1j hY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM0hjWubjM)}(h **Members**h]j)}(hjWh]hMembers}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMRhjWubj)}(hhh](j)}(h3``pt_flags`` enum pt_flags plus zone/node/section. h](j)}(h ``pt_flags``h]jS)}(hjWh]hpt_flags}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjWubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM,hjWubj)}(hhh]jM)}(h%enum pt_flags plus zone/node/section.h]h%enum pt_flags plus zone/node/section.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjWhM,hjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjWhM,hjWubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]jS)}(hjXh]h{unnamed_union}}(hj!XhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhjXubj)}(hhh]jM)}(h anonymoush]h anonymous}(hj8XhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj4XhKhj5Xubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhj4XhKhjWubj)}(h.``pt_rcu_head`` For freeing page table pages. h](j)}(h``pt_rcu_head``h]jS)}(hjXXh]h pt_rcu_head}(hjZXhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjVXubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM-hjRXubj)}(hhh]jM)}(hFor freeing page table pages.h]hFor freeing page table pages.}(hjqXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjmXhM-hjnXubah}(h]h ]h"]h$]h&]uh1jhjRXubeh}(h]h ]h"]h$]h&]uh1jhjmXhM-hjWubj)}(h``pt_list`` List of used page tables. Used for s390 gmap shadow pages (which are not linked into the user page tables) and x86 pgds. h](j)}(h ``pt_list``h]jS)}(hjXh]hpt_list}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM0hjXubj)}(hhh]jM)}(hxList of used page tables. Used for s390 gmap shadow pages (which are not linked into the user page tables) and x86 pgds.h]hxList of used page tables. Used for s390 gmap shadow pages (which are not linked into the user page tables) and x86 pgds.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM.hjXubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjXhM0hjWubj)}(h``{unnamed_struct}`` anonymous h](j)}(h``{unnamed_struct}``h]jS)}(hjXh]h{unnamed_struct}}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhjXubj)}(hhh]jM)}(h anonymoush]h anonymous}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjXhKhjXubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjXhKhjWubj)}(h>``_pt_pad_1`` Padding that aliases with page's compound head. h](j)}(h ``_pt_pad_1``h]jS)}(hjYh]h _pt_pad_1}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjYubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM1hjXubj)}(hhh]jM)}(h/Padding that aliases with page's compound head.h]h1Padding that aliases with page’s compound head.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYhM1hjYubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjYhM1hjWubj)}(h:``pmd_huge_pte`` Protected by ptdesc->ptl, used for THPs. h](j)}(h``pmd_huge_pte``h]jS)}(hj=Yh]h pmd_huge_pte}(hj?YhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;Yubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM2hj7Yubj)}(hhh]jM)}(h(Protected by ptdesc->ptl, used for THPs.h]h(Protected by ptdesc->ptl, used for THPs.}(hjVYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjRYhM2hjSYubah}(h]h ]h"]h$]h&]uh1jhj7Yubeh}(h]h ]h"]h$]h&]uh1jhjRYhM2hjWubj)}(hG``__page_mapping`` Aliases with page->mapping. Unused for page tables. h](j)}(h``__page_mapping``h]jS)}(hjvYh]h__page_mapping}(hjxYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjtYubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM3hjpYubj)}(hhh]jM)}(h3Aliases with page->mapping. Unused for page tables.h]h3Aliases with page->mapping. Unused for page tables.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYhM3hjYubah}(h]h ]h"]h$]h&]uh1jhjpYubeh}(h]h ]h"]h$]h&]uh1jhjYhM3hjWubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]jS)}(hjYh]h{unnamed_union}}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjYubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhjYubj)}(hhh]jM)}(h anonymoush]h anonymous}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYhKhjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjYhKhjWubj)}(h!``pt_index`` Used for s390 gmap. h](j)}(h ``pt_index``h]jS)}(hjYh]hpt_index}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjYubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM4hjYubj)}(hhh]jM)}(hUsed for s390 gmap.h]hUsed for s390 gmap.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYhM4hjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjYhM4hjWubj)}(h``pt_mm`` Used for x86 pgds. h](j)}(h ``pt_mm``h]jS)}(hj!Zh]hpt_mm}(hj#ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM5hjZubj)}(hhh]jM)}(hUsed for x86 pgds.h]hUsed for x86 pgds.}(hj:ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6ZhM5hj7Zubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhj6ZhM5hjWubj)}(hG``pt_frag_refcount`` For fragmented page table tracking. Powerpc only. h](j)}(h``pt_frag_refcount``h]jS)}(hjZZh]hpt_frag_refcount}(hj\ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXZubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM6hjTZubj)}(hhh]jM)}(h1For fragmented page table tracking. Powerpc only.h]h1For fragmented page table tracking. Powerpc only.}(hjsZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjoZhM6hjpZubah}(h]h ]h"]h$]h&]uh1jhjTZubeh}(h]h ]h"]h$]h&]uh1jhjoZhM6hjWubj)}(h@``pt_share_count`` Used for HugeTLB PMD page table share count. h](j)}(h``pt_share_count``h]jS)}(hjZh]hpt_share_count}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM7hjZubj)}(hhh]jM)}(h,Used for HugeTLB PMD page table share count.h]h,Used for HugeTLB PMD page table share count.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhM7hjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhM7hjWubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]jS)}(hjZh]h{unnamed_union}}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhKhjZubj)}(hhh]jM)}(h anonymoush]h anonymous}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhKhjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhKhjWubj)}(h2``_pt_pad_2`` Padding to ensure proper alignment. h](j)}(h ``_pt_pad_2``h]jS)}(hj[h]h _pt_pad_2}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM8hjZubj)}(hhh]jM)}(h#Padding to ensure proper alignment.h]h#Padding to ensure proper alignment.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[hM8hj[ubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhj[hM8hjWubj)}(h!``ptl`` Lock for the page table. h](j)}(h``ptl``h]jS)}(hj>[h]hptl}(hj@[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<[ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM9hj8[ubj)}(hhh]jM)}(hLock for the page table.h]hLock for the page table.}(hjW[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjS[hM9hjT[ubah}(h]h ]h"]h$]h&]uh1jhj8[ubeh}(h]h ]h"]h$]h&]uh1jhjS[hM9hjWubj)}(h!``ptl`` Lock for the page table. h](j)}(h``ptl``h]jS)}(hjw[h]hptl}(hjy[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhju[ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM9hjq[ubj)}(hhh]jM)}(hLock for the page table.h]hLock for the page table.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[hM9hj[ubah}(h]h ]h"]h$]h&]uh1jhjq[ubeh}(h]h ]h"]h$]h&]uh1jhj[hM9hjWubj)}(hA``__page_type`` Same as page->page_type. Unused for page tables. h](j)}(h``__page_type``h]jS)}(hj[h]h __page_type}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM:hj[ubj)}(hhh]jM)}(h0Same as page->page_type. Unused for page tables.h]h0Same as page->page_type. Unused for page tables.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[hM:hj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hM:hjWubj)}(h+``__page_refcount`` Same as page refcount. h](j)}(h``__page_refcount``h]jS)}(hj[h]h__page_refcount}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM;hj[ubj)}(hhh]jM)}(hSame as page refcount.h]hSame as page refcount.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[hM;hj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhj[hM;hjWubj)}(h;``pt_memcg_data`` Memcg data. Tracked for page tables here.h](j)}(h``pt_memcg_data``h]jS)}(hj"\h]h pt_memcg_data}(hj$\hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj \ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM;hj\ubj)}(hhh]jM)}(h)Memcg data. Tracked for page tables here.h]h)Memcg data. Tracked for page tables here.}(hj;\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM<hj8\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj7\hM;hjWubeh}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj"MhNubjM)}(h**Description**h]j)}(hje\h]h Description}(hjg\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc\ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM?hjhhubjM)}(hcThis struct overlays struct page for now. Do not modify without a good understanding of the issues.h]hcThis struct overlays struct page for now. Do not modify without a good understanding of the issues.}(hj{\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM<hjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvm_fault_t (C type) c.vm_fault_thNtauh1hhjhhhj"MhNubh)}(hhh](h)}(h vm_fault_th]h)}(htype vm_fault_th](j5)}(hjUh]htype}(hj\hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj\hhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMBubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\hhhj\hMBubh)}(h vm_fault_th]j)}(hj\h]h vm_fault_t}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj\hhhj\hMBubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj\hhhj\hMBubah}(h]j\ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj\hMBhj\hhubj4)}(hhh]jM)}(h$Return type for page fault handlers.h]h$Return type for page fault handlers.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj\hhubah}(h]h ]h"]h$]h&]uh1j3hj\hhhj\hMBubeh}(h]h ](jAtypeeh"]h$]h&]jFjAjGj\jHj\jIjJjKuh1hhhhjhj"MhNubjM)}(h**Description**h]j)}(hj]h]h Description}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjhhubjM)}(hfault installed the pte, not return page ``VM_FAULT_LOCKED`` ->fault locked the returned page ``VM_FAULT_RETRY`` ->fault blocked, must retry ``VM_FAULT_FALLBACK`` huge page fault failed, fall back to small ``VM_FAULT_DONE_COW`` ->fault has fully handled COW ``VM_FAULT_NEEDDSYNC`` ->fault did not modify page tables and needs fsync() to complete (for synchronous page faults in DAX) ``VM_FAULT_COMPLETED`` ->fault completed, meanwhile mmap lock released ``VM_FAULT_HINDEX_MASK`` mask HINDEX valueh](jM)}(h **Constants**h]j)}(hj]h]h Constants}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj]ubj)}(hhh](j)}(h``VM_FAULT_OOM`` Out Of Memory h](j)}(h``VM_FAULT_OOM``h]jS)}(hj]h]h VM_FAULT_OOM}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj]ubj)}(hhh]jM)}(h Out Of Memoryh]h Out Of Memory}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj]hMhj]ubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhj]hMhj]ubj)}(h``VM_FAULT_SIGBUS`` Bad access h](j)}(h``VM_FAULT_SIGBUS``h]jS)}(hj^h]hVM_FAULT_SIGBUS}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ^ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj ^ubj)}(hhh]jM)}(h Bad accessh]h Bad access}(hj(^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj$^hMhj%^ubah}(h]h ]h"]h$]h&]uh1jhj ^ubeh}(h]h ]h"]h$]h&]uh1jhj$^hMhj]ubj)}(h*``VM_FAULT_MAJOR`` Page read from storage h](j)}(h``VM_FAULT_MAJOR``h]jS)}(hjH^h]hVM_FAULT_MAJOR}(hjJ^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjF^ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjB^ubj)}(hhh]jM)}(hPage read from storageh]hPage read from storage}(hja^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj]^hMhj^^ubah}(h]h ]h"]h$]h&]uh1jhjB^ubeh}(h]h ]h"]h$]h&]uh1jhj]^hMhj]ubj)}(h.``VM_FAULT_HWPOISON`` Hit poisoned small page h](j)}(h``VM_FAULT_HWPOISON``h]jS)}(hj^h]hVM_FAULT_HWPOISON}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj{^ubj)}(hhh]jM)}(hHit poisoned small pageh]hHit poisoned small page}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj^hMhj^ubah}(h]h ]h"]h$]h&]uh1jhj{^ubeh}(h]h ]h"]h$]h&]uh1jhj^hMhj]ubj)}(hQ``VM_FAULT_HWPOISON_LARGE`` Hit poisoned large page. Index encoded in upper bits h](j)}(h``VM_FAULT_HWPOISON_LARGE``h]jS)}(hj^h]hVM_FAULT_HWPOISON_LARGE}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj^ubj)}(hhh]jM)}(h4Hit poisoned large page. Index encoded in upper bitsh]h4Hit poisoned large page. Index encoded in upper bits}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj^ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj^hMhj]ubj)}(h(``VM_FAULT_SIGSEGV`` segmentation fault h](j)}(h``VM_FAULT_SIGSEGV``h]jS)}(hj^h]hVM_FAULT_SIGSEGV}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj^ubj)}(hhh]jM)}(hsegmentation faulth]hsegmentation fault}(hj _hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj _hMhj _ubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj _hMhj]ubj)}(h?``VM_FAULT_NOPAGE`` ->fault installed the pte, not return page h](j)}(h``VM_FAULT_NOPAGE``h]jS)}(hj-_h]hVM_FAULT_NOPAGE}(hj/_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj+_ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj'_ubj)}(hhh]jM)}(h*->fault installed the pte, not return pageh]h*->fault installed the pte, not return page}(hjF_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjB_hMhjC_ubah}(h]h ]h"]h$]h&]uh1jhj'_ubeh}(h]h ]h"]h$]h&]uh1jhjB_hMhj]ubj)}(h5``VM_FAULT_LOCKED`` ->fault locked the returned page h](j)}(h``VM_FAULT_LOCKED``h]jS)}(hjf_h]hVM_FAULT_LOCKED}(hjh_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjd_ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj`_ubj)}(hhh]jM)}(h ->fault locked the returned pageh]h ->fault locked the returned page}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj{_hMhj|_ubah}(h]h ]h"]h$]h&]uh1jhj`_ubeh}(h]h ]h"]h$]h&]uh1jhj{_hMhj]ubj)}(h/``VM_FAULT_RETRY`` ->fault blocked, must retry h](j)}(h``VM_FAULT_RETRY``h]jS)}(hj_h]hVM_FAULT_RETRY}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj_ubj)}(hhh]jM)}(h->fault blocked, must retryh]h->fault blocked, must retry}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hMhj]ubj)}(hA``VM_FAULT_FALLBACK`` huge page fault failed, fall back to small h](j)}(h``VM_FAULT_FALLBACK``h]jS)}(hj_h]hVM_FAULT_FALLBACK}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj_ubj)}(hhh]jM)}(h*huge page fault failed, fall back to smallh]h*huge page fault failed, fall back to small}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hMhj]ubj)}(h4``VM_FAULT_DONE_COW`` ->fault has fully handled COW h](j)}(h``VM_FAULT_DONE_COW``h]jS)}(hj`h]hVM_FAULT_DONE_COW}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj `ubj)}(hhh]jM)}(h->fault has fully handled COWh]h->fault has fully handled COW}(hj*`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj&`hMhj'`ubah}(h]h ]h"]h$]h&]uh1jhj `ubeh}(h]h ]h"]h$]h&]uh1jhj&`hMhj]ubj)}(h}``VM_FAULT_NEEDDSYNC`` ->fault did not modify page tables and needs fsync() to complete (for synchronous page faults in DAX) h](j)}(h``VM_FAULT_NEEDDSYNC``h]jS)}(hjJ`h]hVM_FAULT_NEEDDSYNC}(hjL`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjH`ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjD`ubj)}(hhh]jM)}(he->fault did not modify page tables and needs fsync() to complete (for synchronous page faults in DAX)h]he->fault did not modify page tables and needs fsync() to complete (for synchronous page faults in DAX)}(hjc`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj``ubah}(h]h ]h"]h$]h&]uh1jhjD`ubeh}(h]h ]h"]h$]h&]uh1jhj_`hMhj]ubj)}(hG``VM_FAULT_COMPLETED`` ->fault completed, meanwhile mmap lock released h](j)}(h``VM_FAULT_COMPLETED``h]jS)}(hj`h]hVM_FAULT_COMPLETED}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj~`ubj)}(hhh]jM)}(h/->fault completed, meanwhile mmap lock releasedh]h/->fault completed, meanwhile mmap lock released}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`hMhj`ubah}(h]h ]h"]h$]h&]uh1jhj~`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj]ubj)}(h*``VM_FAULT_HINDEX_MASK`` mask HINDEX valueh](j)}(h``VM_FAULT_HINDEX_MASK``h]jS)}(hj`h]hVM_FAULT_HINDEX_MASK}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj`ubj)}(hhh]jM)}(hmask HINDEX valueh]hmask HINDEX value}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj]ubeh}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj"MhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfault_flag (C enum) c.fault_flaghNtauh1hhjhhhj"MhNubh)}(hhh](h)}(h fault_flagh]h)}(henum fault_flagh](j5)}(hjh]henum}(hjahhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjahhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMubj)}(h h]h }(hj%ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhj$ahMubh)}(h fault_flagh]j)}(hjah]h fault_flag}(hj7ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3aubah}(h]h ](jjeh"]h$]h&]jjuh1hhjahhhj$ahMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjahhhj$ahMubah}(h]j aah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj$ahMhj ahhubj4)}(hhh]jM)}(hFault flag definitions.h]hFault flag definitions.}(hjYahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjVahhubah}(h]h ]h"]h$]h&]uh1j3hj ahhhj$ahMubeh}(h]h ](jAenumeh"]h$]h&]jFjAjGjqajHjqajIjJjKuh1hhhhjhj"MhNubj)}(hX**Constants** ``FAULT_FLAG_WRITE`` Fault was a write fault. ``FAULT_FLAG_MKWRITE`` Fault was mkwrite of existing PTE. ``FAULT_FLAG_ALLOW_RETRY`` Allow to retry the fault if blocked. ``FAULT_FLAG_RETRY_NOWAIT`` Don't drop mmap_lock and wait when retrying. ``FAULT_FLAG_KILLABLE`` The fault task is in SIGKILL killable region. ``FAULT_FLAG_TRIED`` The fault has been tried once. ``FAULT_FLAG_USER`` The fault originated in userspace. ``FAULT_FLAG_REMOTE`` The fault is not for current task/mm. ``FAULT_FLAG_INSTRUCTION`` The fault was during an instruction fetch. ``FAULT_FLAG_INTERRUPTIBLE`` The fault can be interrupted by non-fatal signals. ``FAULT_FLAG_UNSHARE`` The fault is an unsharing request to break COW in a COW mapping, making sure that an exclusive anon page is mapped after the fault. ``FAULT_FLAG_ORIG_PTE_VALID`` whether the fault has vmf->orig_pte cached. We should only access orig_pte if this flag set. ``FAULT_FLAG_VMA_LOCK`` The fault is handled under VMA lock.h](jM)}(h **Constants**h]j)}(hj{ah]h Constants}(hj}ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyaubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjuaubj)}(hhh](j)}(h.``FAULT_FLAG_WRITE`` Fault was a write fault. h](j)}(h``FAULT_FLAG_WRITE``h]jS)}(hjah]hFAULT_FLAG_WRITE}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjaubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjaubj)}(hhh]jM)}(hFault was a write fault.h]hFault was a write fault.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjahMhjaubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjahMhjaubj)}(h:``FAULT_FLAG_MKWRITE`` Fault was mkwrite of existing PTE. h](j)}(h``FAULT_FLAG_MKWRITE``h]jS)}(hjah]hFAULT_FLAG_MKWRITE}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjaubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjaubj)}(hhh]jM)}(h"Fault was mkwrite of existing PTE.h]h"Fault was mkwrite of existing PTE.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjahMhjaubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjahMhjaubj)}(h@``FAULT_FLAG_ALLOW_RETRY`` Allow to retry the fault if blocked. h](j)}(h``FAULT_FLAG_ALLOW_RETRY``h]jS)}(hj bh]hFAULT_FLAG_ALLOW_RETRY}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj bubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjbubj)}(hhh]jM)}(h$Allow to retry the fault if blocked.h]h$Allow to retry the fault if blocked.}(hj%bhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!bhMhj"bubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj!bhMhjaubj)}(hI``FAULT_FLAG_RETRY_NOWAIT`` Don't drop mmap_lock and wait when retrying. h](j)}(h``FAULT_FLAG_RETRY_NOWAIT``h]jS)}(hjEbh]hFAULT_FLAG_RETRY_NOWAIT}(hjGbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCbubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj?bubj)}(hhh]jM)}(h,Don't drop mmap_lock and wait when retrying.h]h.Don’t drop mmap_lock and wait when retrying.}(hj^bhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZbhMhj[bubah}(h]h ]h"]h$]h&]uh1jhj?bubeh}(h]h ]h"]h$]h&]uh1jhjZbhMhjaubj)}(hF``FAULT_FLAG_KILLABLE`` The fault task is in SIGKILL killable region. h](j)}(h``FAULT_FLAG_KILLABLE``h]jS)}(hj~bh]hFAULT_FLAG_KILLABLE}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj|bubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjxbubj)}(hhh]jM)}(h-The fault task is in SIGKILL killable region.h]h-The fault task is in SIGKILL killable region.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjbhMhjbubah}(h]h ]h"]h$]h&]uh1jhjxbubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjaubj)}(h4``FAULT_FLAG_TRIED`` The fault has been tried once. h](j)}(h``FAULT_FLAG_TRIED``h]jS)}(hjbh]hFAULT_FLAG_TRIED}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjbubj)}(hhh]jM)}(hThe fault has been tried once.h]hThe fault has been tried once.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjbhMhjbubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjaubj)}(h7``FAULT_FLAG_USER`` The fault originated in userspace. h](j)}(h``FAULT_FLAG_USER``h]jS)}(hjbh]hFAULT_FLAG_USER}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjbubj)}(hhh]jM)}(h"The fault originated in userspace.h]h"The fault originated in userspace.}(hj chhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjchMhjcubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhjchMhjaubj)}(h<``FAULT_FLAG_REMOTE`` The fault is not for current task/mm. h](j)}(h``FAULT_FLAG_REMOTE``h]jS)}(hj)ch]hFAULT_FLAG_REMOTE}(hj+chhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj'cubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj#cubj)}(hhh]jM)}(h%The fault is not for current task/mm.h]h%The fault is not for current task/mm.}(hjBchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>chMhj?cubah}(h]h ]h"]h$]h&]uh1jhj#cubeh}(h]h ]h"]h$]h&]uh1jhj>chMhjaubj)}(hF``FAULT_FLAG_INSTRUCTION`` The fault was during an instruction fetch. h](j)}(h``FAULT_FLAG_INSTRUCTION``h]jS)}(hjbch]hFAULT_FLAG_INSTRUCTION}(hjdchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`cubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM hj\cubj)}(hhh]jM)}(h*The fault was during an instruction fetch.h]h*The fault was during an instruction fetch.}(hj{chhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjwchM hjxcubah}(h]h ]h"]h$]h&]uh1jhj\cubeh}(h]h ]h"]h$]h&]uh1jhjwchM hjaubj)}(hP``FAULT_FLAG_INTERRUPTIBLE`` The fault can be interrupted by non-fatal signals. h](j)}(h``FAULT_FLAG_INTERRUPTIBLE``h]jS)}(hjch]hFAULT_FLAG_INTERRUPTIBLE}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjcubj)}(hhh]jM)}(h2The fault can be interrupted by non-fatal signals.h]h2The fault can be interrupted by non-fatal signals.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjchMhjcubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjchMhjaubj)}(h``FAULT_FLAG_UNSHARE`` The fault is an unsharing request to break COW in a COW mapping, making sure that an exclusive anon page is mapped after the fault. h](j)}(h``FAULT_FLAG_UNSHARE``h]jS)}(hjch]hFAULT_FLAG_UNSHARE}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjcubj)}(hhh]jM)}(hThe fault is an unsharing request to break COW in a COW mapping, making sure that an exclusive anon page is mapped after the fault.h]hThe fault is an unsharing request to break COW in a COW mapping, making sure that an exclusive anon page is mapped after the fault.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjcubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhjchMhjaubj)}(h{``FAULT_FLAG_ORIG_PTE_VALID`` whether the fault has vmf->orig_pte cached. We should only access orig_pte if this flag set. h](j)}(h``FAULT_FLAG_ORIG_PTE_VALID``h]jS)}(hjdh]hFAULT_FLAG_ORIG_PTE_VALID}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj dubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjdubj)}(hhh]jM)}(h\whether the fault has vmf->orig_pte cached. We should only access orig_pte if this flag set.h]h\whether the fault has vmf->orig_pte cached. We should only access orig_pte if this flag set.}(hj'dhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj$dubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhj#dhMhjaubj)}(h<``FAULT_FLAG_VMA_LOCK`` The fault is handled under VMA lock.h](j)}(h``FAULT_FLAG_VMA_LOCK``h]jS)}(hjHdh]hFAULT_FLAG_VMA_LOCK}(hjJdhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFdubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjBdubj)}(hhh]jM)}(h$The fault is handled under VMA lock.h]h$The fault is handled under VMA lock.}(hjadhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj^dubah}(h]h ]h"]h$]h&]uh1jhjBdubeh}(h]h ]h"]h$]h&]uh1jhj]dhMhjaubeh}(h]h ]h"]h$]h&]uh1jhjuaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhj"MhNubjM)}(h**Description**h]j)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjhhubjM)}(hAbout **FAULT_FLAG_ALLOW_RETRY** and **FAULT_FLAG_TRIED**: we can specify whether we would allow page faults to retry by specifying these two fault flags correctly. Currently there can be three legal combinations:h](hAbout }(hjdhhhNhNubj)}(h**FAULT_FLAG_ALLOW_RETRY**h]hFAULT_FLAG_ALLOW_RETRY}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh and }(hjdhhhNhNubj)}(h**FAULT_FLAG_TRIED**h]hFAULT_FLAG_TRIED}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh: we can specify whether we would allow page faults to retry by specifying these two fault flags correctly. Currently there can be three legal combinations:}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjhhubj/)}(hhh](j/)}(htALLOW_RETRY and !TRIED: this means the page fault allows retry, and this is the first try h]j)}(hhh]j)}(h[ALLOW_RETRY and !TRIED: this means the page fault allows retry, and this is the first try h](j)}(hDALLOW_RETRY and !TRIED: this means the page fault allows retry, andh]hDALLOW_RETRY and !TRIED: this means the page fault allows retry, and}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjdubj)}(hhh]jM)}(hthis is the first tryh]hthis is the first try}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdhMhjdubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjdhMhjdubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1j/hjdubj/)}(hALLOW_RETRY and TRIED: this means the page fault allows retry, and we've already tried at least once h]j)}(hhh]j)}(hgALLOW_RETRY and TRIED: this means the page fault allows retry, and we've already tried at least once h](j)}(hDALLOW_RETRY and TRIED: this means the page fault allows retry, andh]hDALLOW_RETRY and TRIED: this means the page fault allows retry, and}(hj%ehhhNhNubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj!eubj)}(hhh]jM)}(h!we've already tried at least onceh]h#we’ve already tried at least once}(hj7ehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3ehMhj4eubah}(h]h ]h"]h$]h&]uh1jhj!eubeh}(h]h ]h"]h$]h&]uh1jhj3ehMhjeubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1j/hjdubj/)}(hH!ALLOW_RETRY and !TRIED: this means the page fault does not allow retry h]jM)}(hG!ALLOW_RETRY and !TRIED: this means the page fault does not allow retryh]hG!ALLOW_RETRY and !TRIED: this means the page fault does not allow retry}(hjaehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhj]eubah}(h]h ]h"]h$]h&]uh1j/hjdubeh}(h]h ]h"]h$]h&]j>0 loweralphaj@0j!jA0j!uh1j/hjhhhj"MhNubjM)}(hXThe unlisted combination (!ALLOW_RETRY && TRIED) is illegal and should never be used. Note that page faults can be allowed to retry for multiple times, in which case we'll have an initial fault with flags (a) then later on continuous faults with flags (b). We should always try to detect pending signals before a retry to make sure the continuous page faults can still be interrupted if necessary.h]hXThe unlisted combination (!ALLOW_RETRY && TRIED) is illegal and should never be used. Note that page faults can be allowed to retry for multiple times, in which case we’ll have an initial fault with flags (a) then later on continuous faults with flags (b). We should always try to detect pending signals before a retry to make sure the continuous page faults can still be interrupted if necessary.}(hj}ehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhM hjhhubjM)}(hThe combination FAULT_FLAG_WRITE|FAULT_FLAG_UNSHARE is illegal. FAULT_FLAG_UNSHARE is ignored and treated like an ordinary read fault when applied to mappings that are not COW mappings.h]hThe combination FAULT_FLAG_WRITE|FAULT_FLAG_UNSHARE is illegal. FAULT_FLAG_UNSHARE is ignored and treated like an ordinary read fault when applied to mappings that are not COW mappings.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:103: ./include/linux/mm_types.hhMhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_is_file_lru (C function)c.folio_is_file_lruhNtauh1hhjhhhNhNubh)}(hhh](h)}(h1int folio_is_file_lru (const struct folio *folio)h]h)}(h0int folio_is_file_lru(const struct folio *folio)h](j)}(hinth]hint}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjehhhjehKubh)}(hfolio_is_file_lruh]j)}(hfolio_is_file_lruh]hfolio_is_file_lru}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1hhjehhhjehKubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjehhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjeubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj5)}(hj8h]hstruct}(hj fhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjeubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubh)}(hhh]j)}(hfolioh]hfolio}(hj*fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'fubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj,fmodnameN classnameNjpjs)}jv]jy)}jljesbc.folio_is_file_lruasbuh1hhjeubj)}(h h]h }(hjJfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubjF )}(hjI h]h*}(hjXfhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjeubj)}(hfolioh]hfolio}(hjefhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubah}(h]h ]h"]h$]h&]jjuh1j hjehhhjehKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjehhhjehKubah}(h]jeah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjehKhjehhubj4)}(hhh]jM)}(h.Should the folio be on a file LRU or anon LRU?h]h.Should the folio be on a file LRU or anon LRU?}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfhhubah}(h]h ]h"]h$]h&]uh1j3hjehhhjehKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjfjHjfjIjJjKuh1hhhhjhNhNubj)}(hXX**Parameters** ``const struct folio *folio`` The folio to test. **Description** We would like to get this info without a page flag, but the state needs to survive until the folio is last deleted from the LRU, which could be as far down as __page_cache_release. **Return** An integer (not a boolean!) used to sort a folio onto the right LRU list and to account folios correctly. 1 if **folio** is a regular filesystem backed page cache folio or a lazily freed anonymous folio (e.g. via MADV_FREE). 0 if **folio** is a normal anonymous folio, a tmpfs folio or otherwise ram or swap backed folio.h](jM)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfubj)}(hhh]j)}(h1``const struct folio *folio`` The folio to test. h](j)}(h``const struct folio *folio``h]jS)}(hjfh]hconst struct folio *folio}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjfubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfubj)}(hhh]jM)}(hThe folio to test.h]hThe folio to test.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjfhKhjfubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjfhKhjfubah}(h]h ]h"]h$]h&]uh1jhjfubjM)}(h**Description**h]j)}(hj gh]h Description}(hj ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj gubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfubjM)}(hWe would like to get this info without a page flag, but the state needs to survive until the folio is last deleted from the LRU, which could be as far down as __page_cache_release.h]hWe would like to get this info without a page flag, but the state needs to survive until the folio is last deleted from the LRU, which could be as far down as __page_cache_release.}(hj!ghhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfubjM)}(h **Return**h]j)}(hj2gh]hReturn}(hj4ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0gubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfubjM)}(hXAAn integer (not a boolean!) used to sort a folio onto the right LRU list and to account folios correctly. 1 if **folio** is a regular filesystem backed page cache folio or a lazily freed anonymous folio (e.g. via MADV_FREE). 0 if **folio** is a normal anonymous folio, a tmpfs folio or otherwise ram or swap backed folio.h](hoAn integer (not a boolean!) used to sort a folio onto the right LRU list and to account folios correctly. 1 if }(hjHghhhNhNubj)}(h **folio**h]hfolio}(hjPghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHgubhn is a regular filesystem backed page cache folio or a lazily freed anonymous folio (e.g. via MADV_FREE). 0 if }(hjHghhhNhNubj)}(h **folio**h]hfolio}(hjbghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHgubhR is a normal anonymous folio, a tmpfs folio or otherwise ram or swap backed folio.}(hjHghhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$__folio_clear_lru_flags (C function)c.__folio_clear_lru_flagshNtauh1hhjhhhNhNubh)}(hhh](h)}(h2void __folio_clear_lru_flags (struct folio *folio)h]h)}(h1void __folio_clear_lru_flags(struct folio *folio)h](j)}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhK:ubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhjghK:ubh)}(h__folio_clear_lru_flagsh]j)}(h__folio_clear_lru_flagsh]h__folio_clear_lru_flags}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1hhjghhhjghK:ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjghhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjgubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubh)}(hhh]j)}(hfolioh]hfolio}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjgmodnameN classnameNjpjs)}jv]jy)}jljgsbc.__folio_clear_lru_flagsasbuh1hhjgubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubjF )}(hjI h]h*}(hj$hhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjgubj)}(hfolioh]hfolio}(hj1hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjgubah}(h]h ]h"]h$]h&]jjuh1j hjghhhjghK:ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjghhhjghK:ubah}(h]jgah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjghK:hjghhubj4)}(hhh]jM)}(h-Clear page lru flags before releasing a page.h]h-Clear page lru flags before releasing a page.}(hj[hhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhK:hjXhhhubah}(h]h ]h"]h$]h&]uh1j3hjghhhjghK:ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjshjHjshjIjJjKuh1hhhhjhNhNubj)}(ha**Parameters** ``struct folio *folio`` The folio that was on lru and now has a zero reference.h](jM)}(h**Parameters**h]j)}(hj}hh]h Parameters}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{hubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhK>hjwhubj)}(hhh]j)}(hO``struct folio *folio`` The folio that was on lru and now has a zero reference.h](j)}(h``struct folio *folio``h]jS)}(hjhh]hstruct folio *folio}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhK@hjhubj)}(hhh]jM)}(h7The folio that was on lru and now has a zero reference.h]h7The folio that was on lru and now has a zero reference.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhK;hjhubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhhK@hjhubah}(h]h ]h"]h$]h&]uh1jhjwhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_lru_list (C function)c.folio_lru_listhNtauh1hhjhhhNhNubh)}(hhh](h)}(h8enum lru_list folio_lru_list (const struct folio *folio)h]h)}(h7enum lru_list folio_lru_list(const struct folio *folio)h](j5)}(hjh]henum}(hjhhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKLubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjihKLubh)}(hhh]j)}(hlru_listh]hlru_list}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjimodnameN classnameNjpjs)}jv]jy)}jlfolio_lru_listsbc.folio_lru_listasbuh1hhjhhhhjihKLubj)}(h h]h }(hj6ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjihKLubh)}(hfolio_lru_listh]j)}(hj3ih]hfolio_lru_list}(hjHihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDiubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhhjihKLubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjcihhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj_iubj)}(h h]h }(hjpihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_iubj5)}(hj8h]hstruct}(hj~ihhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj_iubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_iubh)}(hhh]j)}(hfolioh]hfolio}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjimodnameN classnameNjpjs)}jv]j1ic.folio_lru_listasbuh1hhj_iubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_iubjF )}(hjI h]h*}(hjihhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj_iubj)}(hfolioh]hfolio}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_iubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj[iubah}(h]h ]h"]h$]h&]jjuh1j hjhhhhjihKLubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhhjihKLubah}(h]jhah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjihKLhjhhhubj4)}(hhh]jM)}(h$Which LRU list should a folio be on?h]h$Which LRU list should a folio be on?}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKLhjihhubah}(h]h ]h"]h$]h&]uh1j3hjhhhhjihKLubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjjHjjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct folio *folio`` The folio to test. **Return** The LRU list a folio should be on, as an index into the array of LRU lists.h](jM)}(h**Parameters**h]j)}(hj!jh]h Parameters}(hj#jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKPhjjubj)}(hhh]j)}(h1``const struct folio *folio`` The folio to test. h](j)}(h``const struct folio *folio``h]jS)}(hj@jh]hconst struct folio *folio}(hjBjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>jubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKMhj:jubj)}(hhh]jM)}(hThe folio to test.h]hThe folio to test.}(hjYjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjUjhKMhjVjubah}(h]h ]h"]h$]h&]uh1jhj:jubeh}(h]h ]h"]h$]h&]uh1jhjUjhKMhj7jubah}(h]h ]h"]h$]h&]uh1jhjjubjM)}(h **Return**h]j)}(hj{jh]hReturn}(hj}jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyjubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKOhjjubjM)}(hKThe LRU list a folio should be on, as an index into the array of LRU lists.h]hKThe LRU list a folio should be on, as an index into the array of LRU lists.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhKOhjjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!num_pages_contiguous (C function)c.num_pages_contiguoushNtauh1hhjhhhNhNubh)}(hhh](h)}(hBsize_t num_pages_contiguous (struct page **pages, size_t nr_pages)h]h)}(hAsize_t num_pages_contiguous(struct page **pages, size_t nr_pages)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]jy)}jlnum_pages_contiguoussbc.num_pages_contiguousasbuh1hhjjhhhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMFubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjhhhjjhMFubh)}(hnum_pages_contiguoush]j)}(hjjh]hnum_pages_contiguous}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjjhhhjjhMFubj )}(h&(struct page **pages, size_t nr_pages)h](j )}(hstruct page **pagesh](j5)}(hj8h]hstruct}(hjkhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjkubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubh)}(hhh]j)}(hpageh]hpage}(hj0khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-kubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj2kmodnameN classnameNjpjs)}jv]jjc.num_pages_contiguousasbuh1hhjkubj)}(h h]h }(hjNkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubjF )}(hjI h]h*}(hj\khhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjkubjF )}(hjI h]h*}(hjikhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjkubj)}(hpagesh]hpages}(hjvkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj kubj )}(hsize_t nr_pagesh](h)}(hhh]j)}(hsize_th]hsize_t}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjkmodnameN classnameNjpjs)}jv]jjc.num_pages_contiguousasbuh1hhjkubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hnr_pagesh]hnr_pages}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj kubeh}(h]h ]h"]h$]h&]jjuh1j hjjhhhjjhMFubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjjhhhjjhMFubah}(h]jjah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjjhMFhjjhhubj4)}(hhh]jM)}(hGdetermine the number of contiguous pages that represent contiguous PFNsh]hGdetermine the number of contiguous pages that represent contiguous PFNs}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMFhjkhhubah}(h]h ]h"]h$]h&]uh1j3hjjhhhjjhMFubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjljHjljIjJjKuh1hhhhjhNhNubj)}(hX6**Parameters** ``struct page **pages`` an array of page pointers ``size_t nr_pages`` length of the array, at least 1 **Description** Determine the number of contiguous pages that represent contiguous PFNs in **pages**, starting from the first page. In some kernel configs contiguous PFNs will not have contiguous struct pages. In these configurations num_pages_contiguous() will return a num smaller than ideal number. The caller should continue to check for pfn contiguity after each call to num_pages_contiguous(). Returns the number of contiguous pages.h](jM)}(h**Parameters**h]j)}(hj lh]h Parameters}(hj lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMJhjlubj)}(hhh](j)}(h2``struct page **pages`` an array of page pointers h](j)}(h``struct page **pages``h]jS)}(hj)lh]hstruct page **pages}(hj+lhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj'lubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMHhj#lubj)}(hhh]jM)}(han array of page pointersh]han array of page pointers}(hjBlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>lhMHhj?lubah}(h]h ]h"]h$]h&]uh1jhj#lubeh}(h]h ]h"]h$]h&]uh1jhj>lhMHhj lubj)}(h4``size_t nr_pages`` length of the array, at least 1 h](j)}(h``size_t nr_pages``h]jS)}(hjblh]hsize_t nr_pages}(hjdlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`lubah}(h]h ]h"]h$]h&]uh1jhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMIhj\lubj)}(hhh]jM)}(hlength of the array, at least 1h]hlength of the array, at least 1}(hj{lhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjwlhMIhjxlubah}(h]h ]h"]h$]h&]uh1jhj\lubeh}(h]h ]h"]h$]h&]uh1jhjwlhMIhj lubeh}(h]h ]h"]h$]h&]uh1jhjlubjM)}(h**Description**h]j)}(hjlh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMKhjlubjM)}(hsDetermine the number of contiguous pages that represent contiguous PFNs in **pages**, starting from the first page.h](hKDetermine the number of contiguous pages that represent contiguous PFNs in }(hjlhhhNhNubj)}(h **pages**h]hpages}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubh, starting from the first page.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMJhjlubjM)}(hX In some kernel configs contiguous PFNs will not have contiguous struct pages. In these configurations num_pages_contiguous() will return a num smaller than ideal number. The caller should continue to check for pfn contiguity after each call to num_pages_contiguous().h]hX In some kernel configs contiguous PFNs will not have contiguous struct pages. In these configurations num_pages_contiguous() will return a num smaller than ideal number. The caller should continue to check for pfn contiguity after each call to num_pages_contiguous().}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMMhjlubjM)}(h'Returns the number of contiguous pages.h]h'Returns the number of contiguous pages.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhZ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:105: ./include/linux/mm_inline.hhMRhjlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpage_folio (C macro) c.page_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(h page_folioh]h)}(h page_folioh]h)}(h page_folioh]j)}(hj mh]h page_folio}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]jjuh1hhjmhhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM ubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj mhhhj)mhM ubah}(h]jmah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj)mhM hjmhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjmhhhj)mhM ubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjBmjHjBmjIjJjKuh1hhhhjhNhNubjM)}(h``page_folio (p)``h]jS)}(hjHmh]hpage_folio (p)}(hjJmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFmubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM"hjhhubji)}(hConverts from page to folio. h]jM)}(hConverts from page to folio.h]hConverts from page to folio.}(hjbmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM hj^mubah}(h]h ]h"]h$]h&]uh1jhhjpmhM hjhhubj)}(hX**Parameters** ``p`` The page. **Description** Every page is part of a folio. This function cannot be called on a NULL pointer. **Context** No reference, nor lock is required on **page**. If the caller does not hold a reference, this call may race with a folio split, so it should re-check the folio still contains this page after gaining a reference on the folio. **Return** The folio which contains this page.h](jM)}(h**Parameters**h]j)}(hj}mh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{mubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM$hjwmubj)}(hhh]j)}(h``p`` The page. h](j)}(h``p``h]jS)}(hjmh]hp}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjmubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM!hjmubj)}(hhh]jM)}(h The page.h]h The page.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjmhM!hjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjmhM!hjmubah}(h]h ]h"]h$]h&]uh1jhjwmubjM)}(h**Description**h]j)}(hjmh]h Description}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM#hjwmubjM)}(hQEvery page is part of a folio. This function cannot be called on a NULL pointer.h]hQEvery page is part of a folio. This function cannot be called on a NULL pointer.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM"hjwmubjM)}(h **Context**h]j)}(hjmh]hContext}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM%hjwmubjM)}(hNo reference, nor lock is required on **page**. If the caller does not hold a reference, this call may race with a folio split, so it should re-check the folio still contains this page after gaining a reference on the folio.h](h&No reference, nor lock is required on }(hjnhhhNhNubj)}(h**page**h]hpage}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh. If the caller does not hold a reference, this call may race with a folio split, so it should re-check the folio still contains this page after gaining a reference on the folio.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM&hjwmubjM)}(h **Return**h]j)}(hj7nh]hReturn}(hj9nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5nubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM+hjwmubjM)}(h#The folio which contains this page.h]h#The folio which contains this page.}(hjMnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM*hjwmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_page (C macro) c.folio_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(h folio_pageh]h)}(h folio_pageh]h)}(h folio_pageh]j)}(hjvnh]h folio_page}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|nubah}(h]h ](jjeh"]h$]h&]jjuh1hhjxnhhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM1ubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjtnhhhjnhM1ubah}(h]jonah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjnhM1hjqnhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjqnhhhjnhM1ubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjnjHjnjIjJjKuh1hhhhjhNhNubjM)}(h``folio_page (folio, n)``h]jS)}(hjnh]hfolio_page (folio, n)}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM3hjhhubji)}(hReturn a page from a folio. h]jM)}(hReturn a page from a folio.h]hReturn a page from a folio.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM1hjnubah}(h]h ]h"]h$]h&]uh1jhhjnhM1hjhhubj)}(hX **Parameters** ``folio`` The folio. ``n`` The page number to return. **Description** **n** is relative to the start of the folio. This function does not check that the page number lies within **folio**; the caller is presumed to have a reference to the page.h](jM)}(h**Parameters**h]j)}(hjnh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM5hjnubj)}(hhh](j)}(h``folio`` The folio. h](j)}(h ``folio``h]jS)}(hjoh]hfolio}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM2hjoubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjohM2hjoubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjohM2hjnubj)}(h!``n`` The page number to return. h](j)}(h``n``h]jS)}(hj?oh]hn}(hjAohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj=oubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM3hj9oubj)}(hhh]jM)}(hThe page number to return.h]hThe page number to return.}(hjXohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjTohM3hjUoubah}(h]h ]h"]h$]h&]uh1jhj9oubeh}(h]h ]h"]h$]h&]uh1jhjTohM3hjnubeh}(h]h ]h"]h$]h&]uh1jhjnubjM)}(h**Description**h]j)}(hjzoh]h Description}(hj|ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxoubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM5hjnubjM)}(h**n** is relative to the start of the folio. This function does not check that the page number lies within **folio**; the caller is presumed to have a reference to the page.h](j)}(h**n**h]hn}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubhg is relative to the start of the folio. This function does not check that the page number lies within }(hjohhhNhNubj)}(h **folio**h]hfolio}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh9; the caller is presumed to have a reference to the page.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM4hjnubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(folio_xor_flags_has_waiters (C function)c.folio_xor_flags_has_waitershNtauh1hhjhhhNhNubh)}(hhh](h)}(hJbool folio_xor_flags_has_waiters (struct folio *folio, unsigned long mask)h]h)}(hIbool folio_xor_flags_has_waiters(struct folio *folio, unsigned long mask)h](j)}(hj-h]hbool}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjohMubh)}(hfolio_xor_flags_has_waitersh]j)}(hfolio_xor_flags_has_waitersh]hfolio_xor_flags_has_waiters}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ](jjeh"]h$]h&]jjuh1hhjohhhjohMubj )}(h)(struct folio *folio, unsigned long mask)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjphhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjpubj)}(h h]h }(hj(phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubh)}(hhh]j)}(hfolioh]hfolio}(hj9phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6pubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj;pmodnameN classnameNjpjs)}jv]jy)}jljpsbc.folio_xor_flags_has_waitersasbuh1hhjpubj)}(h h]h }(hjYphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubjF )}(hjI h]h*}(hjgphhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjpubj)}(hfolioh]hfolio}(hjtphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubj )}(hunsigned long maskh](j)}(hunsignedh]hunsigned}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hlongh]hlong}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubj)}(hmaskh]hmask}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubeh}(h]h ]h"]h$]h&]jjuh1j hjohhhjohMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjohhhjohMubah}(h]joah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjohMhjohhubj4)}(hhh]jM)}(hChange some folio flags.h]hChange some folio flags.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhjphhubah}(h]h ]h"]h$]h&]uh1j3hjohhhjohMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjqjHjqjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio. ``unsigned long mask`` Bits set in this word will be changed. **Description** This must only be used for flags which are changed with the folio lock held. For example, it is unsafe to use for PG_dirty as that can be set without the folio lock held. It can also only be used on flags which are in the range 0-6 as some of the implementations only affect those bits. **Return** Whether there are tasks waiting on the folio.h](jM)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj qubj)}(hhh](j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hj0qh]hstruct folio *folio}(hj2qhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.qubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj*qubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjIqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjEqhMhjFqubah}(h]h ]h"]h$]h&]uh1jhj*qubeh}(h]h ]h"]h$]h&]uh1jhjEqhMhj'qubj)}(h>``unsigned long mask`` Bits set in this word will be changed. h](j)}(h``unsigned long mask``h]jS)}(hjiqh]hunsigned long mask}(hjkqhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgqubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhjcqubj)}(hhh]jM)}(h&Bits set in this word will be changed.h]h&Bits set in this word will be changed.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~qhMhjqubah}(h]h ]h"]h$]h&]uh1jhjcqubeh}(h]h ]h"]h$]h&]uh1jhj~qhMhj'qubeh}(h]h ]h"]h$]h&]uh1jhj qubjM)}(h**Description**h]j)}(hjqh]h Description}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj qubjM)}(hX This must only be used for flags which are changed with the folio lock held. For example, it is unsafe to use for PG_dirty as that can be set without the folio lock held. It can also only be used on flags which are in the range 0-6 as some of the implementations only affect those bits.h]hX This must only be used for flags which are changed with the folio lock held. For example, it is unsafe to use for PG_dirty as that can be set without the folio lock held. It can also only be used on flags which are in the range 0-6 as some of the implementations only affect those bits.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj qubjM)}(h **Return**h]j)}(hjqh]hReturn}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj qubjM)}(h-Whether there are tasks waiting on the folio.h]h-Whether there are tasks waiting on the folio.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj qubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h folio_test_uptodate (C function)c.folio_test_uptodatehNtauh1hhjhhhNhNubh)}(hhh](h)}(h4bool folio_test_uptodate (const struct folio *folio)h]h)}(h3bool folio_test_uptodate(const struct folio *folio)h](j)}(hj-h]hbool}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj rhhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj rhhhjrhMubh)}(hfolio_test_uptodateh]j)}(hfolio_test_uptodateh]hfolio_test_uptodate}(hj0rhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,rubah}(h]h ](jjeh"]h$]h&]jjuh1hhj rhhhjrhMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjLrhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjHrubj)}(h h]h }(hjYrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHrubj5)}(hj8h]hstruct}(hjgrhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjHrubj)}(h h]h }(hjtrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHrubh)}(hhh]j)}(hfolioh]hfolio}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjrmodnameN classnameNjpjs)}jv]jy)}jlj2rsbc.folio_test_uptodateasbuh1hhjHrubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHrubjF )}(hjI h]h*}(hjrhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjHrubj)}(hfolioh]hfolio}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHrubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjDrubah}(h]h ]h"]h$]h&]jjuh1j hj rhhhjrhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjrhhhjrhMubah}(h]jrah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjrhMhjrhhubj4)}(hhh]jM)}(hIs this folio up to date?h]hIs this folio up to date?}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhjrhhubah}(h]h ]h"]h$]h&]uh1j3hjrhhhjrhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjsjHjsjIjJjKuh1hhhhjhNhNubj)}(hXn**Parameters** ``const struct folio *folio`` The folio. **Description** The uptodate flag is set on a folio when every byte in the folio is at least as new as the corresponding bytes on storage. Anonymous and CoW folios are always uptodate. If the folio is not uptodate, some of the bytes in it may be; see the is_partially_uptodate() address_space operation.h](jM)}(h**Parameters**h]j)}(hj sh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhj subah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM hjsubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hj+sh]hconst struct folio *folio}(hj-shhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)subah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj%subj)}(hhh]jM)}(h The folio.h]h The folio.}(hjDshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@shMhjAsubah}(h]h ]h"]h$]h&]uh1jhj%subeh}(h]h ]h"]h$]h&]uh1jhj@shMhj"subah}(h]h ]h"]h$]h&]uh1jhjsubjM)}(h**Description**h]j)}(hjfsh]h Description}(hjhshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdsubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM hjsubjM)}(hX!The uptodate flag is set on a folio when every byte in the folio is at least as new as the corresponding bytes on storage. Anonymous and CoW folios are always uptodate. If the folio is not uptodate, some of the bytes in it may be; see the is_partially_uptodate() address_space operation.h]hX!The uptodate flag is set on a folio when every byte in the folio is at least as new as the corresponding bytes on storage. Anonymous and CoW folios are always uptodate. If the folio is not uptodate, some of the bytes in it may be; see the is_partially_uptodate() address_space operation.}(hj|shhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM hjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_test_large (C function)c.folio_test_largehNtauh1hhjhhhNhNubh)}(hhh](h)}(h1bool folio_test_large (const struct folio *folio)h]h)}(h0bool folio_test_large(const struct folio *folio)h](j)}(hj-h]hbool}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjshhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMYubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjshhhjshMYubh)}(hfolio_test_largeh]j)}(hfolio_test_largeh]hfolio_test_large}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1hhjshhhjshMYubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjshhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjsubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj5)}(hj8h]hstruct}(hjthhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjsubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubh)}(hhh]j)}(hfolioh]hfolio}(hj thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj"tmodnameN classnameNjpjs)}jv]jy)}jljssbc.folio_test_largeasbuh1hhjsubj)}(h h]h }(hj@thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubjF )}(hjI h]h*}(hjNthhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjsubj)}(hfolioh]hfolio}(hj[thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjsubah}(h]h ]h"]h$]h&]jjuh1j hjshhhjshMYubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjshhhjshMYubah}(h]jsah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjshMYhjshhubj4)}(hhh]jM)}(h+Does this folio contain more than one page?h]h+Does this folio contain more than one page?}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMYhjthhubah}(h]h ]h"]h$]h&]uh1j3hjshhhjshMYubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjtjHjtjIjJjKuh1hhhhjhNhNubj)}(hz**Parameters** ``const struct folio *folio`` The folio to test. **Return** True if the folio is larger than one page.h](jM)}(h**Parameters**h]j)}(hjth]h Parameters}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM]hjtubj)}(hhh]j)}(h1``const struct folio *folio`` The folio to test. h](j)}(h``const struct folio *folio``h]jS)}(hjth]hconst struct folio *folio}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjtubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMZhjtubj)}(hhh]jM)}(hThe folio to test.h]hThe folio to test.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjthMZhjtubah}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jhjthMZhjtubah}(h]h ]h"]h$]h&]uh1jhjtubjM)}(h **Return**h]j)}(hjuh]hReturn}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM\hjtubjM)}(h*True if the folio is larger than one page.h]h*True if the folio is larger than one page.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhM\hjtubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hPageHuge (C function) c.PageHugehNtauh1hhjhhhNhNubh)}(hhh](h)}(h'bool PageHuge (const struct page *page)h]h)}(h&bool PageHuge(const struct page *page)h](j)}(hj-h]hbool}(hjFuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBuhhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMubj)}(h h]h }(hjTuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBuhhhjSuhMubh)}(hPageHugeh]j)}(hPageHugeh]hPageHuge}(hjfuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbuubah}(h]h ](jjeh"]h$]h&]jjuh1hhjBuhhhjSuhMubj )}(h(const struct page *page)h]j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjuhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~uubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~uubj5)}(hj8h]hstruct}(hjuhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~uubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~uubh)}(hhh]j)}(hpageh]hpage}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjumodnameN classnameNjpjs)}jv]jy)}jljhusb c.PageHugeasbuh1hhj~uubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~uubjF )}(hjI h]h*}(hjuhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj~uubj)}(hpageh]hpage}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~uubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzuubah}(h]h ]h"]h$]h&]jjuh1j hjBuhhhjSuhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj>uhhhjSuhMubah}(h]j9uah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjSuhMhj;uhhubj4)}(hhh]jM)}(h*Determine if the page belongs to hugetlbfsh]h*Determine if the page belongs to hugetlbfs}(hj vhhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhjvhhubah}(h]h ]h"]h$]h&]uh1j3hj;uhhhjSuhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj8vjHj8vjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` The page to test. **Context** Any context. **Return** True for hugetlbfs pages, false for anon pages or pages belonging to other filesystems.h](jM)}(h**Parameters**h]j)}(hjBvh]h Parameters}(hjDvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@vubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:106: ./include/linux/page-flags.hhMhj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:~ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj6~ubj)}(hhh]j)}(h'``enum fault_flag flags`` Fault flags. h](j)}(h``enum fault_flag flags``h]jS)}(hj[~h]henum fault_flag flags}(hj]~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjY~ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjU~ubj)}(hhh]jM)}(h Fault flags.h]h Fault flags.}(hjt~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjp~hMhjq~ubah}(h]h ]h"]h$]h&]uh1jhjU~ubeh}(h]h ]h"]h$]h&]uh1jhjp~hMhjR~ubah}(h]h ]h"]h$]h&]uh1jhj6~ubjM)}(h**Description**h]j)}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj6~ubjM)}(hX:This is mostly used for places where we want to try to avoid taking the mmap_lock for too long a time when waiting for another condition to change, in which case we can try to be polite to release the mmap_lock in the first round to avoid potential starvation of other processes that would also want the mmap_lock.h]hX:This is mostly used for places where we want to try to avoid taking the mmap_lock for too long a time when waiting for another condition to change, in which case we can try to be polite to release the mmap_lock in the first round to avoid potential starvation of other processes that would also want the mmap_lock.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj6~ubjM)}(h **Return**h]j)}(hj~h]hReturn}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj6~ubjM)}(hitrue if the page fault allows retry and this is the first attempt of the fault handling; false otherwise.h]hitrue if the page fault allows retry and this is the first attempt of the fault handling; false otherwise.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj6~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h vma_kernel_pagesize (C function)c.vma_kernel_pagesizehNtauh1hhjhhhNhNubh)}(hhh](h)}(h>unsigned long vma_kernel_pagesize (struct vm_area_struct *vma)h]h)}(h=unsigned long vma_kernel_pagesize(struct vm_area_struct *vma)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMkubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhjhMkubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhjhMkubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhjhMkubh)}(hvma_kernel_pagesizeh]j)}(hvma_kernel_pagesizeh]hvma_kernel_pagesize}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj~hhhjhMkubj )}(h(struct vm_area_struct *vma)h]j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj[hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjWubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj{modnameN classnameNjpjs)}jv]jy)}jljAsbc.vma_kernel_pagesizeasbuh1hhjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjWubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjSubah}(h]h ]h"]h$]h&]jjuh1j hj~hhhjhMkubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj~hhhjhMkubah}(h]j~ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMkhj~hhubj4)}(hhh]jM)}(h+Default page size granularity for this VMA.h]h+Default page size granularity for this VMA.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMkhjhhubah}(h]h ]h"]h$]h&]uh1j3hj~hhhjhMkubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` The user mapping. **Description** The kernel page size specifies in which granularity VMA modifications can be performed. Folios in this VMA will be aligned to, and at least the size of the number of bytes returned by this function. The default kernel page size is not affected by Transparent Huge Pages being in effect. **Return** The default page size granularity for this VMA.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMohjubj)}(hhh]j)}(h1``struct vm_area_struct *vma`` The user mapping. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMlhjubj)}(hhh]jM)}(hThe user mapping.h]hThe user mapping.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj4hMlhj5ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4hMlhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjZh]h Description}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMnhjubjM)}(hThe kernel page size specifies in which granularity VMA modifications can be performed. Folios in this VMA will be aligned to, and at least the size of the number of bytes returned by this function.h]hThe kernel page size specifies in which granularity VMA modifications can be performed. Folios in this VMA will be aligned to, and at least the size of the number of bytes returned by this function.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMmhjubjM)}(hWThe default kernel page size is not affected by Transparent Huge Pages being in effect.h]hWThe default kernel page size is not affected by Transparent Huge Pages being in effect.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMqhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMthjubjM)}(h/The default page size granularity for this VMA.h]h/The default page size granularity for this VMA.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMuhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_order (C function) c.folio_orderhNtauh1hhjhhhNhNubh)}(hhh](h)}(h4unsigned int folio_order (const struct folio *folio)h]h)}(h3unsigned int folio_order(const struct folio *folio)h](j)}(hunsignedh]hunsigned}(hjՀhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjрhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjрhhhjhMubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjрhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjрhhhjhMubh)}(h folio_orderh]j)}(h folio_orderh]h folio_order}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjрhhhjhMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj.hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj*ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj5)}(hj8h]hstruct}(hjIhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj*ubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubh)}(hhh]j)}(hfolioh]hfolio}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjimodnameN classnameNjpjs)}jv]jy)}jljsb c.folio_orderasbuh1hhj*ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj*ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubah}(h]h ]h"]h$]h&]jjuh1j hjрhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj̀hhhjhMubah}(h]jȀah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjʀhhubj4)}(hhh]jM)}(h The allocation order of a folio.h]h The allocation order of a folio.}(hj́hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjɁhhubah}(h]h ]h"]h$]h&]uh1j3hjʀhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct folio *folio`` The folio. **Description** A folio is composed of 2^order pages. See get_order() for the definition of order. **Return** The order of the folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hj h]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj"hMhj#ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj"hMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjHh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hSA folio is composed of 2^order pages. See get_order() for the definition of order.h]hSA folio is composed of 2^order pages. See get_order() for the definition of order.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h **Return**h]j)}(hjoh]hReturn}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hThe order of the folio.h]hThe order of the folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_reset_order (C function)c.folio_reset_orderhNtauh1hhjhhhNhNubh)}(hhh](h)}(h,void folio_reset_order (struct folio *folio)h]h)}(h+void folio_reset_order(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjÂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj‚hMubh)}(hfolio_reset_orderh]j)}(hfolio_reset_orderh]hfolio_reset_order}(hjՂhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjтubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj‚hMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljׂsbc.folio_reset_orderasbuh1hhjubj)}(h h]h }(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj=hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj‚hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj‚hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj‚hMhjhhubj4)}(hhh]jM)}(h+Reset the folio order and derived _nr_pagesh]h+Reset the folio order and derived _nr_pages}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjqhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj‚hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio. **Description** Reset the order and derived _nr_pages to 0. Must only be used in the process of splitting large folios.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hj΃hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjʃhMhj˃ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjʃhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hgReset the order and derived _nr_pages to 0. Must only be used in the process of splitting large folios.h]hgReset the order and derived _nr_pages to 0. Must only be used in the process of splitting large folios.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mapcount (C function)c.folio_mapcounthNtauh1hhjhhhNhNubh)}(hhh](h)}(h.int folio_mapcount (const struct folio *folio)h]h)}(h-int folio_mapcount(const struct folio *folio)h](j)}(hinth]hint}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhjChMubh)}(hfolio_mapcounth]j)}(hfolio_mapcounth]hfolio_mapcount}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]jjuh1hhj1hhhjChMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjrhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljXsbc.folio_mapcountasbuh1hhjnubj)}(h h]h }(hj˄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubjF )}(hjI h]h*}(hjلhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjnubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubah}(h]h ]h"]h$]h&]jjuh1j hj1hhhjChMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj-hhhjChMubah}(h]j(ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjChMhj*hhubj4)}(hhh]jM)}(h!Number of mappings of this folio.h]h!Number of mappings of this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj*hhhjChMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj(jHj(jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio. **Description** The folio mapcount corresponds to the number of present user page table entries that reference any part of a folio. Each such present user page table entry must be paired with exactly on folio reference. For ordindary folios, each user page table entry (PTE/PMD/PUD/...) counts exactly once. For hugetlb folios, each abstracted "hugetlb" user page table entry that references the entire folio counts exactly once, even when such special page table entries are comprised of multiple ordinary page table entries. Will report 0 for pages which cannot be mapped into userspace, such as slab, page tables and similar. **Return** The number of times this folio is mapped.h](jM)}(h**Parameters**h]j)}(hj2h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjQh]hconst struct folio *folio}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjOubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjKubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjfhMhjgubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjHubah}(h]h ]h"]h$]h&]uh1jhj,ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubjM)}(hThe folio mapcount corresponds to the number of present user page table entries that reference any part of a folio. Each such present user page table entry must be paired with exactly on folio reference.h]hThe folio mapcount corresponds to the number of present user page table entries that reference any part of a folio. Each such present user page table entry must be paired with exactly on folio reference.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubjM)}(hWFor ordindary folios, each user page table entry (PTE/PMD/PUD/...) counts exactly once.h]hWFor ordindary folios, each user page table entry (PTE/PMD/PUD/...) counts exactly once.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubjM)}(hFor hugetlb folios, each abstracted "hugetlb" user page table entry that references the entire folio counts exactly once, even when such special page table entries are comprised of multiple ordinary page table entries.h]hFor hugetlb folios, each abstracted “hugetlb” user page table entry that references the entire folio counts exactly once, even when such special page table entries are comprised of multiple ordinary page table entries.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubjM)}(heWill report 0 for pages which cannot be mapped into userspace, such as slab, page tables and similar.h]heWill report 0 for pages which cannot be mapped into userspace, such as slab, page tables and similar.}(hjυhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjޅubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubjM)}(h)The number of times this folio is mapped.h]h)The number of times this folio is mapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mapped (C function)c.folio_mappedhNtauh1hhjhhhNhNubh)}(hhh](h)}(h-bool folio_mapped (const struct folio *folio)h]h)}(h,bool folio_mapped(const struct folio *folio)h](j)}(hj-h]hbool}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!hhhj2hMubh)}(h folio_mappedh]j)}(h folio_mappedh]h folio_mapped}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1hhj!hhhj2hMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjahhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj]ubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj5)}(hj8h]hstruct}(hj|hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj]ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljGsbc.folio_mappedasbuh1hhj]ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubjF )}(hjI h]h*}(hjȆhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj]ubj)}(hfolioh]hfolio}(hjՆhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjYubah}(h]h ]h"]h$]h&]jjuh1j hj!hhhj2hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj2hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj2hMhjhhubj4)}(hhh]jM)}(h$Is this folio mapped into userspace?h]h$Is this folio mapped into userspace?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj2hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct folio *folio`` The folio. **Return** True if any page in this folio is referenced by user page tables.h](jM)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hj@h]hconst struct folio *folio}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj:ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjUhMhjVubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhjUhMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hj{h]hReturn}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hATrue if any page in this folio is referenced by user page tables.h]hATrue if any page in this folio is referenced by user page tables.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hthp_order (C function) c.thp_orderhNtauh1hhjhhhNhNubh)}(hhh](h)}(h*unsigned int thp_order (struct page *page)h]h)}(h)unsigned int thp_order(struct page *page)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjχhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj·hMubj)}(hinth]hint}(hj݇hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj·hMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj·hMubh)}(h thp_orderh]j)}(h thp_orderh]h thp_order}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj·hMubj )}(h(struct page *page)h]j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]jy)}jljsb c.thp_orderasbuh1hhjubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjehhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj·hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj·hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj·hMhjhhubj4)}(hhh]jM)}(h!Order of a transparent huge page.h]h!Order of a transparent huge page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj·hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hM**Parameters** ``struct page *page`` Head page of a transparent huge page.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h;``struct page *page`` Head page of a transparent huge page.h](j)}(h``struct page *page``h]jS)}(hj݈h]hstruct page *page}(hj߈hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjۈubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj׈ubj)}(hhh]jM)}(h%Head page of a transparent huge page.h]h%Head page of a transparent huge page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubah}(h]h ]h"]h$]h&]uh1jhj׈ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjԈubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hthp_size (C function) c.thp_sizehNtauh1hhjhhhNhNubh)}(hhh](h)}(h*unsigned long thp_size (struct page *page)h]h)}(h)unsigned long thp_size(struct page *page)h](j)}(hunsignedh]hunsigned}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhjEhMubj)}(hlongh]hlong}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhjEhMubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhjEhMubh)}(hthp_sizeh]j)}(hthp_sizeh]hthp_size}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ](jjeh"]h$]h&]jjuh1hhj3hhhjEhMubj )}(h(struct page *page)h]j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljvsb c.thp_sizeasbuh1hhjubj)}(h h]h }(hjΉhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj܉hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj3hhhjEhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj/hhhjEhMubah}(h]j*ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjEhMhj,hhubj4)}(hhh]jM)}(h Size of a transparent huge page.h]h Size of a transparent huge page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj,hhhjEhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj+jHj+jIjJjKuh1hhhhjhNhNubj)}(hx**Parameters** ``struct page *page`` Head page of a transparent huge page. **Return** Number of bytes in this page.h](jM)}(h**Parameters**h]j)}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj/ubj)}(hhh]j)}(h<``struct page *page`` Head page of a transparent huge page. h](j)}(h``struct page *page``h]jS)}(hjTh]hstruct page *page}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjRubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjNubj)}(hhh]jM)}(h%Head page of a transparent huge page.h]h%Head page of a transparent huge page.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjihMhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihMhjKubah}(h]h ]h"]h$]h&]uh1jhj/ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj/ubjM)}(hNumber of bytes in this page.h]hNumber of bytes in this page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_get (C function) c.folio_gethNtauh1hhjhhhNhNubh)}(hhh](h)}(h$void folio_get (struct folio *folio)h]h)}(h#void folio_get(struct folio *folio)h](j)}(hvoidh]hvoid}(hjԊhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЊhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЊhhhjhM@ubh)}(h folio_geth]j)}(h folio_geth]h folio_get}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjЊhhhjhM@ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hfolioh]hfolio}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1modnameN classnameNjpjs)}jv]jy)}jljsb c.folio_getasbuh1hhj ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj]hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hfolioh]hfolio}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubah}(h]h ]h"]h$]h&]jjuh1j hjЊhhhjhM@ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj̊hhhjhM@ubah}(h]jNJah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM@hjɊhhubj4)}(hhh]jM)}(h)Increment the reference count on a folio.h]h)Increment the reference count on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM@hjhhubah}(h]h ]h"]h$]h&]uh1j3hjɊhhhjhM@ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` The folio. **Context** May be called in any context, as long as you know that you have a refcount on the folio. If you do not already have one, folio_try_get() may be the right interface for you to use.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMDhjubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjՋh]hstruct folio *folio}(hj׋hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjӋubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMAhjϋubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMAhjubah}(h]h ]h"]h$]h&]uh1jhjϋubeh}(h]h ]h"]h$]h&]uh1jhjhMAhj̋ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMChjubjM)}(hMay be called in any context, as long as you know that you have a refcount on the folio. If you do not already have one, folio_try_get() may be the right interface for you to use.h]hMay be called in any context, as long as you know that you have a refcount on the folio. If you do not already have one, folio_try_get() may be the right interface for you to use.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMChjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_put (C function) c.folio_puthNtauh1hhjhhhNhNubh)}(hhh](h)}(h$void folio_put (struct folio *folio)h]h)}(h#void folio_put(struct folio *folio)h](j)}(hvoidh]hvoid}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMaubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQhhhjchMaubh)}(h folio_puth]j)}(h folio_puth]h folio_put}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ](jjeh"]h$]h&]jjuh1hhjQhhhjchMaubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljxsb c.folio_putasbuh1hhjubj)}(h h]h }(hjЌhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjތhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjQhhhjchMaubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjMhhhjchMaubah}(h]jHah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjchMahjJhhubj4)}(hhh]jM)}(h)Decrement the reference count on a folio.h]h)Decrement the reference count on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMahjhhubah}(h]h ]h"]h$]h&]uh1j3hjJhhhjchMaubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj-jHj-jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio. **Description** If the folio's reference count reaches zero, the memory will be released back to the page allocator and may be used by another allocation immediately. Do not access the memory or the struct folio after calling folio_put() unless you can be sure that it wasn't the last reference. **Context** May be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h](jM)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMehj1ubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjVh]hstruct folio *folio}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjTubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMbhjPubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjkhMbhjlubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjkhMbhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMdhj1ubjM)}(hXIf the folio's reference count reaches zero, the memory will be released back to the page allocator and may be used by another allocation immediately. Do not access the memory or the struct folio after calling folio_put() unless you can be sure that it wasn't the last reference.h]hXIf the folio’s reference count reaches zero, the memory will be released back to the page allocator and may be used by another allocation immediately. Do not access the memory or the struct folio after calling folio_put() unless you can be sure that it wasn’t the last reference.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMchj1ubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMihj1ubjM)}(hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h]hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.}(hj΍hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMjhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_put_refs (C function)c.folio_put_refshNtauh1hhjhhhNhNubh)}(hhh](h)}(h3void folio_put_refs (struct folio *folio, int refs)h]h)}(h2void folio_put_refs(struct folio *folio, int refs)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMtubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMtubh)}(hfolio_put_refsh]j)}(hfolio_put_refsh]hfolio_put_refs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMtubj )}(h(struct folio *folio, int refs)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj:hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj6ubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(hfolioh]hfolio}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjZmodnameN classnameNjpjs)}jv]jy)}jlj sbc.folio_put_refsasbuh1hhj6ubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubj )}(hint refsh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hrefsh]hrefs}(hjȎhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMtubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMtubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMthjhhubj4)}(hhh]jM)}(h&Reduce the reference count on a folio.h]h&Reduce the reference count on a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMthjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMtubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX0**Parameters** ``struct folio *folio`` The folio. ``int refs`` The amount to subtract from the folio's reference count. **Description** If the folio's reference count reaches zero, the memory will be released back to the page allocator and may be used by another allocation immediately. Do not access the memory or the struct folio after calling folio_put_refs() unless you can be sure that these weren't the last references. **Context** May be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMxhjubj)}(hhh](j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hj3h]hstruct folio *folio}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMuhj-ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHhMuhjIubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhjHhMuhj*ubj)}(hF``int refs`` The amount to subtract from the folio's reference count. h](j)}(h ``int refs``h]jS)}(hjlh]hint refs}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMvhjfubj)}(hhh]jM)}(h8The amount to subtract from the folio's reference count.h]h:The amount to subtract from the folio’s reference count.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMvhjubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjhMvhj*ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMxhjubjM)}(hX"If the folio's reference count reaches zero, the memory will be released back to the page allocator and may be used by another allocation immediately. Do not access the memory or the struct folio after calling folio_put_refs() unless you can be sure that these weren't the last references.h]hX&If the folio’s reference count reaches zero, the memory will be released back to the page allocator and may be used by another allocation immediately. Do not access the memory or the struct folio after calling folio_put_refs() unless you can be sure that these weren’t the last references.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMwhjubjM)}(h **Context**h]j)}(hjΏh]hContext}(hjЏhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̏ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM}hjubjM)}(hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h]hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM~hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolios_put (C function) c.folios_puthNtauh1hhjhhhNhNubh)}(hhh](h)}(h,void folios_put (struct folio_batch *folios)h]h)}(h+void folios_put(struct folio_batch *folios)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj!hMubh)}(h folios_puth]j)}(h folios_puth]h folios_put}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj!hMubj )}(h(struct folio_batch *folios)h]j )}(hstruct folio_batch *foliosh](j5)}(hj8h]hstruct}(hjPhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjLubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjpmodnameN classnameNjpjs)}jv]jy)}jlj6sb c.folios_putasbuh1hhjLubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjLubj)}(hfoliosh]hfolios}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjHubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj!hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj!hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj!hMhjhhubj4)}(hhh]jM)}(h4Decrement the reference count on an array of folios.h]h4Decrement the reference count on an array of folios.}(hjӐhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjАhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj!hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio_batch *folios`` The folios. **Description** Like folio_put(), but for a batch of folios. This is more efficient than writing the loop yourself as it will optimise the locks which need to be taken if the folios are freed. The folios batch is returned empty and ready to be reused for another batch; there is no need to reinitialise it. **Context** May be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h+``struct folio_batch *folios`` The folios. h](j)}(h``struct folio_batch *folios``h]jS)}(hjh]hstruct folio_batch *folios}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h The folios.h]h The folios.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hMhj*ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hX$Like folio_put(), but for a batch of folios. This is more efficient than writing the loop yourself as it will optimise the locks which need to be taken if the folios are freed. The folios batch is returned empty and ready to be reused for another batch; there is no need to reinitialise it.h]hX$Like folio_put(), but for a batch of folios. This is more efficient than writing the loop yourself as it will optimise the locks which need to be taken if the folios are freed. The folios batch is returned empty and ready to be reused for another batch; there is no need to reinitialise it.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h **Context**h]j)}(hjvh]hContext}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h]hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%vma_flags_is_cow_mapping (C function)c.vma_flags_is_cow_mappinghNtauh1hhjhhhNhNubh)}(hhh](h)}(h8bool vma_flags_is_cow_mapping (const vma_flags_t *flags)h]h)}(h7bool vma_flags_is_cow_mapping(const vma_flags_t *flags)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjɑhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjȑhMubh)}(hvma_flags_is_cow_mappingh]j)}(hvma_flags_is_cow_mappingh]hvma_flags_is_cow_mapping}(hjۑhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjבubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjȑhMubj )}(h(const vma_flags_t *flags)h]j )}(hconst vma_flags_t *flagsh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vma_flags_th]h vma_flags_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljݑsbc.vma_flags_is_cow_mappingasbuh1hhjubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjChhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hflagsh]hflags}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjȑhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjȑhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjȑhMhjhhubj4)}(hhh]jM)}(h'Do these VMA flags imply a CoW mapping?h]h'Do these VMA flags imply a CoW mapping?}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjwhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjȑhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const vma_flags_t *flags`` The VMA flags to check. **Description** Mappings which could be CoW'd (subject to Copy-On-Write faults) are described as CoW mappings. All mappings backed by anonymous folios (all anonymous mappings and most MAP_PRIVATE-file backed ranges) are CoW mappings. All other mappings (including all MAP_SHARED mappings) are non-CoW. The criteria are !VMA_SHARED_BIT, VMA_MAYWRITE_BIT. VMA_MAYWRITE_BIT is checked instead of VMA_WRITE_BIT to account for both future mprotect() calls which can render a read-only mapping writable, and GUP with FOLL_FORCE (e.g. ptrace) which can CoW a read-only mapping. - No anonymous mapping can ever clear VMA_MAYWRITE_BIT. - Writes to anonymous mappings do not immediately result in CoW faults but may do so after the process is forked or if a read is followed by a write. - Writes to MAP_PRIVATE file-backed mappings result in CoW faults and may do so again after fork. - MAP_SHARED mappings of a file opened read-only are transformed into VMA_MAYSHARE_BIT, !VMA_SHARED_BIT, !VMA_MAYWRITE_BIT mappings, so remain non-CoW. - Drivers may clear VMA_MAYWRITE_BIT but do so at mmap() time and cannot mark themselves anonymous. Having cleared this flag it is not valid for them to leave the VMA_WRITE_BIT flag set. As a consequence, the anonymous reverse mapping only tracks CoW mappings. **Return** true if the flags indicate a CoW mapping, otherwise false.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h5``const vma_flags_t *flags`` The VMA flags to check. h](j)}(h``const vma_flags_t *flags``h]jS)}(hjh]hconst vma_flags_t *flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hThe VMA flags to check.h]hThe VMA flags to check.}(hjԒhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjВhMhjђubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjВhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h^Mappings which could be CoW'd (subject to Copy-On-Write faults) are described as CoW mappings.h]h`Mappings which could be CoW’d (subject to Copy-On-Write faults) are described as CoW mappings.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hzAll mappings backed by anonymous folios (all anonymous mappings and most MAP_PRIVATE-file backed ranges) are CoW mappings.h]hzAll mappings backed by anonymous folios (all anonymous mappings and most MAP_PRIVATE-file backed ranges) are CoW mappings.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hCAll other mappings (including all MAP_SHARED mappings) are non-CoW.h]hCAll other mappings (including all MAP_SHARED mappings) are non-CoW.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h3The criteria are !VMA_SHARED_BIT, VMA_MAYWRITE_BIT.h]h3The criteria are !VMA_SHARED_BIT, VMA_MAYWRITE_BIT.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hVMA_MAYWRITE_BIT is checked instead of VMA_WRITE_BIT to account for both future mprotect() calls which can render a read-only mapping writable, and GUP with FOLL_FORCE (e.g. ptrace) which can CoW a read-only mapping.h]hVMA_MAYWRITE_BIT is checked instead of VMA_WRITE_BIT to account for both future mprotect() calls which can render a read-only mapping writable, and GUP with FOLL_FORCE (e.g. ptrace) which can CoW a read-only mapping.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjaW)}(hhh](j/)}(h6No anonymous mapping can ever clear VMA_MAYWRITE_BIT. h]jM)}(h5No anonymous mapping can ever clear VMA_MAYWRITE_BIT.h]h5No anonymous mapping can ever clear VMA_MAYWRITE_BIT.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjZubah}(h]h ]h"]h$]h&]uh1j/hjWubj/)}(hWrites to anonymous mappings do not immediately result in CoW faults but may do so after the process is forked or if a read is followed by a write. h]jM)}(hWrites to anonymous mappings do not immediately result in CoW faults but may do so after the process is forked or if a read is followed by a write.h]hWrites to anonymous mappings do not immediately result in CoW faults but may do so after the process is forked or if a read is followed by a write.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjsubah}(h]h ]h"]h$]h&]uh1j/hjWubj/)}(h`Writes to MAP_PRIVATE file-backed mappings result in CoW faults and may do so again after fork. h]jM)}(h_Writes to MAP_PRIVATE file-backed mappings result in CoW faults and may do so again after fork.h]h_Writes to MAP_PRIVATE file-backed mappings result in CoW faults and may do so again after fork.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubah}(h]h ]h"]h$]h&]uh1j/hjWubj/)}(hMAP_SHARED mappings of a file opened read-only are transformed into VMA_MAYSHARE_BIT, !VMA_SHARED_BIT, !VMA_MAYWRITE_BIT mappings, so remain non-CoW. h]jM)}(hMAP_SHARED mappings of a file opened read-only are transformed into VMA_MAYSHARE_BIT, !VMA_SHARED_BIT, !VMA_MAYWRITE_BIT mappings, so remain non-CoW.h]hMAP_SHARED mappings of a file opened read-only are transformed into VMA_MAYSHARE_BIT, !VMA_SHARED_BIT, !VMA_MAYWRITE_BIT mappings, so remain non-CoW.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubah}(h]h ]h"]h$]h&]uh1j/hjWubj/)}(hDrivers may clear VMA_MAYWRITE_BIT but do so at mmap() time and cannot mark themselves anonymous. Having cleared this flag it is not valid for them to leave the VMA_WRITE_BIT flag set. h]jM)}(hDrivers may clear VMA_MAYWRITE_BIT but do so at mmap() time and cannot mark themselves anonymous. Having cleared this flag it is not valid for them to leave the VMA_WRITE_BIT flag set.h]hDrivers may clear VMA_MAYWRITE_BIT but do so at mmap() time and cannot mark themselves anonymous. Having cleared this flag it is not valid for them to leave the VMA_WRITE_BIT flag set.}(hj“hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubah}(h]h ]h"]h$]h&]uh1j/hjWubeh}(h]h ]h"]h$]h&]jWjWuh1j`WhjlhMhjubjM)}(hIAs a consequence, the anonymous reverse mapping only tracks CoW mappings.h]hIAs a consequence, the anonymous reverse mapping only tracks CoW mappings.}(hjݓhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubjM)}(h:true if the flags indicate a CoW mapping, otherwise false.h]h:true if the flags indicate a CoW mapping, otherwise false.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvma_is_cow_mapping (C function)c.vma_is_cow_mappinghNtauh1hhjhhhNhNubh)}(hhh](h)}(h:bool vma_is_cow_mapping (const struct vm_area_struct *vma)h]h)}(h9bool vma_is_cow_mapping(const struct vm_area_struct *vma)h](j)}(hj-h]hbool}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhj@hM ubh)}(hvma_is_cow_mappingh]j)}(hvma_is_cow_mappingh]hvma_is_cow_mapping}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubah}(h]h ](jjeh"]h$]h&]jjuh1hhj/hhhj@hM ubj )}(h"(const struct vm_area_struct *vma)h]j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjohhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjkubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjkubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljUsbc.vma_is_cow_mappingasbuh1hhjkubj)}(h h]h }(hjȔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubjF )}(hjI h]h*}(hj֔hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjkubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjgubah}(h]h ]h"]h$]h&]jjuh1j hj/hhhj@hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj+hhhj@hM ubah}(h]j&ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj@hM hj(hhubj4)}(hhh]jM)}(hIs this VMA a CoW mapping?h]hIs this VMA a CoW mapping?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj hhubah}(h]h ]h"]h$]h&]uh1j3hj(hhhj@hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj%jHj%jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct vm_area_struct *vma`` The VMA to check. **Description** See vma_flags_is_cow_mapping() for details. **Return** true if the VMA is a CoW mapping, otherwise false.h](jM)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj)ubj)}(hhh]j)}(h7``const struct vm_area_struct *vma`` The VMA to check. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjNh]h const struct vm_area_struct *vma}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjHubj)}(hhh]jM)}(hThe VMA to check.h]hThe VMA to check.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjchM hjdubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjchM hjEubah}(h]h ]h"]h$]h&]uh1jhj)ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj)ubjM)}(h+See vma_flags_is_cow_mapping() for details.h]h+See vma_flags_is_cow_mapping() for details.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj)ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj)ubjM)}(h2true if the VMA is a CoW mapping, otherwise false.h]h2true if the VMA is a CoW mapping, otherwise false.}(hjƕhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$vma_desc_is_cow_mapping (C function)c.vma_desc_is_cow_mappinghNtauh1hhjhhhNhNubh)}(hhh](h)}(h8bool vma_desc_is_cow_mapping (struct vm_area_desc *desc)h]h)}(h7bool vma_desc_is_cow_mapping(struct vm_area_desc *desc)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hvma_desc_is_cow_mappingh]j)}(hvma_desc_is_cow_mappingh]hvma_desc_is_cow_mapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h(struct vm_area_desc *desc)h]j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hj1hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj-ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjQmodnameN classnameNjpjs)}jv]jy)}jljsbc.vma_desc_is_cow_mappingasbuh1hhj-ubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubjF )}(hjI h]h*}(hj}hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj-ubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj)ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h%Is this VMA descriptor a CoW mapping?h]h%Is this VMA descriptor a CoW mapping?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj̖jHj̖jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor to check. **Description** See vma_flags_is_cow_mapping() for details. **Return** true if the VMA descriptor describes a CoW mapping, otherwise false.h](jM)}(h**Parameters**h]j)}(hj֖h]h Parameters}(hjؖhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԖubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM! hjЖubj)}(hhh]j)}(h;``struct vm_area_desc *desc`` The VMA descriptor to check. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hjh]hstruct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]jM)}(hThe VMA descriptor to check.h]hThe VMA descriptor to check.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hM hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hM hjubah}(h]h ]h"]h$]h&]uh1jhjЖubjM)}(h**Description**h]j)}(hj0h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjЖubjM)}(h+See vma_flags_is_cow_mapping() for details.h]h+See vma_flags_is_cow_mapping() for details.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjЖubjM)}(h **Return**h]j)}(hjWh]hReturn}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM! hjЖubjM)}(hDtrue if the VMA descriptor describes a CoW mapping, otherwise false.h]hDtrue if the VMA descriptor describes a CoW mapping, otherwise false.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM" hjЖubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_pfn (C function) c.folio_pfnhNtauh1hhjhhhNhNubh)}(hhh](h)}(h3unsigned long folio_pfn (const struct folio *folio)h]h)}(h2unsigned long folio_pfn(const struct folio *folio)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMd ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMd ubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMd ubj)}(h h]h }(hjǗhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMd ubh)}(h folio_pfnh]j)}(h folio_pfnh]h folio_pfn}(hjٗhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj՗ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMd ubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj0modnameN classnameNjpjs)}jv]jy)}jljۗsb c.folio_pfnasbuh1hhjubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj\hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMd ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMd ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMd hjhhubj4)}(hhh]jM)}(h(Return the Page Frame Number of a folio.h]h(Return the Page Frame Number of a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMd hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMd ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct folio *folio`` The folio. **Description** A folio may contain multiple pages. The pages have consecutive Page Frame Numbers. **Return** The Page Frame Number of the first page in the folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMh hjubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjԘh]hconst struct folio *folio}(hj֘hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjҘubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMe hjΘubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMe hjubah}(h]h ]h"]h$]h&]uh1jhjΘubeh}(h]h ]h"]h$]h&]uh1jhjhMe hj˘ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMg hjubjM)}(hSA folio may contain multiple pages. The pages have consecutive Page Frame Numbers.h]hSA folio may contain multiple pages. The pages have consecutive Page Frame Numbers.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMf hjubjM)}(h **Return**h]j)}(hj6h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMi hjubjM)}(h5The Page Frame Number of the first page in the folio.h]h5The Page Frame Number of the first page in the folio.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMj hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mk_pte (C function)c.folio_mk_ptehNtauh1hhjhhhNhNubh)}(hhh](h)}(h?pte_t folio_mk_pte (const struct folio *folio, pgprot_t pgprot)h]h)}(h>pte_t folio_mk_pte(const struct folio *folio, pgprot_t pgprot)h](h)}(hhh]j)}(hpte_th]hpte_t}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl folio_mk_ptesbc.folio_mk_pteasbuh1hhjwhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM} ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhjhM} ubh)}(h folio_mk_pteh]j)}(hjh]h folio_mk_pte}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjwhhhjhM} ubj )}(h,(const struct folio *folio, pgprot_t pgprot)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj͙hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjəubj)}(h h]h }(hjڙhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjəubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjəubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjəubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.folio_mk_pteasbuh1hhjəubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjəubjF )}(hjI h]h*}(hj2hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjəubj)}(hfolioh]hfolio}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjəubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjřubj )}(hpgprot_t pgproth](h)}(hhh]j)}(hpgprot_th]hpgprot_t}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]modnameN classnameNjpjs)}jv]jc.folio_mk_pteasbuh1hhjTubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hpgproth]hpgprot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjřubeh}(h]h ]h"]h$]h&]jjuh1j hjwhhhjhM} ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjshhhjhM} ubah}(h]jnah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM} hjphhubj4)}(hhh]jM)}(hCreate a PTE for this folioh]hCreate a PTE for this folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM} hjhhubah}(h]h ]h"]h$]h&]uh1j3hjphhhjhM} ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjɚjHjɚjIjJjKuh1hhhhjhNhNubj)}(hX?**Parameters** ``const struct folio *folio`` The folio to create a PTE for ``pgprot_t pgprot`` The page protection bits to use **Description** Create a page table entry for the first page of this folio. This is suitable for passing to set_ptes(). **Return** A page table entry suitable for mapping this folio.h](jM)}(h**Parameters**h]j)}(hjӚh]h Parameters}(hj՚hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjњubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj͚ubj)}(hhh](j)}(h<``const struct folio *folio`` The folio to create a PTE for h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM~ hjubj)}(hhh]jM)}(hThe folio to create a PTE forh]hThe folio to create a PTE for}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM~ hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM~ hjubj)}(h4``pgprot_t pgprot`` The page protection bits to use h](j)}(h``pgprot_t pgprot``h]jS)}(hj+h]hpgprot_t pgprot}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj%ubj)}(hhh]jM)}(hThe page protection bits to useh]hThe page protection bits to use}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hM hjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hjubeh}(h]h ]h"]h$]h&]uh1jhj͚ubjM)}(h**Description**h]j)}(hjfh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj͚ubjM)}(hgCreate a page table entry for the first page of this folio. This is suitable for passing to set_ptes().h]hgCreate a page table entry for the first page of this folio. This is suitable for passing to set_ptes().}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj͚ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj͚ubjM)}(h3A page table entry suitable for mapping this folio.h]h3A page table entry suitable for mapping this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj͚ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mk_pmd (C function)c.folio_mk_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(h?pmd_t folio_mk_pmd (const struct folio *folio, pgprot_t pgprot)h]h)}(h>pmd_t folio_mk_pmd(const struct folio *folio, pgprot_t pgprot)h](h)}(hhh]j)}(hpmd_th]hpmd_t}(hj՛hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjқubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjכmodnameN classnameNjpjs)}jv]jy)}jl folio_mk_pmdsbc.folio_mk_pmdasbuh1hhjΛhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΛhhhjhM ubh)}(h folio_mk_pmdh]j)}(hjh]h folio_mk_pmd}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjΛhhhjhM ubj )}(h,(const struct folio *folio, pgprot_t pgprot)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj$hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj5)}(hj8h]hstruct}(hj?hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hfolioh]hfolio}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj_modnameN classnameNjpjs)}jv]jc.folio_mk_pmdasbuh1hhj ubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hpgprot_t pgproth](h)}(hhh]j)}(hpgprot_th]hpgprot_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.folio_mk_pmdasbuh1hhjubj)}(h h]h }(hjМhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpgproth]hpgprot}(hjޜhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjΛhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjʛhhhjhM ubah}(h]jśah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjǛhhubj4)}(hhh]jM)}(hCreate a PMD for this folioh]hCreate a PMD for this folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjǛhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hXA**Parameters** ``const struct folio *folio`` The folio to create a PMD for ``pgprot_t pgprot`` The page protection bits to use **Description** Create a page table entry for the first page of this folio. This is suitable for passing to set_pmd_at(). **Return** A page table entry suitable for mapping this folio.h](jM)}(h**Parameters**h]j)}(hj*h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj$ubj)}(hhh](j)}(h<``const struct folio *folio`` The folio to create a PMD for h](j)}(h``const struct folio *folio``h]jS)}(hjIh]hconst struct folio *folio}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjGubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjCubj)}(hhh]jM)}(hThe folio to create a PMD forh]hThe folio to create a PMD for}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj^hM hj_ubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj^hM hj@ubj)}(h4``pgprot_t pgprot`` The page protection bits to use h](j)}(h``pgprot_t pgprot``h]jS)}(hjh]hpgprot_t pgprot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj|ubj)}(hhh]jM)}(hThe page protection bits to useh]hThe page protection bits to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhjhM hj@ubeh}(h]h ]h"]h$]h&]uh1jhj$ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj$ubjM)}(hiCreate a page table entry for the first page of this folio. This is suitable for passing to set_pmd_at().h]hiCreate a page table entry for the first page of this folio. This is suitable for passing to set_pmd_at().}(hjӝhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj$ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj$ubjM)}(h3A page table entry suitable for mapping this folio.h]h3A page table entry suitable for mapping this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mk_pud (C function)c.folio_mk_pudhNtauh1hhjhhhNhNubh)}(hhh](h)}(h?pud_t folio_mk_pud (const struct folio *folio, pgprot_t pgprot)h]h)}(h>pud_t folio_mk_pud(const struct folio *folio, pgprot_t pgprot)h](h)}(hhh]j)}(hpud_th]hpud_t}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.modnameN classnameNjpjs)}jv]jy)}jl folio_mk_pudsbc.folio_mk_pudasbuh1hhj%hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhjMhM ubh)}(h folio_mk_pudh]j)}(hjJh]h folio_mk_pud}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj%hhhjMhM ubj )}(h,(const struct folio *folio, pgprot_t pgprot)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj{hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj%modnameN classnameNjpjs)}jv]jHc.folio_mk_pudasbuh1hhjwubj)}(h h]h }(hjҞhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjwubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjsubj )}(hpgprot_t pgproth](h)}(hhh]j)}(hpgprot_th]hpgprot_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jHc.folio_mk_pudasbuh1hhjubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpgproth]hpgprot}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjsubeh}(h]h ]h"]h$]h&]jjuh1j hj%hhhjMhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj!hhhjMhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjMhM hjhhubj4)}(hhh]jM)}(hCreate a PUD for this folioh]hCreate a PUD for this folio}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj\hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjMhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjwjHjwjIjJjKuh1hhhhjhNhNubj)}(hXA**Parameters** ``const struct folio *folio`` The folio to create a PUD for ``pgprot_t pgprot`` The page protection bits to use **Description** Create a page table entry for the first page of this folio. This is suitable for passing to set_pud_at(). **Return** A page table entry suitable for mapping this folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj{ubj)}(hhh](j)}(h<``const struct folio *folio`` The folio to create a PUD for h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]jM)}(hThe folio to create a PUD forh]hThe folio to create a PUD for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h4``pgprot_t pgprot`` The page protection bits to use h](j)}(h``pgprot_t pgprot``h]jS)}(hjٟh]hpgprot_t pgprot}(hj۟hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjןubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjӟubj)}(hhh]jM)}(hThe page protection bits to useh]hThe page protection bits to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjӟubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhj{ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj{ubjM)}(hiCreate a page table entry for the first page of this folio. This is suitable for passing to set_pud_at().h]hiCreate a page table entry for the first page of this folio. This is suitable for passing to set_pud_at().}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj{ubjM)}(h **Return**h]j)}(hj;h]hReturn}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj{ubjM)}(h3A page table entry suitable for mapping this folio.h]h3A page table entry suitable for mapping this folio.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#folio_maybe_dma_pinned (C function)c.folio_maybe_dma_pinnedhNtauh1hhjhhhNhNubh)}(hhh](h)}(h1bool folio_maybe_dma_pinned (struct folio *folio)h]h)}(h0bool folio_maybe_dma_pinned(struct folio *folio)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|hhhjhM ubh)}(hfolio_maybe_dma_pinnedh]j)}(hfolio_maybe_dma_pinnedh]hfolio_maybe_dma_pinned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj|hhhjhM ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjɠhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjڠhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjנubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjܠmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_maybe_dma_pinnedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj|hhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjxhhhjhM ubah}(h]jsah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjuhhubj4)}(hhh]jM)}(h(Report if a folio may be pinned for DMA.h]h(Report if a folio may be pinned for DMA.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj<hhubah}(h]h ]h"]h$]h&]uh1j3hjuhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjWjHjWjIjJjKuh1hhhhjhNhNubj)}(hX **Parameters** ``struct folio *folio`` The folio. **Description** This function checks if a folio has been pinned via a call to a function in the pin_user_pages() family. For small folios, the return value is partially fuzzy: false is not fuzzy, because it means "definitely not pinned for DMA", but true means "probably pinned for DMA, but possibly a false positive due to having at least GUP_PIN_COUNTING_BIAS worth of normal folio references". False positives are OK, because: a) it's unlikely for a folio to get that many refcounts, and b) all the callers of this routine are expected to be able to deal gracefully with a false positive. For most large folios, the result will be exactly correct. That's because we have more tracking data available: the _pincount field is used instead of the GUP_PIN_COUNTING_BIAS scheme. For more information, please see Documentation/core-api/pin_user_pages.rst. **Return** True, if it is likely that the folio has been "dma-pinned". False, if the folio is definitely not dma-pinned.h](jM)}(h**Parameters**h]j)}(hjah]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjzubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhjhM hjwubah}(h]h ]h"]h$]h&]uh1jhj[ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(hhThis function checks if a folio has been pinned via a call to a function in the pin_user_pages() family.h]hhThis function checks if a folio has been pinned via a call to a function in the pin_user_pages() family.}(hjѡhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(hXFor small folios, the return value is partially fuzzy: false is not fuzzy, because it means "definitely not pinned for DMA", but true means "probably pinned for DMA, but possibly a false positive due to having at least GUP_PIN_COUNTING_BIAS worth of normal folio references".h]hXFor small folios, the return value is partially fuzzy: false is not fuzzy, because it means “definitely not pinned for DMA”, but true means “probably pinned for DMA, but possibly a false positive due to having at least GUP_PIN_COUNTING_BIAS worth of normal folio references”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(hFalse positives are OK, because: a) it's unlikely for a folio to get that many refcounts, and b) all the callers of this routine are expected to be able to deal gracefully with a false positive.h]hFalse positives are OK, because: a) it’s unlikely for a folio to get that many refcounts, and b) all the callers of this routine are expected to be able to deal gracefully with a false positive.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(hFor most large folios, the result will be exactly correct. That's because we have more tracking data available: the _pincount field is used instead of the GUP_PIN_COUNTING_BIAS scheme.h]hFor most large folios, the result will be exactly correct. That’s because we have more tracking data available: the _pincount field is used instead of the GUP_PIN_COUNTING_BIAS scheme.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(hKFor more information, please see Documentation/core-api/pin_user_pages.rst.h]hKFor more information, please see Documentation/core-api/pin_user_pages.rst.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(h **Return**h]j)}(hjh]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubjM)}(hmTrue, if it is likely that the folio has been "dma-pinned". False, if the folio is definitely not dma-pinned.h]hqTrue, if it is likely that the folio has been “dma-pinned”. False, if the folio is definitely not dma-pinned.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](his_zero_page (C function)c.is_zero_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(h+bool is_zero_page (const struct page *page)h]h)}(h*bool is_zero_page(const struct page *page)h](j)}(hj-h]hbool}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjphM ubh)}(h is_zero_pageh]j)}(h is_zero_pageh]h is_zero_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj_hhhjphM ubj )}(h(const struct page *page)h]j )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjǢhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjآhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjբubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjڢmodnameN classnameNjpjs)}jv]jy)}jljsbc.is_zero_pageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj_hhhjphM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj[hhhjphM ubah}(h]jVah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjphM hjXhhubj4)}(hhh]jM)}(hQuery if a page is a zero pageh]hQuery if a page is a zero page}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj:hhubah}(h]h ]h"]h$]h&]uh1j3hjXhhhjphM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjUjHjUjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct page *page`` The page to query **Description** This returns true if **page** is one of the permanent zero pages.h](jM)}(h**Parameters**h]j)}(hj_h]h Parameters}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjYubj)}(hhh]j)}(h.``const struct page *page`` The page to query h](j)}(h``const struct page *page``h]jS)}(hj~h]hconst struct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj|ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjxubj)}(hhh]jM)}(hThe page to queryh]hThe page to query}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jhjhM hjuubah}(h]h ]h"]h$]h&]uh1jhjYubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjYubjM)}(hAThis returns true if **page** is one of the permanent zero pages.h](hThis returns true if }(hjϣhhhNhNubj)}(h**page**h]hpage}(hjףhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjϣubh$ is one of the permanent zero pages.}(hjϣhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](his_zero_folio (C function)c.is_zero_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(h.bool is_zero_folio (const struct folio *folio)h]h)}(h-bool is_zero_folio(const struct folio *folio)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhM ubh)}(h is_zero_folioh]j)}(h is_zero_folioh]h is_zero_folio}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhjhM ubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjLhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjHubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj5)}(hj8h]hstruct}(hjghhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjHubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj2sbc.is_zero_folioasbuh1hhjHubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjHubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjDubah}(h]h ]h"]h$]h&]jjuh1j hj hhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(hQuery if a folio is a zero pageh]hQuery if a folio is a zero page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct folio *folio`` The folio to query **Description** This returns true if **folio** is one of the permanent zero pages.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]j)}(h1``const struct folio *folio`` The folio to query h](j)}(h``const struct folio *folio``h]jS)}(hj+h]hconst struct folio *folio}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj%ubj)}(hhh]jM)}(hThe folio to queryh]hThe folio to query}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hM hjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hj"ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjfh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubjM)}(hBThis returns true if **folio** is one of the permanent zero pages.h](hThis returns true if }(hj|hhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh$ is one of the permanent zero pages.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_nr_pages (C function)c.folio_nr_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h8unsigned long folio_nr_pages (const struct folio *folio)h]h)}(h7unsigned long folio_nr_pages(const struct folio *folio)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMA ubj)}(h h]h }(hj̥hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj˥hMA ubj)}(hlongh]hlong}(hjڥhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj˥hMA ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj˥hMA ubh)}(hfolio_nr_pagesh]j)}(hfolio_nr_pagesh]hfolio_nr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj˥hMA ubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj1hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjQmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_nr_pagesasbuh1hhjubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj}hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj˥hMA ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj˥hMA ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj˥hMA hjhhubj4)}(hhh]jM)}(h!The number of pages in the folio.h]h!The number of pages in the folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMA hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj˥hMA ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj̦jHj̦jIjJjKuh1hhhhjhNhNubj)}(h`**Parameters** ``const struct folio *folio`` The folio. **Return** A positive power of two.h](jM)}(h**Parameters**h]j)}(hj֦h]h Parameters}(hjئhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԦubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhME hjЦubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMB hjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMB hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMB hjubah}(h]h ]h"]h$]h&]uh1jhjЦubjM)}(h **Return**h]j)}(hj0h]hReturn}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMD hjЦubjM)}(hA positive power of two.h]hA positive power of two.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMD hjЦubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_next (C function) c.folio_nexthNtauh1hhjhhhNhNubh)}(hhh](h)}(h/struct folio * folio_next (struct folio *folio)h]h)}(h-struct folio *folio_next(struct folio *folio)h](j5)}(hj8h]hstruct}(hjuhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjqhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM\ ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhM\ ubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl folio_nextsb c.folio_nextasbuh1hhjqhhhjhM\ ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhjhM\ ubjF )}(hjI h]h*}(hjçhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjqhhhjhM\ ubh)}(h folio_nexth]j)}(hjh]h folio_next}(hjԧhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjЧubah}(h]h ](jjeh"]h$]h&]jjuh1hhjqhhhjhM\ ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j c.folio_nextasbuh1hhjubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj9hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjqhhhjhM\ ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjmhhhjhM\ ubah}(h]jhah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM\ hjjhhubj4)}(hhh]jM)}(h Move to the next physical folio.h]h Move to the next physical folio.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM\ hjmhhubah}(h]h ]h"]h$]h&]uh1j3hjjhhhjhM\ ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXa**Parameters** ``struct folio *folio`` The folio we're currently operating on. **Description** If you have physically contiguous memory which may span more than one folio (eg a :c:type:`struct bio_vec `), use this function to move from one folio to the next. Do not use it if the memory is only virtually contiguous as the folios are almost certainly not adjacent to each other. This is the folio equivalent to writing ``page++``. **Context** We assume that the folios are refcounted and/or locked at a higher level and do not adjust the reference counts. **Return** The next struct folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM` hjubj)}(hhh]j)}(h@``struct folio *folio`` The folio we're currently operating on. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM] hjubj)}(hhh]jM)}(h'The folio we're currently operating on.h]h)The folio we’re currently operating on.}(hjʨhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjƨhM] hjǨubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjƨhM] hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM_ hjubjM)}(hXZIf you have physically contiguous memory which may span more than one folio (eg a :c:type:`struct bio_vec `), use this function to move from one folio to the next. Do not use it if the memory is only virtually contiguous as the folios are almost certainly not adjacent to each other. This is the folio equivalent to writing ``page++``.h](hRIf you have physically contiguous memory which may span more than one folio (eg a }(hjhhhNhNubh)}(h":c:type:`struct bio_vec `h]jS)}(hj h]hstruct bio_vec}(hjhhhNhNubah}(h]h ](jjAc-typeeh"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]refdocj( refdomainjAreftypetype refexplicitrefwarnjpj.j1bio_vecuh1hhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM^ hjubh), use this function to move from one folio to the next. Do not use it if the memory is only virtually contiguous as the folios are almost certainly not adjacent to each other. This is the folio equivalent to writing }(hjhhhNhNubjS)}(h ``page++``h]hpage++}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj)hM^ hjubjM)}(h **Context**h]j)}(hjHh]hContext}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMd hjubjM)}(hpWe assume that the folios are refcounted and/or locked at a higher level and do not adjust the reference counts.h]hpWe assume that the folios are refcounted and/or locked at a higher level and do not adjust the reference counts.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMe hjubjM)}(h **Return**h]j)}(hjoh]hReturn}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMh hjubjM)}(hThe next struct folio.h]hThe next struct folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMg hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_shift (C function) c.folio_shifthNtauh1hhjhhhNhNubh)}(hhh](h)}(h4unsigned int folio_shift (const struct folio *folio)h]h)}(h3unsigned int folio_shift(const struct folio *folio)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMo ubj)}(h h]h }(hjéhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj©hMo ubj)}(hinth]hint}(hjѩhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj©hMo ubj)}(h h]h }(hjߩhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj©hMo ubh)}(h folio_shifth]j)}(h folio_shifth]h folio_shift}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj©hMo ubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj5)}(hj8h]hstruct}(hj(hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hfolioh]hfolio}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjHmodnameN classnameNjpjs)}jv]jy)}jljsb c.folio_shiftasbuh1hhj ubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjthhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj©hMo ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj©hMo ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj©hMo hjhhubj4)}(hhh]jM)}(h/The size of the memory described by this folio.h]h/The size of the memory described by this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMo hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj©hMo ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjêjHjêjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio. **Description** A folio represents a number of bytes which is a power-of-two in size. This function tells you which power-of-two the folio is. See also folio_size() and folio_order(). **Context** The caller should have a reference on the folio to prevent it from being split. It is not necessary for the folio to be locked. **Return** The base-2 logarithm of the size of this folio.h](jM)}(h**Parameters**h]j)}(hjͪh]h Parameters}(hjϪhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˪ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMs hjǪubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMp hjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMp hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMp hjubah}(h]h ]h"]h$]h&]uh1jhjǪubjM)}(h**Description**h]j)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMr hjǪubjM)}(hA folio represents a number of bytes which is a power-of-two in size. This function tells you which power-of-two the folio is. See also folio_size() and folio_order().h]hA folio represents a number of bytes which is a power-of-two in size. This function tells you which power-of-two the folio is. See also folio_size() and folio_order().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMq hjǪubjM)}(h **Context**h]j)}(hjNh]hContext}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMu hjǪubjM)}(hThe caller should have a reference on the folio to prevent it from being split. It is not necessary for the folio to be locked.h]hThe caller should have a reference on the folio to prevent it from being split. It is not necessary for the folio to be locked.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMv hjǪubjM)}(h **Return**h]j)}(hjuh]hReturn}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMy hjǪubjM)}(h/The base-2 logarithm of the size of this folio.h]h/The base-2 logarithm of the size of this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMx hjǪubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_size (C function) c.folio_sizehNtauh1hhjhhhNhNubh)}(hhh](h)}(h-size_t folio_size (const struct folio *folio)h]h)}(h,size_t folio_size(const struct folio *folio)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl folio_sizesb c.folio_sizeasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hj߫hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjޫhM ubh)}(h folio_sizeh]j)}(hj۫h]h folio_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjޫhM ubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]j٫ c.folio_sizeasbuh1hhjubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjޫhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjޫhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjޫhM hjhhubj4)}(hhh]jM)}(hThe number of bytes in a folio.h]hThe number of bytes in a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjޫhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct folio *folio`` The folio. **Context** The caller should have a reference on the folio to prevent it from being split. It is not necessary for the folio to be locked. **Return** The number of bytes in this folio.h](jM)}(h**Parameters**h]j)}(hjʬh]h Parameters}(hj̬hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȬubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjĬubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjĬubjM)}(h **Context**h]j)}(hj$h]hContext}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjĬubjM)}(hThe caller should have a reference on the folio to prevent it from being split. It is not necessary for the folio to be locked.h]hThe caller should have a reference on the folio to prevent it from being split. It is not necessary for the folio to be locked.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjĬubjM)}(h **Return**h]j)}(hjKh]hReturn}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjĬubjM)}(h"The number of bytes in this folio.h]h"The number of bytes in this folio.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjĬubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&folio_maybe_mapped_shared (C function)c.folio_maybe_mapped_sharedhNtauh1hhjhhhNhNubh)}(hhh](h)}(h4bool folio_maybe_mapped_shared (struct folio *folio)h]h)}(h3bool folio_maybe_mapped_shared(struct folio *folio)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hfolio_maybe_mapped_sharedh]j)}(hfolio_maybe_mapped_sharedh]hfolio_maybe_mapped_shared}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj̭hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjȭubj)}(h h]h }(hj٭hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȭubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_maybe_mapped_sharedasbuh1hhjȭubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȭubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjȭubj)}(hfolioh]hfolio}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȭubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjĭubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(hDWhether the folio is mapped into the page tables of more than one MMh]hDWhether the folio is mapped into the page tables of more than one MM}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjLhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjgjHjgjIjJjKuh1hhhhjhNhNubj)}(hXd**Parameters** ``struct folio *folio`` The folio. **Description** This function checks if the folio maybe currently mapped into more than one MM ("maybe mapped shared"), or if the folio is certainly mapped into a single MM ("mapped exclusively"). For KSM folios, this function also returns "mapped shared" when a folio is mapped multiple times into the same MM, because the individual page mappings are independent. For small anonymous folios and anonymous hugetlb folios, the return value will be exactly correct: non-KSM folios can only be mapped at most once into an MM, and they cannot be partially mapped. KSM folios are considered shared even if mapped multiple times into the same MM. For other folios, the result can be fuzzy: #. For partially-mappable large folios (THP), the return value can wrongly indicate "mapped shared" (false positive) if a folio was mapped by more than two MMs at one point in time. #. For pagecache folios (including hugetlb), the return value can wrongly indicate "mapped shared" (false positive) when two VMAs in the same MM cover the same file range. Further, this function only considers current page table mappings that are tracked using the folio mapcount(s). This function does not consider: #. If the folio might get mapped in the (near) future (e.g., swapcache, pagecache, temporary unmapping for migration). #. If the folio is mapped differently (VM_PFNMAP). #. If hugetlb page table sharing applies. Callers might want to check hugetlb_pmd_shared(). **Return** Whether the folio is estimated to be mapped into more than one MM.h](jM)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjkubjM)}(h**Description**h]j)}(hjˮh]h Description}(hjͮhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɮubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubjM)}(hThis function checks if the folio maybe currently mapped into more than one MM ("maybe mapped shared"), or if the folio is certainly mapped into a single MM ("mapped exclusively").h]hThis function checks if the folio maybe currently mapped into more than one MM (“maybe mapped shared”), or if the folio is certainly mapped into a single MM (“mapped exclusively”).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubjM)}(hFor KSM folios, this function also returns "mapped shared" when a folio is mapped multiple times into the same MM, because the individual page mappings are independent.h]hFor KSM folios, this function also returns “mapped shared” when a folio is mapped multiple times into the same MM, because the individual page mappings are independent.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubjM)}(hXFor small anonymous folios and anonymous hugetlb folios, the return value will be exactly correct: non-KSM folios can only be mapped at most once into an MM, and they cannot be partially mapped. KSM folios are considered shared even if mapped multiple times into the same MM.h]hXFor small anonymous folios and anonymous hugetlb folios, the return value will be exactly correct: non-KSM folios can only be mapped at most once into an MM, and they cannot be partially mapped. KSM folios are considered shared even if mapped multiple times into the same MM.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubj)}(hhh]j)}(hXFor other folios, the result can be fuzzy: #. For partially-mappable large folios (THP), the return value can wrongly indicate "mapped shared" (false positive) if a folio was mapped by more than two MMs at one point in time. #. For pagecache folios (including hugetlb), the return value can wrongly indicate "mapped shared" (false positive) when two VMAs in the same MM cover the same file range. h](j)}(h*For other folios, the result can be fuzzy:h]h*For other folios, the result can be fuzzy:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]j/)}(hhh](j/)}(hFor partially-mappable large folios (THP), the return value can wrongly indicate "mapped shared" (false positive) if a folio was mapped by more than two MMs at one point in time.h]jM)}(hFor partially-mappable large folios (THP), the return value can wrongly indicate "mapped shared" (false positive) if a folio was mapped by more than two MMs at one point in time.h]hFor partially-mappable large folios (THP), the return value can wrongly indicate “mapped shared” (false positive) if a folio was mapped by more than two MMs at one point in time.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj*ubah}(h]h ]h"]h$]h&]uh1j/hj'ubj/)}(hFor pagecache folios (including hugetlb), the return value can wrongly indicate "mapped shared" (false positive) when two VMAs in the same MM cover the same file range. h]jM)}(hFor pagecache folios (including hugetlb), the return value can wrongly indicate "mapped shared" (false positive) when two VMAs in the same MM cover the same file range.h]hFor pagecache folios (including hugetlb), the return value can wrongly indicate “mapped shared” (false positive) when two VMAs in the same MM cover the same file range.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjCubah}(h]h ]h"]h$]h&]uh1j/hj'ubeh}(h]h ]h"]h$]h&]j>0j?0j@0hjA0jB0uh1j/hj$ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#hM hjubah}(h]h ]h"]h$]h&]uh1jhjkubjM)}(hoFurther, this function only considers current page table mappings that are tracked using the folio mapcount(s).h]hoFurther, this function only considers current page table mappings that are tracked using the folio mapcount(s).}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubj)}(hhh]j)}(hX-This function does not consider: #. If the folio might get mapped in the (near) future (e.g., swapcache, pagecache, temporary unmapping for migration). #. If the folio is mapped differently (VM_PFNMAP). #. If hugetlb page table sharing applies. Callers might want to check hugetlb_pmd_shared(). h](j)}(h This function does not consider:h]h This function does not consider:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]j/)}(hhh](j/)}(hsIf the folio might get mapped in the (near) future (e.g., swapcache, pagecache, temporary unmapping for migration).h]jM)}(hsIf the folio might get mapped in the (near) future (e.g., swapcache, pagecache, temporary unmapping for migration).h]hsIf the folio might get mapped in the (near) future (e.g., swapcache, pagecache, temporary unmapping for migration).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h/If the folio is mapped differently (VM_PFNMAP).h]jM)}(hjh]h/If the folio is mapped differently (VM_PFNMAP).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hYIf hugetlb page table sharing applies. Callers might want to check hugetlb_pmd_shared(). h]jM)}(hXIf hugetlb page table sharing applies. Callers might want to check hugetlb_pmd_shared().h]hXIf hugetlb page table sharing applies. Callers might want to check hugetlb_pmd_shared().}(hjԯhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjЯubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]j>0j?0j@0hjA0jB0uh1j/hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjkubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubjM)}(hBWhether the folio is estimated to be mapped into more than one MM.h]hBWhether the folio is estimated to be mapped into more than one MM.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%folio_expected_ref_count (C function)c.folio_expected_ref_counthNtauh1hhjhhhNhNubh)}(hhh](h)}(h8int folio_expected_ref_count (const struct folio *folio)h]h)}(h7int folio_expected_ref_count(const struct folio *folio)h](j)}(hinth]hint}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjVhM ubh)}(hfolio_expected_ref_counth]j)}(hfolio_expected_ref_counth]hfolio_expected_ref_count}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1hhjDhhhjVhM ubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljksbc.folio_expected_ref_countasbuh1hhjubj)}(h h]h }(hjްhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj}ubah}(h]h ]h"]h$]h&]jjuh1j hjDhhhjVhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj@hhhjVhM ubah}(h]j;ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjVhM hj=hhubj4)}(hhh]jM)}(h%calculate the expected folio refcounth]h%calculate the expected folio refcount}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj hhubah}(h]h ]h"]h$]h&]uh1j3hj=hhhjVhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj;jHj;jIjJjKuh1hhhhjhNhNubj)}(hX%**Parameters** ``const struct folio *folio`` the folio **Description** Calculate the expected folio refcount, taking references from the pagecache, swapcache, PG_private and page table mappings into account. Useful in combination with folio_ref_count() to detect unexpected references (e.g., GUP or other temporary references). Does currently not consider references from the LRU cache. If the folio was isolated from the LRU (which is the case during migration or split), the LRU cache does not apply. Calling this function on an unmapped folio -- !folio_mapped() -- that is locked will return a stable result. Calling this function on a mapped folio will not result in a stable result, because nothing stops additional page table mappings from coming (e.g., fork()) or going (e.g., munmap()). Calling this function without the folio lock will also not result in a stable result: for example, the folio might get dropped from the swapcache concurrently. However, even when called without the folio lock or on a mapped folio, this function can be used to detect unexpected references early (for example, if it makes sense to even lock the folio and unmap it). The caller must add any reference (e.g., from folio_try_get()) it might be holding itself to the result. **Return** the expected folio refcount.h](jM)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubj)}(hhh]j)}(h(``const struct folio *folio`` the folio h](j)}(h``const struct folio *folio``h]jS)}(hjdh]hconst struct folio *folio}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj^ubj)}(hhh]jM)}(h the folioh]h the folio}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhM hjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhM hj[ubah}(h]h ]h"]h$]h&]uh1jhj?ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hXCalculate the expected folio refcount, taking references from the pagecache, swapcache, PG_private and page table mappings into account. Useful in combination with folio_ref_count() to detect unexpected references (e.g., GUP or other temporary references).h]hXCalculate the expected folio refcount, taking references from the pagecache, swapcache, PG_private and page table mappings into account. Useful in combination with folio_ref_count() to detect unexpected references (e.g., GUP or other temporary references).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hDoes currently not consider references from the LRU cache. If the folio was isolated from the LRU (which is the case during migration or split), the LRU cache does not apply.h]hDoes currently not consider references from the LRU cache. If the folio was isolated from the LRU (which is the case during migration or split), the LRU cache does not apply.}(hjıhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hlCalling this function on an unmapped folio -- !folio_mapped() -- that is locked will return a stable result.h]hlCalling this function on an unmapped folio -- !folio_mapped() -- that is locked will return a stable result.}(hjӱhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hCalling this function on a mapped folio will not result in a stable result, because nothing stops additional page table mappings from coming (e.g., fork()) or going (e.g., munmap()).h]hCalling this function on a mapped folio will not result in a stable result, because nothing stops additional page table mappings from coming (e.g., fork()) or going (e.g., munmap()).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hCalling this function without the folio lock will also not result in a stable result: for example, the folio might get dropped from the swapcache concurrently.h]hCalling this function without the folio lock will also not result in a stable result: for example, the folio might get dropped from the swapcache concurrently.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hHowever, even when called without the folio lock or on a mapped folio, this function can be used to detect unexpected references early (for example, if it makes sense to even lock the folio and unmap it).h]hHowever, even when called without the folio lock or on a mapped folio, this function can be used to detect unexpected references early (for example, if it makes sense to even lock the folio and unmap it).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hhThe caller must add any reference (e.g., from folio_try_get()) it might be holding itself to the result.h]hhThe caller must add any reference (e.g., from folio_try_get()) it might be holding itself to the result.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(h **Return**h]j)}(hj h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubjM)}(hthe expected folio refcount.h]hthe expected folio refcount.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hzap_vma (C function) c.zap_vmahNtauh1hhjhhhNhNubh)}(hhh](h)}(h)void zap_vma (struct vm_area_struct *vma)h]h)}(h(void zap_vma(struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM ubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjshM ubh)}(hzap_vmah]j)}(hzap_vmah]hzap_vma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjahhhjshM ubj )}(h(struct vm_area_struct *vma)h]j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj²modnameN classnameNjpjs)}jv]jy)}jljsb c.zap_vmaasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjahhhjshM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj]hhhjshM ubah}(h]jXah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjshM hjZhhubj4)}(hhh]jM)}(h#zap all page table entries in a vmah]h#zap all page table entries in a vma}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj"hhubah}(h]h ]h"]h$]h&]uh1j3hjZhhhjshM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj=jHj=jIjJjKuh1hhhhjhNhNubj)}(h@**Parameters** ``struct vm_area_struct *vma`` The vma to zap.h](jM)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjAubj)}(hhh]j)}(h.``struct vm_area_struct *vma`` The vma to zap.h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjfh]hstruct vm_area_struct *vma}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjdubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj`ubj)}(hhh]jM)}(hThe vma to zap.h]hThe vma to zap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hj|ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj{hM hj]ubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hptdesc_address (C function)c.ptdesc_addresshNtauh1hhjhhhNhNubh)}(hhh](h)}(h/void * ptdesc_address (const struct ptdesc *pt)h]h)}(h-void *ptdesc_address(const struct ptdesc *pt)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjϳhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjγhMubjF )}(hjI h]h*}(hjݳhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjγhMubh)}(hptdesc_addressh]j)}(hptdesc_addressh]hptdesc_address}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjγhMubj )}(h(const struct ptdesc *pt)h]j )}(hconst struct ptdesc *pth](j5)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj%hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hptdesch]hptdesc}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jy)}jljsbc.ptdesc_addressasbuh1hhjubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpth]hpt}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjγhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjγhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjγhMhjhhubj4)}(hhh]jM)}(hVirtual address of page table.h]hVirtual address of page table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjγhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct ptdesc *pt`` Page table descriptor. **Return** The first byte of the page table described by **pt**.h](jM)}(h**Parameters**h]j)}(hjʴh]h Parameters}(hj̴hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjȴubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjĴubj)}(hhh]j)}(h3``const struct ptdesc *pt`` Page table descriptor. h](j)}(h``const struct ptdesc *pt``h]jS)}(hjh]hconst struct ptdesc *pt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hPage table descriptor.h]hPage table descriptor.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjĴubjM)}(h **Return**h]j)}(hj$h]hReturn}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjĴubjM)}(h5The first byte of the page table described by **pt**.h](h.The first byte of the page table described by }(hj:hhhNhNubj)}(h**pt**h]hpt}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjĴubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hptdesc_set_kernel (C function)c.ptdesc_set_kernelhNtauh1hhjhhhNhNubh)}(hhh](h)}(h.void ptdesc_set_kernel (struct ptdesc *ptdesc)h]h)}(h-void ptdesc_set_kernel(struct ptdesc *ptdesc)h](j)}(hvoidh]hvoid}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhjhMubh)}(hptdesc_set_kernelh]j)}(hptdesc_set_kernelh]hptdesc_set_kernel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjwhhhjhMubj )}(h(struct ptdesc *ptdesc)h]j )}(hstruct ptdesc *ptdesch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjŵhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hptdesch]hptdesc}(hjֵhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjӵubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjصmodnameN classnameNjpjs)}jv]jy)}jljsbc.ptdesc_set_kernelasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hptdesch]hptdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjwhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjshhhjhMubah}(h]jnah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjphhubj4)}(hhh]jM)}(h$Mark a ptdesc used to map the kernelh]h$Mark a ptdesc used to map the kernel}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj8hhubah}(h]h ]h"]h$]h&]uh1j3hjphhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjSjHjSjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct ptdesc *ptdesc`` The ptdesc to be marked **Description** Kernel page tables often need special handling. Set a flag so that the handling code knows this ptdesc will not be used for userspace.h](jM)}(h**Parameters**h]j)}(hj]h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjWubj)}(hhh]j)}(h2``struct ptdesc *ptdesc`` The ptdesc to be marked h](j)}(h``struct ptdesc *ptdesc``h]jS)}(hj|h]hstruct ptdesc *ptdesc}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjvubj)}(hhh]jM)}(hThe ptdesc to be markedh]hThe ptdesc to be marked}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjhMhjsubah}(h]h ]h"]h$]h&]uh1jhjWubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjWubjM)}(hKernel page tables often need special handling. Set a flag so that the handling code knows this ptdesc will not be used for userspace.h]hKernel page tables often need special handling. Set a flag so that the handling code knows this ptdesc will not be used for userspace.}(hjͶhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h ptdesc_clear_kernel (C function)c.ptdesc_clear_kernelhNtauh1hhjhhhNhNubh)}(hhh](h)}(h0void ptdesc_clear_kernel (struct ptdesc *ptdesc)h]h)}(h/void ptdesc_clear_kernel(struct ptdesc *ptdesc)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubh)}(hptdesc_clear_kernelh]j)}(hptdesc_clear_kernelh]hptdesc_clear_kernel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMubj )}(h(struct ptdesc *ptdesc)h]j )}(hstruct ptdesc *ptdesch](j5)}(hj8h]hstruct}(hj9hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj5ubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubh)}(hhh]j)}(hptdesch]hptdesc}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjYmodnameN classnameNjpjs)}jv]jy)}jljsbc.ptdesc_clear_kernelasbuh1hhj5ubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj5ubj)}(hptdesch]hptdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhjhhubj4)}(hhh]jM)}(h1Mark a ptdesc as no longer used to map the kernelh]h1Mark a ptdesc as no longer used to map the kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjԷjHjԷjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct ptdesc *ptdesc`` The ptdesc to be unmarked **Description** Use when the ptdesc is no longer used to map the kernel and no longer needs special handling.h](jM)}(h**Parameters**h]j)}(hj޷h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjܷubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjطubj)}(hhh]j)}(h4``struct ptdesc *ptdesc`` The ptdesc to be unmarked h](j)}(h``struct ptdesc *ptdesc``h]jS)}(hjh]hstruct ptdesc *ptdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hThe ptdesc to be unmarkedh]hThe ptdesc to be unmarked}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjطubjM)}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjطubjM)}(h]Use when the ptdesc is no longer used to map the kernel and no longer needs special handling.h]h]Use when the ptdesc is no longer used to map the kernel and no longer needs special handling.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjطubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hptdesc_test_kernel (C function)c.ptdesc_test_kernelhNtauh1hhjhhhNhNubh)}(hhh](h)}(h5bool ptdesc_test_kernel (const struct ptdesc *ptdesc)h]h)}(h4bool ptdesc_test_kernel(const struct ptdesc *ptdesc)h](j)}(hj-h]hbool}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMubh)}(hptdesc_test_kernelh]j)}(hptdesc_test_kernelh]hptdesc_test_kernel}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjyhhhjhMubj )}(h(const struct ptdesc *ptdesc)h]j )}(hconst struct ptdesc *ptdesch](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjƸhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjԸhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hptdesch]hptdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.ptdesc_test_kernelasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hptdesch]hptdesc}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjyhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjuhhhjhMubah}(h]jpah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjrhhubj4)}(hhh]jM)}(h+Check if a ptdesc is used to map the kernelh]h+Check if a ptdesc is used to map the kernel}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjThhubah}(h]h ]h"]h$]h&]uh1j3hjrhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjojHjojIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct ptdesc *ptdesc`` The ptdesc being tested **Description** Call to tell if the ptdesc used to map the kernel.h](jM)}(h**Parameters**h]j)}(hjyh]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjsubj)}(hhh]j)}(h8``const struct ptdesc *ptdesc`` The ptdesc being tested h](j)}(h``const struct ptdesc *ptdesc``h]jS)}(hjh]hconst struct ptdesc *ptdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hThe ptdesc being testedh]hThe ptdesc being tested}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjsubjM)}(h**Description**h]j)}(hjӹh]h Description}(hjչhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѹubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjsubjM)}(h2Call to tell if the ptdesc used to map the kernel.h]h2Call to tell if the ptdesc used to map the kernel.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjsubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpagetable_alloc (C function)c.pagetable_allochNtauh1hhjhhhNhNubh)}(hhh](h)}(h?struct ptdesc * pagetable_alloc (gfp_t gfp, unsigned int order)h]h)}(h=struct ptdesc *pagetable_alloc(gfp_t gfp, unsigned int order)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj%hMubh)}(hhh]j)}(hptdesch]hptdesc}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]jy)}jlpagetable_allocsbc.pagetable_allocasbuh1hhjhhhj%hMubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj%hMubjF )}(hjI h]h*}(hjfhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj%hMubh)}(hpagetable_alloch]j)}(hjUh]hpagetable_alloc}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj%hMubj )}(h(gfp_t gfp, unsigned int order)h](j )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jSc.pagetable_allocasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int orderh](j)}(hunsignedh]hunsigned}(hjںhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֺubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֺubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֺubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֺubj)}(horderh]horder}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjֺubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj%hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj%hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%hMhj hhubj4)}(hhh]jM)}(hAllocate pagetablesh]hAllocate pagetables}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj9hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj%hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjTjHjTjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``gfp_t gfp`` GFP flags ``unsigned int order`` desired pagetable order **Description** pagetable_alloc allocates memory for page tables as well as a page table descriptor to describe that memory. **Return** The ptdesc describing the allocated page tables.h](jM)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjXubj)}(hhh](j)}(h``gfp_t gfp`` GFP flags h](j)}(h ``gfp_t gfp``h]jS)}(hj}h]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj{ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjwubj)}(hhh]jM)}(h GFP flagsh]h GFP flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhjtubj)}(h/``unsigned int order`` desired pagetable order h](j)}(h``unsigned int order``h]jS)}(hjh]hunsigned int order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hdesired pagetable orderh]hdesired pagetable order}(hjϻhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj˻hMhj̻ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj˻hMhjtubeh}(h]h ]h"]h$]h&]uh1jhjXubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjXubjM)}(hlpagetable_alloc allocates memory for page tables as well as a page table descriptor to describe that memory.h]hlpagetable_alloc allocates memory for page tables as well as a page table descriptor to describe that memory.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjXubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjXubjM)}(h0The ptdesc describing the allocated page tables.h]h0The ptdesc describing the allocated page tables.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpagetable_free (C function)c.pagetable_freehNtauh1hhjhhhNhNubh)}(hhh](h)}(h'void pagetable_free (struct ptdesc *pt)h]h)}(h&void pagetable_free(struct ptdesc *pt)h](j)}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhjkhMubh)}(hpagetable_freeh]j)}(hpagetable_freeh]hpagetable_free}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ](jjeh"]h$]h&]jjuh1hhjYhhhjkhMubj )}(h(struct ptdesc *pt)h]j )}(hstruct ptdesc *pth](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hptdesch]hptdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.pagetable_freeasbuh1hhjubj)}(h h]h }(hjؼhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpth]hpt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjYhhhjkhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjUhhhjkhMubah}(h]jPah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjkhMhjRhhubj4)}(hhh]jM)}(hFree pagetablesh]hFree pagetables}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjRhhhjkhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj5jHj5jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct ptdesc *pt`` The page table descriptor **Description** pagetable_free frees the memory of all page tables described by a page table descriptor and the memory for the descriptor itself.h](jM)}(h**Parameters**h]j)}(hj?h]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj9ubj)}(hhh]j)}(h0``struct ptdesc *pt`` The page table descriptor h](j)}(h``struct ptdesc *pt``h]jS)}(hj^h]hstruct ptdesc *pt}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjXubj)}(hhh]jM)}(hThe page table descriptorh]hThe page table descriptor}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjshMhjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjUubah}(h]h ]h"]h$]h&]uh1jhj9ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj9ubjM)}(hpagetable_free frees the memory of all page tables described by a page table descriptor and the memory for the descriptor itself.h]hpagetable_free frees the memory of all page tables described by a page table descriptor and the memory for the descriptor itself.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvma_lookup (C function) c.vma_lookuphNtauh1hhjhhhNhNubh)}(hhh](h)}(hMstruct vm_area_struct * vma_lookup (struct mm_struct *mm, unsigned long addr)h]h)}(hKstruct vm_area_struct *vma_lookup(struct mm_struct *mm, unsigned long addr)h](j5)}(hj8h]hstruct}(hj޽hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjڽhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڽhhhjhMubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl vma_lookupsb c.vma_lookupasbuh1hhjڽhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڽhhhjhMubjF )}(hjI h]h*}(hj,hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjڽhhhjhMubh)}(h vma_lookuph]j)}(hjh]h vma_lookup}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjڽhhhjhMubj )}(h*(struct mm_struct *mm, unsigned long addr)h](j )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjXhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjTubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjxmodnameN classnameNjpjs)}jv]j c.vma_lookupasbuh1hhjTubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjTubj)}(hmmh]hmm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjȾhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjľubj)}(h h]h }(hj־hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjľubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjľubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjľubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjľubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubeh}(h]h ]h"]h$]h&]jjuh1j hjڽhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjֽhhhjhMubah}(h]jѽah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjӽhhubj4)}(hhh]jM)}(h Find a VMA at a specific addressh]h Find a VMA at a specific address}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj'hhubah}(h]h ]h"]h$]h&]uh1j3hjӽhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjBjHjBjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mm_struct *mm`` The process address space. ``unsigned long addr`` The user address. **Return** The vm_area_struct at the given address, ``NULL`` otherwise.h](jM)}(h**Parameters**h]j)}(hjLh]h Parameters}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjFubj)}(hhh](j)}(h4``struct mm_struct *mm`` The process address space. h](j)}(h``struct mm_struct *mm``h]jS)}(hjkh]hstruct mm_struct *mm}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjeubj)}(hhh]jM)}(hThe process address space.h]hThe process address space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjhMhjbubj)}(h)``unsigned long addr`` The user address. h](j)}(h``unsigned long addr``h]jS)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hThe user address.h]hThe user address.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjbubeh}(h]h ]h"]h$]h&]uh1jhjFubjM)}(h **Return**h]j)}(hj߿h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݿubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjFubjM)}(hvm_start >> PAGE_SHIFT, if faulted then the virtual page offset at the time of first fault. If **vma** is a MAP_PRIVATE file-backed mapping, then this returns the page offset within the file. Edge cases: nommu does not abide by these, MAP_PRIVATE-/dev/zero satisfies vma_is_anonymous() but has file-backed page offset, and MAP_PRIVATE-pfnmap regions have their page offset set to the first PFN in the range. **Return** The page offset of the start of **vma**.h](jM)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM3hjNubj)}(hhh]j)}(hL``const struct vm_area_struct *vma`` The VMA whose page offset is required. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjsh]h const struct vm_area_struct *vma}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjqubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM0hjmubj)}(hhh]jM)}(h&The VMA whose page offset is required.h]h&The VMA whose page offset is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM0hjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhM0hjjubah}(h]h ]h"]h$]h&]uh1jhjNubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM2hjNubjM)}(hAIf the VMA is file-backed, this is the page offset into the file.h]hAIf the VMA is file-backed, this is the page offset into the file.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM1hjNubjM)}(hIf **vma** is anonymous, this is the virtual page offset of the start of the VMA - if unfaulted, then vma->vm_start >> PAGE_SHIFT, if faulted then the virtual page offset at the time of first fault.h](hIf }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is anonymous, this is the virtual page offset of the start of the VMA - if unfaulted, then vma->vm_start >> PAGE_SHIFT, if faulted then the virtual page offset at the time of first fault.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM3hjNubjM)}(hcIf **vma** is a MAP_PRIVATE file-backed mapping, then this returns the page offset within the file.h](hIf }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhY is a MAP_PRIVATE file-backed mapping, then this returns the page offset within the file.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM7hjNubjM)}(hEdge cases: nommu does not abide by these, MAP_PRIVATE-/dev/zero satisfies vma_is_anonymous() but has file-backed page offset, and MAP_PRIVATE-pfnmap regions have their page offset set to the first PFN in the range.h]hEdge cases: nommu does not abide by these, MAP_PRIVATE-/dev/zero satisfies vma_is_anonymous() but has file-backed page offset, and MAP_PRIVATE-pfnmap regions have their page offset set to the first PFN in the range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM:hjNubjM)}(h **Return**h]j)}(hj&h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM>hjNubjM)}(h(The page offset of the start of **vma**.h](h The page offset of the start of }(hj<hhhNhNubj)}(h**vma**h]hvma}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM?hjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvma_end_pgoff (C function)c.vma_end_pgoffhNtauh1hhjhhhNhNubh)}(hhh](h)}(h8pgoff_t vma_end_pgoff (const struct vm_area_struct *vma)h]h)}(h7pgoff_t vma_end_pgoff(const struct vm_area_struct *vma)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl vma_end_pgoffsbc.vma_end_pgoffasbuh1hhjyhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMGubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMGubh)}(h vma_end_pgoffh]j)}(hjh]h vma_end_pgoff}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjyhhhjhMGubj )}(h"(const struct vm_area_struct *vma)h]j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jc.vma_end_pgoffasbuh1hhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj4hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjyhhhjhMGubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjuhhhjhMGubah}(h]jpah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMGhjrhhubj4)}(hhh]jM)}(h3Get the page offset of the exclusive end of **vma**h](h,Get the page offset of the exclusive end of }(hjkhhhNhNubj)}(h**vma**h]hvma}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMGhjhhhubah}(h]h ]h"]h$]h&]uh1j3hjrhhhjhMGubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXe**Parameters** ``const struct vm_area_struct *vma`` The VMA whose end page offset is required. **Description** This returns the exclusive end page offset of **vma**, which is useful for expressing page offset ranges. See the description of vma_start_pgoff() for a description of VMA page offsets. **Return** The exclusive end page offset of **vma**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMKhjubj)}(hhh]j)}(hP``const struct vm_area_struct *vma`` The VMA whose end page offset is required. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjh]h const struct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMHhjubj)}(hhh]jM)}(h*The VMA whose end page offset is required.h]h*The VMA whose end page offset is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMHhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMHhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMJhjubjM)}(hiThis returns the exclusive end page offset of **vma**, which is useful for expressing page offset ranges.h](h.This returns the exclusive end page offset of }(hj hhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh4, which is useful for expressing page offset ranges.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMIhjubjM)}(hOSee the description of vma_start_pgoff() for a description of VMA page offsets.h]hOSee the description of vma_start_pgoff() for a description of VMA page offsets.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMLhjubjM)}(h **Return**h]j)}(hj=h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMOhjubjM)}(h)The exclusive end page offset of **vma**.h](h!The exclusive end page offset of }(hjShhhNhNubj)}(h**vma**h]hvma}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh.}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvma_last_pgoff (C function)c.vma_last_pgoffhNtauh1hhjhhhNhNubh)}(hhh](h)}(h9pgoff_t vma_last_pgoff (const struct vm_area_struct *vma)h]h)}(h8pgoff_t vma_last_pgoff(const struct vm_area_struct *vma)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvma_last_pgoffsbc.vma_last_pgoffasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMXubh)}(hvma_last_pgoffh]j)}(hjh]hvma_last_pgoff}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMXubj )}(h"(const struct vm_area_struct *vma)h]j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj!modnameN classnameNjpjs)}jv]jc.vma_last_pgoffasbuh1hhjubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjKhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMXubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMXubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMXhjhhubj4)}(hhh]jM)}(h/Get the page offset of the last page in **vma**h](h(Get the page offset of the last page in }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMXhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMXubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX/**Parameters** ``const struct vm_area_struct *vma`` The VMA whose last page offset is required. **Description** This returns the last page offset contained within **vma**. See the description of vma_start_pgoff() for a description of VMA page offsets. **Return** The last page offset of **vma**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM\hjubj)}(hhh]j)}(hQ``const struct vm_area_struct *vma`` The VMA whose last page offset is required. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjh]h const struct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMYhjubj)}(hhh]jM)}(h+The VMA whose last page offset is required.h]h+The VMA whose last page offset is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM[hjubjM)}(h;This returns the last page offset contained within **vma**.h](h3This returns the last page offset contained within }(hj"hhhNhNubj)}(h**vma**h]hvma}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMZhjubjM)}(hOSee the description of vma_start_pgoff() for a description of VMA page offsets.h]hOSee the description of vma_start_pgoff() for a description of VMA page offsets.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM\hjubjM)}(h **Return**h]j)}(hjTh]hReturn}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM_hjubjM)}(h The last page offset of **vma**.h](hThe last page offset of }(hjjhhhNhNubj)}(h**vma**h]hvma}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM`hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!vma_start_anon_pgoff (C function)c.vma_start_anon_pgoffhNtauh1hhjhhhNhNubh)}(hhh](h)}(h?pgoff_t vma_start_anon_pgoff (const struct vm_area_struct *vma)h]h)}(h>pgoff_t vma_start_anon_pgoff(const struct vm_area_struct *vma)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvma_start_anon_pgoffsbc.vma_start_anon_pgoffasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMhubh)}(hvma_start_anon_pgoffh]j)}(hjh]hvma_start_anon_pgoff}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMhubj )}(h"(const struct vm_area_struct *vma)h]j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]jc.vma_start_anon_pgoffasbuh1hhjubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjbhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMhubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMhubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhhjhhubj4)}(hhh]jM)}(h5Get the anonymous page offset of the start of **vma**h](h.Get the anonymous page offset of the start of }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMhubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct vm_area_struct *vma`` The VMA whose anonymous page offset is required. **Description** If unfaulted, then this is vma->vm_start >> PAGE_SHIFT, if faulted then the anonymous page offset at the time of first fault. If the VMA is anonymous, this returns the same value as vma_start_pgoff(). This value is used for tracking MAP_PRIVATE file-backed mappings by their anonymous page offset. **Return** The anonymous page offset of the start of **vma**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMlhjubj)}(hhh]j)}(hV``const struct vm_area_struct *vma`` The VMA whose anonymous page offset is required. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjh]h const struct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMihjubj)}(hhh]jM)}(h0The VMA whose anonymous page offset is required.h]h0The VMA whose anonymous page offset is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMihjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMihjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj#h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMkhjubjM)}(h}If unfaulted, then this is vma->vm_start >> PAGE_SHIFT, if faulted then the anonymous page offset at the time of first fault.h]h}If unfaulted, then this is vma->vm_start >> PAGE_SHIFT, if faulted then the anonymous page offset at the time of first fault.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMjhjubjM)}(hJIf the VMA is anonymous, this returns the same value as vma_start_pgoff().h]hJIf the VMA is anonymous, this returns the same value as vma_start_pgoff().}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMmhjubjM)}(h`This value is used for tracking MAP_PRIVATE file-backed mappings by their anonymous page offset.h]h`This value is used for tracking MAP_PRIVATE file-backed mappings by their anonymous page offset.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMohjubjM)}(h **Return**h]j)}(hjhh]hReturn}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMrhjubjM)}(h2The anonymous page offset of the start of **vma**.h](h*The anonymous page offset of the start of }(hj~hhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh.}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMshjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvma_end_anon_pgoff (C function)c.vma_end_anon_pgoffhNtauh1hhjhhhNhNubh)}(hhh](h)}(h=pgoff_t vma_end_anon_pgoff (const struct vm_area_struct *vma)h]h)}(hGet the anonymous page offset of the exclusive end of **vma**.h](h6Get the anonymous page offset of the exclusive end of }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct vm_area_struct *vma`` The VMA whose end anonymous page offset is required. **Description** This returns the anonymous exclusive end page offset of **vma**, which is useful for expressing page offset ranges. See the description of vma_start_anon_pgoff() for a description of VMA anonymous page offsets. **Return** The exclusive end anonymous page offset of **vma**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(hZ``const struct vm_area_struct *vma`` The VMA whose end anonymous page offset is required. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjh]h const struct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h4The VMA whose end anonymous page offset is required.h]h4The VMA whose end anonymous page offset is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hsThis returns the anonymous exclusive end page offset of **vma**, which is useful for expressing page offset ranges.h](h8This returns the anonymous exclusive end page offset of }(hjQhhhNhNubj)}(h**vma**h]hvma}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubh4, which is useful for expressing page offset ranges.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h^See the description of vma_start_anon_pgoff() for a description of VMA anonymous page offsets.h]h^See the description of vma_start_anon_pgoff() for a description of VMA anonymous page offsets.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h3The exclusive end anonymous page offset of **vma**.h](h+The exclusive end anonymous page offset of }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h vma_last_anon_pgoff (C function)c.vma_last_anon_pgoffhNtauh1hhjhhhNhNubh)}(hhh](h)}(h>pgoff_t vma_last_anon_pgoff (const struct vm_area_struct *vma)h]h)}(h=pgoff_t vma_last_anon_pgoff(const struct vm_area_struct *vma)h](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvma_last_anon_pgoffsbc.vma_last_anon_pgoffasbuh1hhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hvma_last_anon_pgoffh]j)}(hjh]hvma_last_anon_pgoff}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h"(const struct vm_area_struct *vma)h]j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hj,hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj5)}(hj8h]hstruct}(hjGhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjgmodnameN classnameNjpjs)}jv]jc.vma_last_anon_pgoffasbuh1hhj(ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(ubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h:Get the anonymous page offset of the last page in **vma**.h](h2Get the anonymous page offset of the last page in }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct vm_area_struct *vma`` The VMA whose last anonymous page offset is required. **Description** See the description of vma_start_anon_pgoff() for a description of VMA anonymous page offsets. **Return** The last anonymous page offset of **vma**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]j)}(h[``const struct vm_area_struct *vma`` The VMA whose last anonymous page offset is required. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjh]h const struct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h5The VMA whose last anonymous page offset is required.h]h5The VMA whose last anonymous page offset is required.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj0hMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h^See the description of vma_start_anon_pgoff() for a description of VMA anonymous page offsets.h]h^See the description of vma_start_anon_pgoff() for a description of VMA anonymous page offsets.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h **Return**h]j)}(hj}h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h*The last anonymous page offset of **vma**.h](h"The last anonymous page offset of }(hjhhhNhNubj)}(h**vma**h]hvma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmmap_action_remap (C function)c.mmap_action_remaphNtauh1hhjhhhNhNubh)}(hhh](h)}(htvoid mmap_action_remap (struct vm_area_desc *desc, unsigned long start, unsigned long start_pfn, unsigned long size)h]h)}(hsvoid mmap_action_remap(struct vm_area_desc *desc, unsigned long start, unsigned long start_pfn, unsigned long size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmmap_action_remaph]j)}(hmmap_action_remaph]hmmap_action_remap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h](struct vm_area_desc *desc, unsigned long start, unsigned long start_pfn, unsigned long size)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1modnameN classnameNjpjs)}jv]jy)}jljsbc.mmap_action_remapasbuh1hhj ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj]hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hdesch]hdesc}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long starth](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)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long start_pfnh](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)}(h start_pfnh]h start_pfn}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long sizeh](j)}(hunsignedh]hunsigned}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hlongh]hlong}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hsizeh]hsize}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hJhelper for mmap_prepare hook to specify that a pure PFN remap is required.h]hJhelper for mmap_prepare hook to specify that a pure PFN remap is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXq**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. ``unsigned long start`` The virtual address to start the remap from, must be within the VMA. ``unsigned long start_pfn`` The first PFN in the range to remap. ``unsigned long size`` The size of the range to remap, in bytes, at most spanning to the end of the VMA.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh](j)}(hN``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hjh]hstruct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h/The VMA descriptor for the VMA requiring remap.h]h/The VMA descriptor for the VMA requiring remap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h]``unsigned long start`` The virtual address to start the remap from, must be within the VMA. h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hDThe virtual address to start the remap from, must be within the VMA.h]hDThe virtual address to start the remap from, must be within the VMA.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``unsigned long start_pfn`` The first PFN in the range to remap. h](j)}(h``unsigned long start_pfn``h]jS)}(hj:h]hunsigned long start_pfn}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj8ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj4ubj)}(hhh]jM)}(h$The first PFN in the range to remap.h]h$The first PFN in the range to remap.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjOhMhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhMhjubj)}(hh``unsigned long size`` The size of the range to remap, in bytes, at most spanning to the end of the VMA.h](j)}(h``unsigned long size``h]jS)}(hjsh]hunsigned long size}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjqubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjmubj)}(hhh]jM)}(hQThe size of the range to remap, in bytes, at most spanning to the end of the VMA.h]hQThe size of the range to remap, in bytes, at most spanning to the end of the VMA.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#mmap_action_remap_full (C function)c.mmap_action_remap_fullhNtauh1hhjhhhNhNubh)}(hhh](h)}(hPvoid mmap_action_remap_full (struct vm_area_desc *desc, unsigned long start_pfn)h]h)}(hOvoid mmap_action_remap_full(struct vm_area_desc *desc, unsigned long start_pfn)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmmap_action_remap_fullh]j)}(hmmap_action_remap_fullh]hmmap_action_remap_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h4(struct vm_area_desc *desc, unsigned long start_pfn)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]jy)}jljsbc.mmap_action_remap_fullasbuh1hhjubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjUhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long start_pfnh](j)}(hunsignedh]hunsigned}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(h start_pfnh]h start_pfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hZhelper for mmap_prepare hook to specify that the entirety of a VMA should be PFN remapped.h]hZhelper for mmap_prepare hook to specify that the entirety of a VMA should be PFN remapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. ``unsigned long start_pfn`` The first PFN in the range to remap.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh](j)}(hN``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hjh]hstruct vm_area_desc *desc}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h/The VMA descriptor for the VMA requiring remap.h]h/The VMA descriptor for the VMA requiring remap.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjubj)}(h@``unsigned long start_pfn`` The first PFN in the range to remap.h](j)}(h``unsigned long start_pfn``h]jS)}(hjWh]hunsigned long start_pfn}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjQubj)}(hhh]jM)}(h$The first PFN in the range to remap.h]h$The first PFN in the range to remap.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h mmap_action_ioremap (C function)c.mmap_action_ioremaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hvvoid mmap_action_ioremap (struct vm_area_desc *desc, unsigned long start, unsigned long start_pfn, unsigned long size)h]h)}(huvoid mmap_action_ioremap(struct vm_area_desc *desc, unsigned long start, unsigned long start_pfn, unsigned long size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmmap_action_ioremaph]j)}(hmmap_action_ioremaph]hmmap_action_ioremap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h](struct vm_area_desc *desc, unsigned long start, unsigned long start_pfn, unsigned long size)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mmap_action_ioremapasbuh1hhjubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long starth](j)}(hunsignedh]hunsigned}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hlongh]hlong}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long start_pfnh](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)}(h start_pfnh]h start_pfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long sizeh](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)}(hsizeh]hsize}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hNhelper for mmap_prepare hook to specify that a pure PFN I/O remap is required.h]hNhelper for mmap_prepare hook to specify that a pure PFN I/O remap is required.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjahhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj|jHj|jIjJjKuh1hhhhjhNhNubj)}(hXq**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. ``unsigned long start`` The virtual address to start the remap from, must be within the VMA. ``unsigned long start_pfn`` The first PFN in the range to remap. ``unsigned long size`` The size of the range to remap, in bytes, at most spanning to the end of the VMA.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh](j)}(hN``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hjh]hstruct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h/The VMA descriptor for the VMA requiring remap.h]h/The VMA descriptor for the VMA requiring remap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h]``unsigned long start`` The virtual address to start the remap from, must be within the VMA. h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hDThe virtual address to start the remap from, must be within the VMA.h]hDThe virtual address to start the remap from, must be within the VMA.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``unsigned long start_pfn`` The first PFN in the range to remap. h](j)}(h``unsigned long start_pfn``h]jS)}(hjh]hunsigned long start_pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h$The first PFN in the range to remap.h]h$The first PFN in the range to remap.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMhj-ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj,hMhjubj)}(hh``unsigned long size`` The size of the range to remap, in bytes, at most spanning to the end of the VMA.h](j)}(h``unsigned long size``h]jS)}(hjPh]hunsigned long size}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjNubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjJubj)}(hhh]jM)}(hQThe size of the range to remap, in bytes, at most spanning to the end of the VMA.h]hQThe size of the range to remap, in bytes, at most spanning to the end of the VMA.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjehMhjfubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjehMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%mmap_action_ioremap_full (C function)c.mmap_action_ioremap_fullhNtauh1hhjhhhNhNubh)}(hhh](h)}(hRvoid mmap_action_ioremap_full (struct vm_area_desc *desc, unsigned long start_pfn)h]h)}(hQvoid mmap_action_ioremap_full(struct vm_area_desc *desc, unsigned long start_pfn)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmmap_action_ioremap_fullh]j)}(hmmap_action_ioremap_fullh]hmmap_action_ioremap_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h4(struct vm_area_desc *desc, unsigned long start_pfn)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mmap_action_ioremap_fullasbuh1hhjubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj2hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long start_pfnh](j)}(hunsignedh]hunsigned}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hlongh]hlong}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(h start_pfnh]h start_pfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h^helper for mmap_prepare hook to specify that the entirety of a VMA should be PFN I/O remapped.h]h^helper for mmap_prepare hook to specify that the entirety of a VMA should be PFN I/O remapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. ``unsigned long start_pfn`` The first PFN in the range to remap.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh](j)}(hN``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hjh]hstruct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h/The VMA descriptor for the VMA requiring remap.h]h/The VMA descriptor for the VMA requiring remap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h@``unsigned long start_pfn`` The first PFN in the range to remap.h](j)}(h``unsigned long start_pfn``h]jS)}(hj4h]hunsigned long start_pfn}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj.ubj)}(hhh]jM)}(h$The first PFN in the range to remap.h]h$The first PFN in the range to remap.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'mmap_action_simple_ioremap (C function)c.mmap_action_simple_ioremaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hlvoid mmap_action_simple_ioremap (struct vm_area_desc *desc, phys_addr_t start_phys_addr, unsigned long size)h]h)}(hkvoid mmap_action_simple_ioremap(struct vm_area_desc *desc, phys_addr_t start_phys_addr, unsigned long size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmmap_action_simple_ioremaph]j)}(hmmap_action_simple_ioremaph]hmmap_action_simple_ioremap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hL(struct vm_area_desc *desc, phys_addr_t start_phys_addr, unsigned long size)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mmap_action_simple_ioremapasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hphys_addr_t start_phys_addrh](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjBmodnameN classnameNjpjs)}jv]jc.mmap_action_simple_ioremapasbuh1hhj9ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hstart_phys_addrh]hstart_phys_addr}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long sizeh](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)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hhelper for mmap_prepare hook to specify that the physical range in [start_phys_addr, start_phys_addr + size) should be I/O remapped.h]hhelper for mmap_prepare hook to specify that the physical range in [start_phys_addr, start_phys_addr + size) should be I/O remapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXF**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. ``phys_addr_t start_phys_addr`` Start of the physical memory to be mapped. ``unsigned long size`` Size of the area to map. **NOTE** Some drivers might want to tweak desc->page_prot for purposes of write-combine or similar.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh](j)}(hN``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring remap. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hj(h]hstruct vm_area_desc *desc}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj"ubj)}(hhh]jM)}(h/The VMA descriptor for the VMA requiring remap.h]h/The VMA descriptor for the VMA requiring remap.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubj)}(hK``phys_addr_t start_phys_addr`` Start of the physical memory to be mapped. h](j)}(h``phys_addr_t start_phys_addr``h]jS)}(hjah]hphys_addr_t start_phys_addr}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj[ubj)}(hhh]jM)}(h*Start of the physical memory to be mapped.h]h*Start of the physical memory to be mapped.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMhjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjubj)}(h0``unsigned long size`` Size of the area to map. h](j)}(h``unsigned long size``h]jS)}(hjh]hunsigned long size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(hSize of the area to map.h]hSize of the area to map.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hZSome drivers might want to tweak desc->page_prot for purposes of write-combine or similar.h]hZSome drivers might want to tweak desc->page_prot for purposes of write-combine or similar.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)mmap_action_map_kernel_pages (C function)c.mmap_action_map_kernel_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid mmap_action_map_kernel_pages (struct vm_area_desc *desc, unsigned long start, struct page **pages, unsigned long nr_pages)h]h)}(h~void mmap_action_map_kernel_pages(struct vm_area_desc *desc, unsigned long start, struct page **pages, unsigned long nr_pages)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMubh)}(hmmap_action_map_kernel_pagesh]j)}(hmmap_action_map_kernel_pagesh]hmmap_action_map_kernel_pages}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj(hMubj )}(h](struct vm_area_desc *desc, unsigned long start, struct page **pages, unsigned long nr_pages)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjWhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jy)}jlj=sbc.mmap_action_map_kernel_pagesasbuh1hhjSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(hunsigned long starth](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)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(hstruct page **pagesh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj:modnameN classnameNjpjs)}jv]jc.mmap_action_map_kernel_pagesasbuh1hhjubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjdhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpagesh]hpages}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(hunsigned long nr_pagesh](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)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj(hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj(hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj(hMhjhhubj4)}(hhh]jM)}(hhelper for mmap_prepare hook to specify that **num** kernel pages contained in the **pages** array should be mapped to userland starting at virtual address **start**.h](h-helper for mmap_prepare hook to specify that }(hjhhhNhNubj)}(h**num**h]hnum}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh kernel pages contained in the }(hjhhhNhNubj)}(h **pages**h]hpages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@ array should be mapped to userland starting at virtual address }(hjhhhNhNubj)}(h **start**h]hstart}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj(hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjGjHjGjIjJjKuh1hhhhjhNhNubj)}(hX^**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring kernel pags to be mapped. ``unsigned long start`` The virtual address from which to map them. ``struct page **pages`` An array of struct page pointers describing the memory to map. ``unsigned long nr_pages`` The number of entries in the **pages** aray.h](jM)}(h**Parameters**h]j)}(hjQh]h Parameters}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjKubj)}(hhh](j)}(ha``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring kernel pags to be mapped. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hjph]hstruct vm_area_desc *desc}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjjubj)}(hhh]jM)}(hBThe VMA descriptor for the VMA requiring kernel pags to be mapped.h]hBThe VMA descriptor for the VMA requiring kernel pags to be mapped.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjgubj)}(hD``unsigned long start`` The virtual address from which to map them. h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]jM)}(h+The virtual address from which to map them.h]h+The virtual address from which to map them.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjgubj)}(hW``struct page **pages`` An array of struct page pointers describing the memory to map. h](j)}(h``struct page **pages``h]jS)}(hjh]hstruct page **pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM hjubj)}(hhh]jM)}(h>An array of struct page pointers describing the memory to map.h]h>An array of struct page pointers describing the memory to map.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjgubj)}(hG``unsigned long nr_pages`` The number of entries in the **pages** aray.h](j)}(h``unsigned long nr_pages``h]jS)}(hjh]hunsigned long nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh]jM)}(h,The number of entries in the **pages** aray.h](hThe number of entries in the }(hj4hhhNhNubj)}(h **pages**h]hpages}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh aray.}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMhjgubeh}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h.mmap_action_map_kernel_pages_full (C function)#c.mmap_action_map_kernel_pages_fullhNtauh1hhjhhhNhNubh)}(hhh](h)}(hWvoid mmap_action_map_kernel_pages_full (struct vm_area_desc *desc, struct page **pages)h]h)}(hVvoid mmap_action_map_kernel_pages_full(struct vm_area_desc *desc, struct page **pages)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h!mmap_action_map_kernel_pages_fullh]j)}(h!mmap_action_map_kernel_pages_fullh]h!mmap_action_map_kernel_pages_full}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h0(struct vm_area_desc *desc, struct page **pages)h](j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsb#c.mmap_action_map_kernel_pages_fullasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page **pagesh](j5)}(hj8h]hstruct}(hj6hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj2ubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubh)}(hhh]j)}(hpageh]hpage}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjVmodnameN classnameNjpjs)}jv]j#c.mmap_action_map_kernel_pages_fullasbuh1hhj2ubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj2ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj2ubj)}(hpagesh]hpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jzah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhj|hhubj4)}(hhh]jM)}(hhelper for mmap_prepare hook to specify that kernel pages contained in the **pages** array should be mapped to userland from **desc->start** to **desc->end**.h](hKhelper for mmap_prepare hook to specify that kernel pages contained in the }(hjhhhNhNubj)}(h **pages**h]hpages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) array should be mapped to userland from }(hjhhhNhNubj)}(h**desc->start**h]h desc->start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to }(hjhhhNhNubj)}(h **desc->end**h]h desc->end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj|hhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXQ**Parameters** ``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring kernel pags to be mapped. ``struct page **pages`` An array of struct page pointers describing the memory to map. **Description** The caller must ensure that **pages** contains sufficient entries to cover the entire range described by **desc**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM"hjubj)}(hhh](j)}(ha``struct vm_area_desc *desc`` The VMA descriptor for the VMA requiring kernel pags to be mapped. h](j)}(h``struct vm_area_desc *desc``h]jS)}(hj;h]hstruct vm_area_desc *desc}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj9ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM!hj5ubj)}(hhh]jM)}(hBThe VMA descriptor for the VMA requiring kernel pags to be mapped.h]hBThe VMA descriptor for the VMA requiring kernel pags to be mapped.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjPhM!hjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhM!hj2ubj)}(hW``struct page **pages`` An array of struct page pointers describing the memory to map. h](j)}(h``struct page **pages``h]jS)}(hjth]hstruct page **pages}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjrubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM"hjnubj)}(hhh]jM)}(h>An array of struct page pointers describing the memory to map.h]h>An array of struct page pointers describing the memory to map.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM"hjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjhM"hj2ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM$hjubjM)}(hrThe caller must ensure that **pages** contains sufficient entries to cover the entire range described by **desc**.h](hThe caller must ensure that }(hjhhhNhNubj)}(h **pages**h]hpages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhD contains sufficient entries to cover the entire range described by }(hjhhhNhNubj)}(h**desc**h]hdesc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM#hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hrange_is_subset (C function)c.range_is_subsethNtauh1hhjhhhNhNubh)}(hhh](h)}(h}bool range_is_subset (unsigned long outer_start, unsigned long outer_end, unsigned long inner_start, unsigned long inner_end)h]h)}(h|bool range_is_subset(unsigned long outer_start, unsigned long outer_end, unsigned long inner_start, unsigned long inner_end)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM?ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj%hM?ubh)}(hrange_is_subseth]j)}(hrange_is_subseth]hrange_is_subset}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj%hM?ubj )}(hh(unsigned long outer_start, unsigned long outer_end, unsigned long inner_start, unsigned long inner_end)h](j )}(hunsigned long outer_starth](j)}(hunsignedh]hunsigned}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hlongh]hlong}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(h outer_starth]h outer_start}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(hunsigned long outer_endh](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)}(h outer_endh]h outer_end}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(hunsigned long inner_starth](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)}(h inner_starth]h inner_start}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(hunsigned long inner_endh](j)}(hunsignedh]hunsigned}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hlongh]hlong}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h inner_endh]h inner_end}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj%hM?ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj%hM?ubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%hM?hj hhubj4)}(hhh]jM)}(h9Is the specified inner range a subset of the outer range?h]h9Is the specified inner range a subset of the outer range?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM?hjhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj%hM?ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long outer_start`` The start of the outer range. ``unsigned long outer_end`` The exclusive end of the outer range. ``unsigned long inner_start`` The start of the inner range. ``unsigned long inner_end`` The exclusive end of the inner range. **Return** ``true`` if [inner_start, inner_end) is a subset of [outer_start, outer_end), otherwise ``false``.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMChjubj)}(hhh](j)}(h<``unsigned long outer_start`` The start of the outer range. h](j)}(h``unsigned long outer_start``h]jS)}(hjh]hunsigned long outer_start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhM@hjubj)}(hhh]jM)}(hThe start of the outer range.h]hThe start of the outer range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM@hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM@hjubj)}(hB``unsigned long outer_end`` The exclusive end of the outer range. h](j)}(h``unsigned long outer_end``h]jS)}(hj#h]hunsigned long outer_end}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj!ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMAhjubj)}(hhh]jM)}(h%The exclusive end of the outer range.h]h%The exclusive end of the outer range.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj8hMAhj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj8hMAhjubj)}(h<``unsigned long inner_start`` The start of the inner range. h](j)}(h``unsigned long inner_start``h]jS)}(hj\h]hunsigned long inner_start}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMBhjVubj)}(hhh]jM)}(hThe start of the inner range.h]hThe start of the inner range.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjqhMBhjrubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMBhjubj)}(hB``unsigned long inner_end`` The exclusive end of the inner range. h](j)}(h``unsigned long inner_end``h]jS)}(hjh]hunsigned long inner_end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMChjubj)}(hhh]jM)}(h%The exclusive end of the inner range.h]h%The exclusive end of the inner range.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMEhjubjM)}(hb``true`` if [inner_start, inner_end) is a subset of [outer_start, outer_end), otherwise ``false``.h](jS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubhP if [inner_start, inner_end) is a subset of [outer_start, outer_end), otherwise }(hjhhhNhNubjS)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMEhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hrange_in_vma (C function)c.range_in_vmahNtauh1hhjhhhNhNubh)}(hhh](h)}(h\bool range_in_vma (const struct vm_area_struct *vma, unsigned long start, unsigned long end)h]h)}(h[bool range_in_vma(const struct vm_area_struct *vma, unsigned long start, unsigned long end)h](j)}(hj-h]hbool}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMQubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhjBhMQubh)}(h range_in_vmah]j)}(h range_in_vmah]h range_in_vma}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubah}(h]h ](jjeh"]h$]h&]jjuh1hhj1hhhjBhMQubj )}(hJ(const struct vm_area_struct *vma, unsigned long start, unsigned long end)h](j )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjqhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjmubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjmubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljWsbc.range_in_vmaasbuh1hhjmubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjmubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjiubj )}(hunsigned long starth](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(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)}(hstarth]hstart}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjiubj )}(hunsigned long endh](j)}(hunsignedh]hunsigned}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hlongh]hlong}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjiubeh}(h]h ]h"]h$]h&]jjuh1j hj1hhhjBhMQubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj-hhhjBhMQubah}(h]j(ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjBhMQhj*hhubj4)}(hhh]jM)}(h@is the specified [**start**, **end**) range a subset of the VMA?h](his the specified [}(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**end**h]hend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) range a subset of the VMA?}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMQhjhhubah}(h]h ]h"]h$]h&]uh1j3hj*hhhjBhMQubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXy**Parameters** ``const struct vm_area_struct *vma`` The VMA against which we want to check [**start**, **end**). ``unsigned long start`` The start of the range we wish to check. ``unsigned long end`` The exclusive end of the range we wish to check. **Return** ``true`` if [**start**, **end**) is a subset of [**vma->vm_start**, **vma->vm_end**), ``false`` otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMUhjubj)}(hhh](j)}(hb``const struct vm_area_struct *vma`` The VMA against which we want to check [**start**, **end**). h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hjh]h const struct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMRhjubj)}(hhh]jM)}(hvm_start**, **vma->vm_end**), ``false`` otherwise.h](jS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh if [}(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**end**h]hend}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) is a subset of [}(hjhhhNhNubj)}(h**vma->vm_start**h]h vma->vm_start}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**vma->vm_end**h]h vma->vm_end}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh), }(hjhhhNhNubjS)}(h ``false``h]hfalse}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMVhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hrange_in_vma_desc (C function)c.range_in_vma_deschNtauh1hhjhhhNhNubh)}(hhh](h)}(h`bool range_in_vma_desc (const struct vm_area_desc *desc, unsigned long start, unsigned long end)h]h)}(h_bool range_in_vma_desc(const struct vm_area_desc *desc, unsigned long start, unsigned long end)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMcubh)}(hrange_in_vma_desch]j)}(hrange_in_vma_desch]hrange_in_vma_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMcubj )}(hI(const struct vm_area_desc *desc, unsigned long start, unsigned long end)h](j )}(hconst struct vm_area_desc *desch](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jljsbc.range_in_vma_descasbuh1hhjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj7hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long starth](j)}(hunsignedh]hunsigned}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hlongh]hlong}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long endh](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)}(hendh]hend}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMcubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMcubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMchjhhubj4)}(hhh]jM)}(hhis the specified [**start**, **end**) range a subset of the VMA described by **desc**, a VMA descriptor?h](his the specified [}(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**end**h]hend}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh)) range a subset of the VMA described by }(hjhhhNhNubj)}(h**desc**h]hdesc}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, a VMA descriptor?}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMchj hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMcubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj^jHj^jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct vm_area_desc *desc`` The VMA descriptor against which we want to check [**start**, **end**). ``unsigned long start`` The start of the range we wish to check. ``unsigned long end`` The exclusive end of the range we wish to check. **Return** ``true`` if [**start**, **end**) is a subset of [**desc->start**, **desc->end**), ``false`` otherwise.h](jM)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMghjbubj)}(hhh](j)}(hl``const struct vm_area_desc *desc`` The VMA descriptor against which we want to check [**start**, **end**). h](j)}(h#``const struct vm_area_desc *desc``h]jS)}(hjh]hconst struct vm_area_desc *desc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMehjubj)}(hhh]jM)}(hGThe VMA descriptor against which we want to check [**start**, **end**).h](h3The VMA descriptor against which we want to check [}(hjhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**end**h]hend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMehjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMehj~ubj)}(hA``unsigned long start`` The start of the range we wish to check. h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMfhjubj)}(hhh]jM)}(h(The start of the range we wish to check.h]h(The start of the range we wish to check.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMfhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMfhj~ubj)}(hG``unsigned long end`` The exclusive end of the range we wish to check. h](j)}(h``unsigned long end``h]jS)}(hjh]hunsigned long end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMghjubj)}(hhh]jM)}(h0The exclusive end of the range we wish to check.h]h0The exclusive end of the range we wish to check.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2hMghj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj2hMghj~ubeh}(h]h ]h"]h$]h&]uh1jhjbubjM)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMihjbubjM)}(hf``true`` if [**start**, **end**) is a subset of [**desc->start**, **desc->end**), ``false`` otherwise.h](jS)}(h``true``h]htrue}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubh if [}(hjnhhhNhNubj)}(h **start**h]hstart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh, }(hjnhhhNhNubj)}(h**end**h]hend}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh) is a subset of [}(hjnhhhNhNubj)}(h**desc->start**h]h desc->start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh, }hjnsbj)}(h **desc->end**h]h desc->end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubh), }(hjnhhhNhNubjS)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubh otherwise.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMihjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hclear_pages (C function) c.clear_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h2void clear_pages (void *addr, unsigned int npages)h]h)}(h1void clear_pages(void *addr, unsigned int npages)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h clear_pagesh]j)}(h clear_pagesh]h clear_pages}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h!(void *addr, unsigned int npages)h](j )}(h void *addrh](j)}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubjF )}(hjI h]h*}(hj^hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj>ubj)}(haddrh]haddr}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubj )}(hunsigned int npagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnpagesh]hnpages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h+clear a page range for kernel-internal use.h]h+clear a page range for kernel-internal use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``void *addr`` start address ``unsigned int npages`` number of pages **Description** Use clear_user_pages() instead when clearing a page range to be mapped to user space. Does absolutely no exception handling. Note that even though the clearing operation is preemptible, clear_pages() does not (and on architectures where it reduces to a few long-running instructions, might not be able to) call cond_resched() to check if rescheduling is required. When running under preemptible models this is not a problem. Under cooperatively scheduled models, however, the caller is expected to limit **npages** to no more than PROCESS_PAGES_NON_PREEMPT_BATCH.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubj)}(hhh](j)}(h``void *addr`` start address h](j)}(h``void *addr``h]jS)}(hj'h]h void *addr}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhj!ubj)}(hhh]jM)}(h start addressh]h start address}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhjubj)}(h(``unsigned int npages`` number of pages h](j)}(h``unsigned int npages``h]jS)}(hj`h]hunsigned int npages}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjZubj)}(hhh]jM)}(hnumber of pagesh]hnumber of pages}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjuhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hUUse clear_user_pages() instead when clearing a page range to be mapped to user space.h]hUUse clear_user_pages() instead when clearing a page range to be mapped to user space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(h&Does absolutely no exception handling.h]h&Does absolutely no exception handling.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hNote that even though the clearing operation is preemptible, clear_pages() does not (and on architectures where it reduces to a few long-running instructions, might not be able to) call cond_resched() to check if rescheduling is required.h]hNote that even though the clearing operation is preemptible, clear_pages() does not (and on architectures where it reduces to a few long-running instructions, might not be able to) call cond_resched() to check if rescheduling is required.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubjM)}(hWhen running under preemptible models this is not a problem. Under cooperatively scheduled models, however, the caller is expected to limit **npages** to no more than PROCESS_PAGES_NON_PREEMPT_BATCH.h](hWhen running under preemptible models this is not a problem. Under cooperatively scheduled models, however, the caller is expected to limit }(hjhhhNhNubj)}(h **npages**h]hnpages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh1 to no more than PROCESS_PAGES_NON_PREEMPT_BATCH.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhS/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:107: ./include/linux/mm.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_ref_count (C function)c.folio_ref_counthNtauh1hhjhhhNhNubh)}(hhh](h)}(h/int folio_ref_count (const struct folio *folio)h]h)}(h.int folio_ref_count(const struct folio *folio)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKGubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj-hKGubh)}(hfolio_ref_counth]j)}(hfolio_ref_counth]hfolio_ref_count}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj-hKGubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj\hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj5)}(hj8h]hstruct}(hjwhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljBsbc.folio_ref_countasbuh1hhjXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjXubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjTubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj-hKGubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj-hKGubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj-hKGhjhhubj4)}(hhh]jM)}(h"The reference count on this folio.h]h"The reference count on this folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKGhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj-hKGubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio. **Description** Folios contain a reference count. When that reference count reaches zero, the folio is referred to as frozen. At this point, it will usually be returned to the memory allocator, but some parts of the kernel freeze folios in order to perform unusual operations on them such as splitting or migration. The refcount is usually incremented by calls to folio_get() and decremented by calls to folio_put(). Some typical users of the folio refcount: - Each reference from a page table - The page cache - Filesystem private data - The LRU list - Pipes - Direct IO which references this page in the process address space The reference count has three components: expected, temporary and spurious. The expected reference count of a folio is that which we would logically expect it to be from just reading the code. Temporary refcounts are gained by threads which need a temporary reference to make sure the folio isn't reallocated while they use it. Spurious refcounts are gained by threads which, thanks to RCU walks of the page tables or file cache, find a stale pointer to a folio. These threads will drop the refcount after discoveering the pointer is stale, but it can surprise other users to see the spurious refcount on a freshly allocated folio (eg they may see a refcount of 2 instead of 1). **Return** The number of references to this folio.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKKhjubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hj;h]hconst struct folio *folio}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj9ubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKHhj5ubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjPhKHhjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhKHhj2ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjvh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKJhjubjM)}(hX-Folios contain a reference count. When that reference count reaches zero, the folio is referred to as frozen. At this point, it will usually be returned to the memory allocator, but some parts of the kernel freeze folios in order to perform unusual operations on them such as splitting or migration.h]hX-Folios contain a reference count. When that reference count reaches zero, the folio is referred to as frozen. At this point, it will usually be returned to the memory allocator, but some parts of the kernel freeze folios in order to perform unusual operations on them such as splitting or migration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKIhjubjM)}(hThe refcount is usually incremented by calls to folio_get() and decremented by calls to folio_put(). Some typical users of the folio refcount:h]hThe refcount is usually incremented by calls to folio_get() and decremented by calls to folio_put(). Some typical users of the folio refcount:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKOhjubjaW)}(hhh](j/)}(h Each reference from a page tableh]jM)}(hjh]h Each reference from a page table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKShjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hThe page cacheh]jM)}(hjh]hThe page cache}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKThjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hFilesystem private datah]jM)}(hjh]hFilesystem private data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKUhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h The LRU listh]jM)}(hjh]h The LRU list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKVhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hPipesh]jM)}(hjh]hPipes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKWhj ubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hBDirect IO which references this page in the process address space h]jM)}(hADirect IO which references this page in the process address spaceh]hADirect IO which references this page in the process address space}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKXhj%ubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjWuh1j`WhjhKShjubjM)}(hXThe reference count has three components: expected, temporary and spurious. The expected reference count of a folio is that which we would logically expect it to be from just reading the code. Temporary refcounts are gained by threads which need a temporary reference to make sure the folio isn't reallocated while they use it. Spurious refcounts are gained by threads which, thanks to RCU walks of the page tables or file cache, find a stale pointer to a folio. These threads will drop the refcount after discoveering the pointer is stale, but it can surprise other users to see the spurious refcount on a freshly allocated folio (eg they may see a refcount of 2 instead of 1).h]hXThe reference count has three components: expected, temporary and spurious. The expected reference count of a folio is that which we would logically expect it to be from just reading the code. Temporary refcounts are gained by threads which need a temporary reference to make sure the folio isn’t reallocated while they use it. Spurious refcounts are gained by threads which, thanks to RCU walks of the page tables or file cache, find a stale pointer to a folio. These threads will drop the refcount after discoveering the pointer is stale, but it can surprise other users to see the spurious refcount on a freshly allocated folio (eg they may see a refcount of 2 instead of 1).}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKZhjubjM)}(h **Return**h]j)}(hjUh]hReturn}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKfhjubjM)}(h'The number of references to this folio.h]h'The number of references to this folio.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhKghjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_try_get (C function)c.folio_try_gethNtauh1hhjhhhNhNubh)}(hhh](h)}(h(bool folio_try_get (struct folio *folio)h]h)}(h'bool folio_try_get(struct folio *folio)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h folio_try_geth]j)}(h folio_try_geth]h folio_try_get}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_try_getasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj"hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h,Attempt to increase the refcount on a folio.h]h,Attempt to increase the refcount on a folio.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhMhjVhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjqjHjqjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio. **Description** If you do not already have a reference to a folio, you can attempt to get one using this function. It may fail if, for example, the folio has been freed since you found a pointer to it, or it is frozen for the purposes of splitting or migration. **Return** True if the reference count was successfully incremented.h](jM)}(h**Parameters**h]j)}(hj{h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhM hjuubj)}(hhh]j)}(h#``struct folio *folio`` The folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhM hjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjuubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhM hjuubjM)}(hIf you do not already have a reference to a folio, you can attempt to get one using this function. It may fail if, for example, the folio has been freed since you found a pointer to it, or it is frozen for the purposes of splitting or migration.h]hIf you do not already have a reference to a folio, you can attempt to get one using this function. It may fail if, for example, the folio has been freed since you found a pointer to it, or it is frozen for the purposes of splitting or migration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhM hjuubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhMhjuubjM)}(h9True if the reference count was successfully incremented.h]h9True if the reference count was successfully incremented.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhY/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:109: ./include/linux/page_ref.hhMhjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](his_highmem (C function) c.is_highmemhNtauh1hhjhhhNhNubh)}(hhh](h)}(h(int is_highmem (const struct zone *zone)h]h)}(h'int is_highmem(const struct zone *zone)h](j)}(hinth]hint}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMubj)}(h h]h }(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhjOhMubh)}(h is_highmemh]j)}(h is_highmemh]h is_highmem}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj=hhhjOhMubj )}(h(const struct zone *zone)h]j )}(hconst struct zone *zoneh](j5)}(hjh]hconst}(hj~hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjzubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjzubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubh)}(hhh]j)}(hzoneh]hzone}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljdsb c.is_highmemasbuh1hhjzubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjzubj)}(hzoneh]hzone}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjvubah}(h]h ]h"]h$]h&]jjuh1j hj=hhhjOhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj9hhhjOhMubah}(h]j4ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjOhMhj6hhubj4)}(hhh]jM)}(hhelper function to quickly check if a struct zone is a highmem zone or not. This is an attempt to keep references to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum.h]hhelper function to quickly check if a struct zone is a highmem zone or not. This is an attempt to keep references to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj6hhhjOhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj4jHj4jIjJjKuh1hhhhjhNhNubj)}(h|**Parameters** ``const struct zone *zone`` pointer to struct zone variable **Return** 1 for a highmem zone, 0 otherwiseh](jM)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj8ubj)}(hhh]j)}(h<``const struct zone *zone`` pointer to struct zone variable h](j)}(h``const struct zone *zone``h]jS)}(hj]h]hconst struct zone *zone}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjWubj)}(hhh]jM)}(hpointer to struct zone variableh]hpointer to struct zone variable}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjrhMhjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjrhMhjTubah}(h]h ]h"]h$]h&]uh1jhj8ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj8ubjM)}(h!1 for a highmem zone, 0 otherwiseh]h!1 for a highmem zone, 0 otherwise}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfor_each_online_pgdat (C macro)c.for_each_online_pgdathNtauh1hhjhhhNhNubh)}(hhh](h)}(hfor_each_online_pgdath]h)}(hfor_each_online_pgdath]h)}(hfor_each_online_pgdath]j)}(hjh]hfor_each_online_pgdat}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubjM)}(h!``for_each_online_pgdat (pgdat)``h]jS)}(hjh]hfor_each_online_pgdat (pgdat)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjhhubji)}(h.helper macro to iterate over all online nodes h]jM)}(h-helper macro to iterate over all online nodesh]h-helper macro to iterate over all online nodes}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj)ubah}(h]h ]h"]h$]h&]uh1jhhj;hMhjhhubj)}(h;**Parameters** ``pgdat`` pointer to a pg_data_t variableh](jM)}(h**Parameters**h]j)}(hjHh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjBubj)}(hhh]j)}(h)``pgdat`` pointer to a pg_data_t variableh](j)}(h ``pgdat``h]jS)}(hjgh]hpgdat}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjaubj)}(hhh]jM)}(hpointer to a pg_data_t variableh]hpointer to a pg_data_t variable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfor_each_zone (C macro)c.for_each_zonehNtauh1hhjhhhNhNubh)}(hhh](h)}(h for_each_zoneh]h)}(h for_each_zoneh]h)}(h for_each_zoneh]j)}(hjh]h for_each_zone}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjjHjjIjJjKu<h1hhhhjhNhNubjM)}(h``for_each_zone (zone)``h]jS)}(hjh]hfor_each_zone (zone)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjhhubji)}(h.helper macro to iterate over all memory zones h]jM)}(h-helper macro to iterate over all memory zonesh]h-helper macro to iterate over all memory zones}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhhjhMhjhhubj)}(h**Parameters** ``zone`` pointer to struct zone variable **Description** The user only needs to declare the zone variable, for_each_zone fills it in.h](jM)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj&ubj)}(hhh]j)}(h)``zone`` pointer to struct zone variable h](j)}(h``zone``h]jS)}(hjKh]hzone}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjIubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjEubj)}(hhh]jM)}(hpointer to struct zone variableh]hpointer to struct zone variable}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`hMhjaubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhj`hMhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj&ubjM)}(hLThe user only needs to declare the zone variable, for_each_zone fills it in.h]hLThe user only needs to declare the zone variable, for_each_zone fills it in.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h next_zones_zonelist (C function)c.next_zones_zonelisthNtauh1hhjhhhNhNubh)}(hhh](h)}(hqstruct zoneref * next_zones_zonelist (struct zoneref *z, enum zone_type highest_zoneidx, const nodemask_t *nodes)h]h)}(hostruct zoneref *next_zones_zonelist(struct zoneref *z, enum zone_type highest_zoneidx, const nodemask_t *nodes)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM*ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM*ubh)}(hhh]j)}(hzonerefh]hzoneref}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlnext_zones_zonelistsbc.next_zones_zonelistasbuh1hhjhhhjhM*ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM*ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhM*ubh)}(hnext_zones_zonelisth]j)}(hjh]hnext_zones_zonelist}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM*ubj )}(hL(struct zoneref *z, enum zone_type highest_zoneidx, const nodemask_t *nodes)h](j )}(hstruct zoneref *zh](j5)}(hj8h]hstruct}(hjEhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjAubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubh)}(hhh]j)}(hzonerefh]hzoneref}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjemodnameN classnameNjpjs)}jv]jc.next_zones_zonelistasbuh1hhjAubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjAubj)}(hzh]hz}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubj )}(henum zone_type highest_zoneidxh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h zone_typeh]h zone_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.next_zones_zonelistasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hhighest_zoneidxh]hhighest_zoneidx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubj )}(hconst nodemask_t *nodesh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h nodemask_th]h nodemask_t}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]jc.next_zones_zonelistasbuh1hhjubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjbhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hnodesh]hnodes}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj=ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM*ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM*ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM*hjhhubj4)}(hhh]jM)}(hReturns the next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting pointh]hReturns the next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting point}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM*hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM*ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct zoneref *z`` The cursor used as a starting point for the search ``enum zone_type highest_zoneidx`` The zone index of the highest zone to return ``const nodemask_t *nodes`` An optional nodemask to filter the zonelist with **Description** This function returns the next zone at or below a given zone index that is within the allowed nodemask using a cursor as the starting point for the search. The zoneref returned is a cursor that represents the current zone being examined. It should be advanced by one before calling next_zones_zonelist again. **Return** the next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting pointh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM.hjubj)}(hhh](j)}(hI``struct zoneref *z`` The cursor used as a starting point for the search h](j)}(h``struct zoneref *z``h]jS)}(hjh]hstruct zoneref *z}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM+hjubj)}(hhh]jM)}(h2The cursor used as a starting point for the searchh]h2The cursor used as a starting point for the search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjubj)}(hP``enum zone_type highest_zoneidx`` The zone index of the highest zone to return h](j)}(h"``enum zone_type highest_zoneidx``h]jS)}(hjh]henum zone_type highest_zoneidx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM,hj ubj)}(hhh]jM)}(h,The zone index of the highest zone to returnh]h,The zone index of the highest zone to return}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(hM,hj)ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj(hM,hjubj)}(hM``const nodemask_t *nodes`` An optional nodemask to filter the zonelist with h](j)}(h``const nodemask_t *nodes``h]jS)}(hjLh]hconst nodemask_t *nodes}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjJubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM-hjFubj)}(hhh]jM)}(h0An optional nodemask to filter the zonelist withh]h0An optional nodemask to filter the zonelist with}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjahM-hjbubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjahM-hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM/hjubjM)}(hX4This function returns the next zone at or below a given zone index that is within the allowed nodemask using a cursor as the starting point for the search. The zoneref returned is a cursor that represents the current zone being examined. It should be advanced by one before calling next_zones_zonelist again.h]hX4This function returns the next zone at or below a given zone index that is within the allowed nodemask using a cursor as the starting point for the search. The zoneref returned is a cursor that represents the current zone being examined. It should be advanced by one before calling next_zones_zonelist again.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM.hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM4hjubjM)}(hzthe next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting pointh]hzthe next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting point}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM5hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!first_zones_zonelist (C function)c.first_zones_zonelisthNtauh1hhjhhhNhNubh)}(hhh](h)}(hzstruct zoneref * first_zones_zonelist (struct zonelist *zonelist, enum zone_type highest_zoneidx, const nodemask_t *nodes)h]h)}(hxstruct zoneref *first_zones_zonelist(struct zonelist *zonelist, enum zone_type highest_zoneidx, const nodemask_t *nodes)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMBubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMBubh)}(hhh]j)}(hzonerefh]hzoneref}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlfirst_zones_zonelistsbc.first_zones_zonelistasbuh1hhjhhhjhMBubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMBubjF )}(hjI h]h*}(hjAhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMBubh)}(hfirst_zones_zonelisth]j)}(hj0h]hfirst_zones_zonelist}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMBubj )}(hT(struct zonelist *zonelist, enum zone_type highest_zoneidx, const nodemask_t *nodes)h](j )}(hstruct zonelist *zonelisth](j5)}(hj8h]hstruct}(hjmhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjiubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubh)}(hhh]j)}(hzonelisth]hzonelist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j.c.first_zones_zonelistasbuh1hhjiubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjiubj)}(hzonelisth]hzonelist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubj )}(henum zone_type highest_zoneidxh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h zone_typeh]h zone_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j.c.first_zones_zonelistasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hhighest_zoneidxh]hhighest_zoneidx}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubj )}(hconst nodemask_t *nodesh](j5)}(hjh]hconst}(hj@hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj<ubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j)}(h nodemask_th]h nodemask_t}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj`modnameN classnameNjpjs)}jv]j.c.first_zones_zonelistasbuh1hhj<ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj<ubj)}(hnodesh]hnodes}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMBubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMBubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMBhjhhubj4)}(hhh]jM)}(h\Returns the first zone at or below highest_zoneidx within the allowed nodemask in a zonelisth]h\Returns the first zone at or below highest_zoneidx within the allowed nodemask in a zonelist}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMBhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMBubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct zonelist *zonelist`` The zonelist to search for a suitable zone ``enum zone_type highest_zoneidx`` The zone index of the highest zone to return ``const nodemask_t *nodes`` An optional nodemask to filter the zonelist with **Description** This function returns the first zone at or below a given zone index that is within the allowed nodemask. The zoneref returned is a cursor that can be used to iterate the zonelist with next_zones_zonelist by advancing it by one before calling. When no eligible zone is found, zoneref->zone is NULL (zoneref itself is never NULL). This may happen either genuinely, or due to concurrent nodemask update due to cpuset modification. **Return** Zoneref pointer for the first suitable zone foundh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMFhjubj)}(hhh](j)}(hI``struct zonelist *zonelist`` The zonelist to search for a suitable zone h](j)}(h``struct zonelist *zonelist``h]jS)}(hjh]hstruct zonelist *zonelist}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMChjubj)}(hhh]jM)}(h*The zonelist to search for a suitable zoneh]h*The zonelist to search for a suitable zone}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubj)}(hP``enum zone_type highest_zoneidx`` The zone index of the highest zone to return h](j)}(h"``enum zone_type highest_zoneidx``h]jS)}(hj;h]henum zone_type highest_zoneidx}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj9ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMDhj5ubj)}(hhh]jM)}(h,The zone index of the highest zone to returnh]h,The zone index of the highest zone to return}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjPhMDhjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhjPhMDhjubj)}(hM``const nodemask_t *nodes`` An optional nodemask to filter the zonelist with h](j)}(h``const nodemask_t *nodes``h]jS)}(hjth]hconst nodemask_t *nodes}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjrubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMEhjnubj)}(hhh]jM)}(h0An optional nodemask to filter the zonelist withh]h0An optional nodemask to filter the zonelist with}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMEhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjhMEhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMGhjubjM)}(hThis function returns the first zone at or below a given zone index that is within the allowed nodemask. The zoneref returned is a cursor that can be used to iterate the zonelist with next_zones_zonelist by advancing it by one before calling.h]hThis function returns the first zone at or below a given zone index that is within the allowed nodemask. The zoneref returned is a cursor that can be used to iterate the zonelist with next_zones_zonelist by advancing it by one before calling.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMFhjubjM)}(hWhen no eligible zone is found, zoneref->zone is NULL (zoneref itself is never NULL). This may happen either genuinely, or due to concurrent nodemask update due to cpuset modification.h]hWhen no eligible zone is found, zoneref->zone is NULL (zoneref itself is never NULL). This may happen either genuinely, or due to concurrent nodemask update due to cpuset modification.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMKhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMOhjubjM)}(h1Zoneref pointer for the first suitable zone foundh]h1Zoneref pointer for the first suitable zone found}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMPhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)for_each_zone_zonelist_nodemask (C macro)!c.for_each_zone_zonelist_nodemaskhNtauh1hhjhhhNhNubh)}(hhh](h)}(hfor_each_zone_zonelist_nodemaskh]h)}(hfor_each_zone_zonelist_nodemaskh]h)}(hfor_each_zone_zonelist_nodemaskh]j)}(hj$h]hfor_each_zone_zonelist_nodemask}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj&hhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM[ubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj"hhhjAhM[ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjAhM[hjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjAhM[ubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjZjHjZjIjJjKuh1hhhhjhNhNubjM)}(hG``for_each_zone_zonelist_nodemask (zone, z, zlist, highidx, nodemask)``h]jS)}(hj`h]hCfor_each_zone_zonelist_nodemask (zone, z, zlist, highidx, nodemask)}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM]hjhhubji)}(hlhelper macro to iterate over valid zones in a zonelist at or below a given zone index and within a nodemask h]jM)}(hkhelper macro to iterate over valid zones in a zonelist at or below a given zone index and within a nodemaskh]hkhelper macro to iterate over valid zones in a zonelist at or below a given zone index and within a nodemask}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM[hjvubah}(h]h ]h"]h$]h&]uh1jhhjhM[hjhhubj)}(hX**Parameters** ``zone`` The current zone in the iterator ``z`` The current pointer within zonelist->_zonerefs being iterated ``zlist`` The zonelist being iterated ``highidx`` The zone index of the highest zone to return ``nodemask`` Nodemask allowed by the allocator **Description** This iterator iterates though all zones at or below a given zone index and within a given nodemaskh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM_hjubj)}(hhh](j)}(h*``zone`` The current zone in the iterator h](j)}(h``zone``h]jS)}(hjh]hzone}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM\hjubj)}(hhh]jM)}(h The current zone in the iteratorh]h The current zone in the iterator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM\hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM\hjubj)}(hD``z`` The current pointer within zonelist->_zonerefs being iterated h](j)}(h``z``h]jS)}(hjh]hz}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM]hjubj)}(hhh]jM)}(h=The current pointer within zonelist->_zonerefs being iteratedh]h=The current pointer within zonelist->_zonerefs being iterated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM]hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM]hjubj)}(h&``zlist`` The zonelist being iterated h](j)}(h ``zlist``h]jS)}(hj&h]hzlist}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj$ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM^hj ubj)}(hhh]jM)}(hThe zonelist being iteratedh]hThe zonelist being iterated}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;hM^hj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj;hM^hjubj)}(h9``highidx`` The zone index of the highest zone to return h](j)}(h ``highidx``h]jS)}(hj_h]hhighidx}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM_hjYubj)}(hhh]jM)}(h,The zone index of the highest zone to returnh]h,The zone index of the highest zone to return}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjthM_hjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthM_hjubj)}(h/``nodemask`` Nodemask allowed by the allocator h](j)}(h ``nodemask``h]jS)}(hjh]hnodemask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhM`hjubj)}(hhh]jM)}(h!Nodemask allowed by the allocatorh]h!Nodemask allowed by the allocator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM`hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM`hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMbhjubjM)}(hbThis iterator iterates though all zones at or below a given zone index and within a given nodemaskh]hbThis iterator iterates though all zones at or below a given zone index and within a given nodemask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMahjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h for_each_zone_zonelist (C macro)c.for_each_zone_zonelisthNtauh1hhjhhhNhNubh)}(hhh](h)}(hfor_each_zone_zonelisth]h)}(hfor_each_zone_zonelisth]h)}(hfor_each_zone_zonelisth]j)}(hjh]hfor_each_zone_zonelist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMsubah}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj/hMsubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/hMshj hhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hj hhhj/hMsubeh}(h]h ](jAmacroeh"]h$]h&]jFjAjGjHjHjHjIjJjKuh1hhhhjhNhNubjM)}(h4``for_each_zone_zonelist (zone, z, zlist, highidx)``h]jS)}(hjNh]h0for_each_zone_zonelist (zone, z, zlist, highidx)}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMuhjhhubji)}(hVhelper macro to iterate over valid zones in a zonelist at or below a given zone index h]jM)}(hUhelper macro to iterate over valid zones in a zonelist at or below a given zone indexh]hUhelper macro to iterate over valid zones in a zonelist at or below a given zone index}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMshjdubah}(h]h ]h"]h$]h&]uh1jhhjvhMshjhhubj)}(hX=**Parameters** ``zone`` The current zone in the iterator ``z`` The current pointer within zonelist->zones being iterated ``zlist`` The zonelist being iterated ``highidx`` The zone index of the highest zone to return **Description** This iterator iterates though all zones at or below a given zone index.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMwhj}ubj)}(hhh](j)}(h*``zone`` The current zone in the iterator h](j)}(h``zone``h]jS)}(hjh]hzone}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMthjubj)}(hhh]jM)}(h The current zone in the iteratorh]h The current zone in the iterator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMthjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMthjubj)}(h@``z`` The current pointer within zonelist->zones being iterated h](j)}(h``z``h]jS)}(hjh]hz}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMuhjubj)}(hhh]jM)}(h9The current pointer within zonelist->zones being iteratedh]h9The current pointer within zonelist->zones being iterated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjubj)}(h&``zlist`` The zonelist being iterated h](j)}(h ``zlist``h]jS)}(hjh]hzlist}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMvhjubj)}(hhh]jM)}(hThe zonelist being iteratedh]hThe zonelist being iterated}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hMvhj*ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj)hMvhjubj)}(h9``highidx`` The zone index of the highest zone to return h](j)}(h ``highidx``h]jS)}(hjMh]hhighidx}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjKubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMwhjGubj)}(hhh]jM)}(h,The zone index of the highest zone to returnh]h,The zone index of the highest zone to return}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjbhMwhjcubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jhjbhMwhjubeh}(h]h ]h"]h$]h&]uh1jhj}ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMyhj}ubjM)}(hGThis iterator iterates though all zones at or below a given zone index.h]hGThis iterator iterates though all zones at or below a given zone index.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMxhj}ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpfn_valid (C function) c.pfn_validhNtauh1hhjhhhNhNubh)}(hhh](h)}(h!int pfn_valid (unsigned long pfn)h]h)}(h int pfn_valid(unsigned long pfn)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h pfn_validh]j)}(h pfn_validh]h pfn_valid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(unsigned long pfn)h]j )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpfnh]hpfn}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h4check if there is a valid memory map entry for a PFNh]h4check if there is a valid memory map entry for a PFN}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjihhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long pfn`` the page frame number to check **Description** Check if there is a valid memory map entry aka struct page for the **pfn**. Note, that availability of the memory map entry does not imply that there is actual usable memory at that **pfn**. The struct page may represent a hole or an unusable page frame. **Return** 1 for PFNs that have memory map entries and 0 otherwiseh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjubj)}(hhh]j)}(h5``unsigned long pfn`` the page frame number to check h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjubj)}(hhh]jM)}(hthe page frame number to checkh]hthe page frame number to check}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjubjM)}(hCheck if there is a valid memory map entry aka struct page for the **pfn**. Note, that availability of the memory map entry does not imply that there is actual usable memory at that **pfn**. The struct page may represent a hole or an unusable page frame.h](hCCheck if there is a valid memory map entry aka struct page for the }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhl. Note, that availability of the memory map entry does not imply that there is actual usable memory at that }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhA. The struct page may represent a hole or an unusable page frame.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjubjM)}(h **Return**h]j)}(hj3h]hReturn}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjubjM)}(h71 for PFNs that have memory map entries and 0 otherwiseh]h71 for PFNs that have memory map entries and 0 otherwise}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhW/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:110: ./include/linux/mmzone.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_mapping (C function)c.folio_mappinghNtauh1hhjhhhNhNubh)}(hhh](h)}(h@struct address_space * folio_mapping (const struct folio *folio)h]h)}(h>struct address_space *folio_mapping(const struct folio *folio)h](j5)}(hj8h]hstruct}(hjxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjthhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjthhhjhMubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jl folio_mappingsbc.folio_mappingasbuh1hhjthhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjthhhjhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjthhhjhMubh)}(h folio_mappingh]j)}(hjh]h folio_mapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjthhhjhMubj )}(h(const struct folio *folio)h]j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-modnameN classnameNjpjs)}jv]jc.folio_mappingasbuh1hhjubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjWhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjthhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjphhhjhMubah}(h]jkah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjmhhubj4)}(hhh]jM)}(h,Find the mapping where this folio is stored.h]h,Find the mapping where this folio is stored.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjmhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio. **Description** For folios which are in the page cache, return the mapping that this page belongs to. Folios in the swap cache return the swap mapping this page is stored in (which is different from the mapping for the swap file or swap device where the data is stored). You can call this for folios which aren't in the swap cache or page cache and it will return NULL.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMhjubj)}(hhh]j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMhjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMhjubjM)}(hFor folios which are in the page cache, return the mapping that this page belongs to. Folios in the swap cache return the swap mapping this page is stored in (which is different from the mapping for the swap file or swap device where the data is stored).h]hFor folios which are in the page cache, return the mapping that this page belongs to. Folios in the swap cache return the swap mapping this page is stored in (which is different from the mapping for the swap file or swap device where the data is stored).}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMhjubjM)}(hbYou can call this for folios which aren't in the swap cache or page cache and it will return NULL.h]hdYou can call this for folios which aren’t in the swap cache or page cache and it will return NULL.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:111: ./mm/util.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__anon_vma_prepare (C function)c.__anon_vma_preparehNtauh1hhjhhhNhNubh)}(hhh](h)}(h3int __anon_vma_prepare (struct vm_area_struct *vma)h]h)}(h2int __anon_vma_prepare(struct vm_area_struct *vma)h](j)}(hinth]hint}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjlhKubh)}(h__anon_vma_prepareh]j)}(h__anon_vma_prepareh]h__anon_vma_prepare}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjZhhhjlhKubj )}(h(struct vm_area_struct *vma)h]j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.__anon_vma_prepareasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjZhhhjlhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjVhhhjlhKubah}(h]jQah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjlhKhjShhubj4)}(hhh]jM)}(h%attach an anon_vma to a memory regionh]h%attach an anon_vma to a memory region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjShhhjlhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj6jHj6jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` the memory region in question **Description** This makes sure the memory mapping described by 'vma' has an 'anon_vma' attached to it, so that we can associate the anonymous pages mapped into it with that anon_vma. The common case will be that we already have one, which is handled inline by anon_vma_prepare(). But if not we either need to find an adjacent mapping that we can re-use the anon_vma from (very common when the only reason for splitting a vma has been mprotect()), or we allocate a new one. Anon-vma allocations are very subtle, because we may have optimistically looked up an anon_vma in folio_lock_anon_vma_read() and that may actually touch the rwsem even in the newly allocated vma (it depends on RCU to make sure that the anon_vma isn't actually destroyed). As a result, we need to do proper anon_vma locking even for the new allocation. At the same time, we do not want to do any locking for the common case of already having an anon_vma.h](jM)}(h**Parameters**h]j)}(hj@h]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhj:ubj)}(hhh]j)}(h=``struct vm_area_struct *vma`` the memory region in question h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj_h]hstruct vm_area_struct *vma}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj]ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhjYubj)}(hhh]jM)}(hthe memory region in questionh]hthe memory region in question}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjthKhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthKhjVubah}(h]h ]h"]h$]h&]uh1jhj:ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhj:ubjM)}(hThis makes sure the memory mapping described by 'vma' has an 'anon_vma' attached to it, so that we can associate the anonymous pages mapped into it with that anon_vma.h]hThis makes sure the memory mapping described by ‘vma’ has an ‘anon_vma’ attached to it, so that we can associate the anonymous pages mapped into it with that anon_vma.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhj:ubjM)}(hX!The common case will be that we already have one, which is handled inline by anon_vma_prepare(). But if not we either need to find an adjacent mapping that we can re-use the anon_vma from (very common when the only reason for splitting a vma has been mprotect()), or we allocate a new one.h]hX!The common case will be that we already have one, which is handled inline by anon_vma_prepare(). But if not we either need to find an adjacent mapping that we can re-use the anon_vma from (very common when the only reason for splitting a vma has been mprotect()), or we allocate a new one.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhj:ubjM)}(hXAnon-vma allocations are very subtle, because we may have optimistically looked up an anon_vma in folio_lock_anon_vma_read() and that may actually touch the rwsem even in the newly allocated vma (it depends on RCU to make sure that the anon_vma isn't actually destroyed).h]hXAnon-vma allocations are very subtle, because we may have optimistically looked up an anon_vma in folio_lock_anon_vma_read() and that may actually touch the rwsem even in the newly allocated vma (it depends on RCU to make sure that the anon_vma isn’t actually destroyed).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhj:ubjM)}(hAs a result, we need to do proper anon_vma locking even for the new allocation. At the same time, we do not want to do any locking for the common case of already having an anon_vma.h]hAs a result, we need to do proper anon_vma locking even for the new allocation. At the same time, we do not want to do any locking for the common case of already having an anon_vma.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chKhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hanon_vma_clone (C function)c.anon_vma_clonehNtauh1hhjhhhNhNubh)}(hhh](h)}(hiint anon_vma_clone (struct vm_area_struct *dst, struct vm_area_struct *src, enum vma_operation operation)h]h)}(hhint anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src, enum vma_operation operation)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM%ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM%ubh)}(hanon_vma_cloneh]j)}(hanon_vma_cloneh]hanon_vma_clone}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM%ubj )}(hV(struct vm_area_struct *dst, struct vm_area_struct *src, enum vma_operation operation)h](j )}(hstruct vm_area_struct *dsth](j5)}(hj8h]hstruct}(hjIhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjEubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjimodnameN classnameNjpjs)}jv]jy)}jlj/sbc.anon_vma_cloneasbuh1hhjEubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjEubj)}(hdsth]hdst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubj )}(hstruct vm_area_struct *srch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.anon_vma_cloneasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubj )}(henum vma_operation operationh](j5)}(hjh]henum}(hj+hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj'ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(h vma_operationh]h vma_operation}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjKmodnameN classnameNjpjs)}jv]jc.anon_vma_cloneasbuh1hhj'ubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h operationh]h operation}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM%ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM%ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM%hjhhubj4)}(hhh]jM)}(hEstablishes new anon_vma_chain objects in **dst** linking to all of the anon_vma objects contained within **src** anon_vma_chain's.h](h*Establishes new anon_vma_chain objects in }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh9 linking to all of the anon_vma objects contained within }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh anon_vma_chain’s.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM%hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM%ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *dst`` The destination VMA with an empty anon_vma_chain. ``struct vm_area_struct *src`` The source VMA we wish to duplicate. ``enum vma_operation operation`` The type of operation which resulted in the clone. **Description** This is the heart of the VMA side of the anon_vma implementation - we invoke this function whenever we need to set up a new VMA's anon_vma state. This is invoked for: - VMA Merge, but only when **dst** is unfaulted and **src** is faulted - meaning we clone **src** into **dst**. - VMA split. - VMA (m)remap. - Fork of faulted VMA. In all cases other than fork this is simply a duplication. Fork additionally adds a new active anon_vma. ONLY in the case of fork do we try to 'reuse' existing anon_vma's in an anon_vma hierarchy, reusing anon_vma's which have no VMA associated with them but do have a single child. This is to avoid waste of memory when repeatedly forking. **Return** 0 on success, -ENOMEM on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM)hjubj)}(hhh](j)}(hQ``struct vm_area_struct *dst`` The destination VMA with an empty anon_vma_chain. h](j)}(h``struct vm_area_struct *dst``h]jS)}(hjh]hstruct vm_area_struct *dst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM'hjubj)}(hhh]jM)}(h1The destination VMA with an empty anon_vma_chain.h]h1The destination VMA with an empty anon_vma_chain.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM'hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM'hjubj)}(hD``struct vm_area_struct *src`` The source VMA we wish to duplicate. h](j)}(h``struct vm_area_struct *src``h]jS)}(hj=h]hstruct vm_area_struct *src}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM(hj7ubj)}(hhh]jM)}(h$The source VMA we wish to duplicate.h]h$The source VMA we wish to duplicate.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjRhM(hjSubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhjRhM(hjubj)}(hT``enum vma_operation operation`` The type of operation which resulted in the clone. h](j)}(h ``enum vma_operation operation``h]jS)}(hjvh]henum vma_operation operation}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjtubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM)hjpubj)}(hhh]jM)}(h2The type of operation which resulted in the clone.h]h2The type of operation which resulted in the clone.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM)hjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jhjhM)hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM+hjubjM)}(hThis is the heart of the VMA side of the anon_vma implementation - we invoke this function whenever we need to set up a new VMA's anon_vma state.h]hThis is the heart of the VMA side of the anon_vma implementation - we invoke this function whenever we need to set up a new VMA’s anon_vma state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM*hjubjM)}(hThis is invoked for:h]hThis is invoked for:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM-hjubjaW)}(hhh](j/)}(hmVMA Merge, but only when **dst** is unfaulted and **src** is faulted - meaning we clone **src** into **dst**.h]jM)}(hmVMA Merge, but only when **dst** is unfaulted and **src** is faulted - meaning we clone **src** into **dst**.h](hVMA Merge, but only when }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is unfaulted and }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is faulted - meaning we clone }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh into }(hjhhhNhNubj)}(h**dst**h]hdst}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.c*hM/hjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h VMA split.h]jM)}(hjKh]h VMA split.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM1hjIubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h VMA (m)remap.h]jM)}(hjch]h VMA (m)remap.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM2hjaubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hFork of faulted VMA. h]jM)}(hFork of faulted VMA.h]hFork of faulted VMA.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM3hjyubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjWuh1j`WhjBhM/hjubjM)}(hhIn all cases other than fork this is simply a duplication. Fork additionally adds a new active anon_vma.h]hhIn all cases other than fork this is simply a duplication. Fork additionally adds a new active anon_vma.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM5hjubjM)}(hONLY in the case of fork do we try to 'reuse' existing anon_vma's in an anon_vma hierarchy, reusing anon_vma's which have no VMA associated with them but do have a single child. This is to avoid waste of memory when repeatedly forking.h]hONLY in the case of fork do we try to ‘reuse’ existing anon_vma’s in an anon_vma hierarchy, reusing anon_vma’s which have no VMA associated with them but do have a single child. This is to avoid waste of memory when repeatedly forking.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM8hjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM=hjubjM)}(h!0 on success, -ENOMEM on failure.h]h!0 on success, -ENOMEM on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM>hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hunlink_anon_vmas (C function)c.unlink_anon_vmashNtauh1hhjhhhNhNubh)}(hhh](h)}(h2void unlink_anon_vmas (struct vm_area_struct *vma)h]h)}(h1void unlink_anon_vmas(struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubh)}(hunlink_anon_vmash]j)}(hunlink_anon_vmash]hunlink_anon_vmas}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMubj )}(h(struct vm_area_struct *vma)h]j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj:hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj6ubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjZmodnameN classnameNjpjs)}jv]jy)}jlj sbc.unlink_anon_vmasasbuh1hhj6ubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6ubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj2ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhjhhubj4)}(hhh]jM)}(hNremove all links between a VMA and anon_vma's, freeing anon_vma_chain objects.h]hPremove all links between a VMA and anon_vma’s, freeing anon_vma_chain objects.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXK**Parameters** ``struct vm_area_struct *vma`` The VMA whose links to anon_vma objects is to be severed. **Description** As part of the process anon_vma_chain's are freed, anon_vma->num_children,num_active_vmas is updated as required and, if the relevant anon_vma references no further VMAs, its reference count is decremented.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]j)}(hY``struct vm_area_struct *vma`` The VMA whose links to anon_vma objects is to be severed. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(h9The VMA whose links to anon_vma objects is to be severed.h]h9The VMA whose links to anon_vma objects is to be severed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj9h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubjM)}(hAs part of the process anon_vma_chain's are freed, anon_vma->num_children,num_active_vmas is updated as required and, if the relevant anon_vma references no further VMAs, its reference count is decremented.h]hAs part of the process anon_vma_chain’s are freed, anon_vma->num_children,num_active_vmas is updated as required and, if the relevant anon_vma references no further VMAs, its reference count is decremented.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h page_address_in_vma (C function)c.page_address_in_vmahNtauh1hhjhhhNhNubh)}(hhh](h)}(hxunsigned long page_address_in_vma (const struct folio *folio, const struct page *page, const struct vm_area_struct *vma)h]h)}(hwunsigned long page_address_in_vma(const struct folio *folio, const struct page *page, const struct vm_area_struct *vma)h](j)}(hunsignedh]hunsigned}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMGubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzhhhjhMGubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzhhhjhMGubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzhhhjhMGubh)}(hpage_address_in_vmah]j)}(hpage_address_in_vmah]hpage_address_in_vma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjzhhhjhMGubj )}(hV(const struct folio *folio, const struct page *page, const struct vm_area_struct *vma)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.page_address_in_vmaasbuh1hhjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj>hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjdhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj`ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j,c.page_address_in_vmaasbuh1hhj`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj`ubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h const struct vm_area_struct *vmah](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj( hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj% ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj* modnameN classnameNjpjs)}jv]j,c.page_address_in_vmaasbuh1hhjubj)}(h h]h }(hjF hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjT hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hja hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjzhhhjhMGubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjvhhhjhMGubah}(h]jqah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMGhjshhubj4)}(hhh]jM)}(h*The virtual address of a page in this VMA.h]h*The virtual address of a page in this VMA.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMGhj hhubah}(h]h ]h"]h$]h&]uh1j3hjshhhjhMGubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio containing the page. ``const struct page *page`` The page within the folio. ``const struct vm_area_struct *vma`` The VMA we need to know the address in. **Description** Calculates the user virtual address of this page in the specified VMA. It is the caller's responsibility to check the page is actually within the VMA. There may not currently be a PTE pointing at this page, but if a page fault occurs at this address, this is the page which will be accessed. **Context** Caller should hold a reference to the folio. Caller should hold a lock (eg the i_mmap_lock or the mmap_lock) which keeps the VMA from being altered. **Return** The virtual address corresponding to this page in the VMA.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMKhj ubj)}(hhh](j)}(h=``const struct folio *folio`` The folio containing the page. h](j)}(h``const struct folio *folio``h]jS)}(hj h]hconst struct folio *folio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMHhj ubj)}(hhh]jM)}(hThe folio containing the page.h]hThe folio containing the page.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMHhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMHhj ubj)}(h7``const struct page *page`` The page within the folio. h](j)}(h``const struct page *page``h]jS)}(hj h]hconst struct page *page}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMIhj ubj)}(hhh]jM)}(hThe page within the folio.h]hThe page within the folio.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMIhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMIhj ubj)}(hM``const struct vm_area_struct *vma`` The VMA we need to know the address in. h](j)}(h$``const struct vm_area_struct *vma``h]jS)}(hj> h]h const struct vm_area_struct *vma}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj< ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMJhj8 ubj)}(hhh]jM)}(h'The VMA we need to know the address in.h]h'The VMA we need to know the address in.}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjS hMJhjT ubah}(h]h ]h"]h$]h&]uh1jhj8 ubeh}(h]h ]h"]h$]h&]uh1jhjS hMJhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjy h]h Description}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMLhj ubjM)}(hX$Calculates the user virtual address of this page in the specified VMA. It is the caller's responsibility to check the page is actually within the VMA. There may not currently be a PTE pointing at this page, but if a page fault occurs at this address, this is the page which will be accessed.h]hX&Calculates the user virtual address of this page in the specified VMA. It is the caller’s responsibility to check the page is actually within the VMA. There may not currently be a PTE pointing at this page, but if a page fault occurs at this address, this is the page which will be accessed.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMKhj ubjM)}(h **Context**h]j)}(hj h]hContext}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMQhj ubjM)}(hCaller should hold a reference to the folio. Caller should hold a lock (eg the i_mmap_lock or the mmap_lock) which keeps the VMA from being altered.h]hCaller should hold a reference to the folio. Caller should hold a lock (eg the i_mmap_lock or the mmap_lock) which keeps the VMA from being altered.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMRhj ubjM)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMVhj ubjM)}(h:The virtual address corresponding to this page in the VMA.h]h:The virtual address corresponding to this page in the VMA.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMVhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_referenced (C function)c.folio_referencedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hkint folio_referenced (struct folio *folio, int is_locked, struct mem_cgroup *memcg, vma_flags_t *vma_flags)h]h)}(hjint folio_referenced(struct folio *folio, int is_locked, struct mem_cgroup *memcg, vma_flags_t *vma_flags)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM!ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM!ubh)}(hfolio_referencedh]j)}(hfolio_referencedh]hfolio_referenced}(hj- hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj) ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhj hM!ubj )}(hV(struct folio *folio, int is_locked, struct mem_cgroup *memcg, vma_flags_t *vma_flags)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjI hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjE ubj)}(h h]h }(hjV hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE ubh)}(hhh]j)}(hfolioh]hfolio}(hjg hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetji modnameN classnameNjpjs)}jv]jy)}jlj/ sbc.folio_referencedasbuh1hhjE ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE ubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjE ubj)}(hfolioh]hfolio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjA ubj )}(h int is_lockedh](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h is_lockedh]h is_locked}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjA ubj )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]j c.folio_referencedasbuh1hhj ubj)}(h h]h }(hj, hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj: hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hmemcgh]hmemcg}(hjG hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjA ubj )}(hvma_flags_t *vma_flagsh](h)}(hhh]j)}(h vma_flags_th]h vma_flags_t}(hjc hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj` ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetje modnameN classnameNjpjs)}jv]j c.folio_referencedasbuh1hhj\ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ ubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj\ ubj)}(h vma_flagsh]h vma_flags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjA ubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhj hM!ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj hM!ubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hM!hj hhubj4)}(hhh]jM)}(h!Test if the folio was referenced.h]h!Test if the folio was referenced.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM!hj hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj hM!ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to test. ``int is_locked`` Caller holds lock on the folio. ``struct mem_cgroup *memcg`` target memory cgroup ``vma_flags_t *vma_flags`` A combination of all the vma->flags which referenced the folio. **Description** Quick test_and_clear_referenced for all mappings of a folio, **Return** The number of mappings which referenced the folio. Return -1 if the function bailed out due to rmap lock contention.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM%hj ubj)}(hhh](j)}(h+``struct folio *folio`` The folio to test. h](j)}(h``struct folio *folio``h]jS)}(hj h]hstruct folio *folio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM"hj ubj)}(hhh]jM)}(hThe folio to test.h]hThe folio to test.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hM"hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM"hj ubj)}(h2``int is_locked`` Caller holds lock on the folio. h](j)}(h``int is_locked``h]jS)}(hj@ h]h int is_locked}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj> ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM#hj: ubj)}(hhh]jM)}(hCaller holds lock on the folio.h]hCaller holds lock on the folio.}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjU hM#hjV ubah}(h]h ]h"]h$]h&]uh1jhj: ubeh}(h]h ]h"]h$]h&]uh1jhjU hM#hj ubj)}(h2``struct mem_cgroup *memcg`` target memory cgroup h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hjy h]hstruct mem_cgroup *memcg}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjw ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM$hjs ubj)}(hhh]jM)}(htarget memory cgrouph]htarget memory cgroup}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hM$hj ubah}(h]h ]h"]h$]h&]uh1jhjs ubeh}(h]h ]h"]h$]h&]uh1jhj hM$hj ubj)}(h[``vma_flags_t *vma_flags`` A combination of all the vma->flags which referenced the folio. h](j)}(h``vma_flags_t *vma_flags``h]jS)}(hj h]hvma_flags_t *vma_flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM%hj ubj)}(hhh]jM)}(h?A combination of all the vma->flags which referenced the folio.h]h?A combination of all the vma->flags which referenced the folio.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hM%hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hM%hj ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM'hj ubjM)}(hubj)}(hhh]jM)}(h6The mapping whose reverse mapping should be traversed.h]h6The mapping whose reverse mapping should be traversed.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYhMhjZubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhMhj;ubj)}(hQ``pgoff_t pgoff`` The page offset at which **pfn** is mapped within **mapping**. h](j)}(h``pgoff_t pgoff``h]jS)}(hj}h]h pgoff_t pgoff}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj{ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjwubj)}(hhh]jM)}(h>The page offset at which **pfn** is mapped within **mapping**.h](hThe page offset at which }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is mapped within }(hjhhhNhNubj)}(h **mapping**h]hmapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjhMhj;ubj)}(hN``unsigned long pfn`` The PFN of the page mapped in **mapping** at **pgoff**. h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(h7The PFN of the page mapped in **mapping** at **pgoff**.h](hThe PFN of the page mapped in }(hjhhhNhNubj)}(h **mapping**h]hmapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh at }(hjhhhNhNubj)}(h **pgoff**h]hpgoff}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj;ubj)}(hS``unsigned long nr_pages`` The number of physically contiguous base pages spanned. h](j)}(h``unsigned long nr_pages``h]jS)}(hj7h]hunsigned long nr_pages}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj1ubj)}(hhh]jM)}(h7The number of physically contiguous base pages spanned.h]h7The number of physically contiguous base pages spanned.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhj;ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubjM)}(hX(Traverses the reverse mapping, finding all VMAs which contain a shared mapping of the pages in the specified range in **mapping**, and write-protects them (that is, updates the page tables to mark the mappings read-only such that a write protection fault arises when the mappings are written to).h](hvTraverses the reverse mapping, finding all VMAs which contain a shared mapping of the pages in the specified range in }(hjhhhNhNubj)}(h **mapping**h]hmapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, and write-protects them (that is, updates the page tables to mark the mappings read-only such that a write protection fault arises when the mappings are written to).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubjM)}(hXThe **pfn** value need not refer to a folio, but rather can reference a kernel allocation which is mapped into userland. We therefore do not require that the page maps to a folio with a valid mapping or index field, rather the caller specifies these in **mapping** and **pgoff**.h](hThe }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh value need not refer to a folio, but rather can reference a kernel allocation which is mapped into userland. We therefore do not require that the page maps to a folio with a valid mapping or index field, rather the caller specifies these in }(hjhhhNhNubj)}(h **mapping**h]hmapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **pgoff**h]hpgoff}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubjM)}(h0the number of write-protected PTEs, or an error.h]h0the number of write-protected PTEs, or an error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpfn_mkclean_range (C function)c.pfn_mkclean_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hlint pfn_mkclean_range (unsigned long pfn, unsigned long nr_pages, pgoff_t pgoff, struct vm_area_struct *vma)h]h)}(hkint pfn_mkclean_range(unsigned long pfn, unsigned long nr_pages, pgoff_t pgoff, struct vm_area_struct *vma)h](j)}(hinth]hint}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhjChMubh)}(hpfn_mkclean_rangeh]j)}(hpfn_mkclean_rangeh]hpfn_mkclean_range}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ](jjeh"]h$]h&]jjuh1hhj1hhhjChMubj )}(hV(unsigned long pfn, unsigned long nr_pages, pgoff_t pgoff, struct vm_area_struct *vma)h](j )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubj )}(hunsigned long nr_pagesh](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)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubj )}(h pgoff_t pgoffh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljXsbc.pfn_mkclean_rangeasbuh1hhjubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpgoffh]hpgoff}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj^hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjZubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj~modnameN classnameNjpjs)}jv]j3c.pfn_mkclean_rangeasbuh1hhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjZubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjjubeh}(h]h ]h"]h$]h&]jjuh1j hj1hhhjChMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj-hhhjChMubah}(h]j(ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjChMhj*hhubj4)}(hhh]jM)}(hCleans the PTEs (including PMDs) mapped with range of [**pfn**, **pfn** + **nr_pages**) at the specific offset (**pgoff**) within the **vma** of shared mappings. And since clean PTEs should also be readonly, write protects them too.h](h7Cleans the PTEs (including PMDs) mapped with range of [}(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h**pfn**h]hpfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h **nr_pages**h]hnr_pages}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) at the specific offset (}(hjhhhNhNubj)}(h **pgoff**h]hpgoff}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh ) within the }(hjhhhNhNubj)}(h**vma**h]hvma}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh[ of shared mappings. And since clean PTEs should also be readonly, write protects them too.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj*hhhjChMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjQjHjQjIjJjKuh1hhhhjhNhNubj)}(hXU**Parameters** ``unsigned long pfn`` start pfn. ``unsigned long nr_pages`` number of physically contiguous pages srarting with **pfn**. ``pgoff_t pgoff`` page offset that the **pfn** mapped with. ``struct vm_area_struct *vma`` vma that **pfn** mapped within. **Description** Returns the number of cleaned PTEs (including PMDs).h](jM)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjUubj)}(hhh](j)}(h!``unsigned long pfn`` start pfn. h](j)}(h``unsigned long pfn``h]jS)}(hjzh]hunsigned long pfn}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjtubj)}(hhh]jM)}(h start pfn.h]h start pfn.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhjqubj)}(hX``unsigned long nr_pages`` number of physically contiguous pages srarting with **pfn**. h](j)}(h``unsigned long nr_pages``h]jS)}(hjh]hunsigned long nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(hubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubh)}(hhh]j)}(hfolioh]hfolio}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjbmodnameN classnameNjpjs)}jv]jy)}jlj(sbc.__folio_set_anonasbuh1hhj>ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj>ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j|c.__folio_set_anonasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubj )}(hunsigned long addressh](j)}(hunsignedh]hunsigned}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(haddressh]haddress}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubj )}(hbool exclusiveh](j)}(hj-h]hbool}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h exclusiveh]h exclusive}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj:ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h'set up a new anonymous rmap for a folioh]h'set up a new anonymous rmap for a folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to set up the new anonymous rmap for. ``struct vm_area_struct *vma`` VM area to add the folio to. ``unsigned long address`` User virtual address of the mapping ``bool exclusive`` Whether the folio is exclusive to the process.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh](j)}(hH``struct folio *folio`` The folio to set up the new anonymous rmap for. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(h/The folio to set up the new anonymous rmap for.h]h/The folio to set up the new anonymous rmap for.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h<``struct vm_area_struct *vma`` VM area to add the folio to. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj4h]hstruct vm_area_struct *vma}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj.ubj)}(hhh]jM)}(hVM area to add the folio to.h]hVM area to add the folio to.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhMhjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMhjubj)}(h>``unsigned long address`` User virtual address of the mapping h](j)}(h``unsigned long address``h]jS)}(hjmh]hunsigned long address}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjgubj)}(hhh]jM)}(h#User virtual address of the mappingh]h#User virtual address of the mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``bool exclusive`` Whether the folio is exclusive to the process.h](j)}(h``bool exclusive``h]jS)}(hjh]hbool exclusive}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(h.Whether the folio is exclusive to the process.h]h.Whether the folio is exclusive to the process.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#__page_check_anon_rmap (C function)c.__page_check_anon_rmaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid __page_check_anon_rmap (const struct folio *folio, const struct page *page, struct vm_area_struct *vma, unsigned long address)h]h)}(hvoid __page_check_anon_rmap(const struct folio *folio, const struct page *page, struct vm_area_struct *vma, unsigned long address)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h__page_check_anon_rmaph]j)}(h__page_check_anon_rmaph]h__page_check_anon_rmap}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hg(const struct folio *folio, const struct page *page, struct vm_area_struct *vma, unsigned long address)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hj=hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj9ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj5)}(hj8h]hstruct}(hjXhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj9ubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubh)}(hhh]j)}(hfolioh]hfolio}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjxmodnameN classnameNjpjs)}jv]jy)}jlj#sbc.__page_check_anon_rmapasbuh1hhj9ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj9ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5ubj )}(hconst struct page *pageh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__page_check_anon_rmapasbuh1hhjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj/hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjUhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjQubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjumodnameN classnameNjpjs)}jv]jc.__page_check_anon_rmapasbuh1hhjQubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjQubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5ubj )}(hunsigned long addressh](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)}(haddressh]haddress}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj5ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h$sanity check anonymous rmap additionh]h$sanity check anonymous rmap addition}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj$hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj?jHj?jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio containing **page**. ``const struct page *page`` the page to check the mapping of ``struct vm_area_struct *vma`` the vm area in which the mapping is added ``unsigned long address`` the user virtual address mappedh](jM)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjCubj)}(hhh](j)}(h=``const struct folio *folio`` The folio containing **page**. h](j)}(h``const struct folio *folio``h]jS)}(hjhh]hconst struct folio *folio}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjfubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjbubj)}(hhh]jM)}(hThe folio containing **page**.h](hThe folio containing }(hjhhhNhNubj)}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj}hMhj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj}hMhj_ubj)}(h=``const struct page *page`` the page to check the mapping of h](j)}(h``const struct page *page``h]jS)}(hjh]hconst struct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(h the page to check the mapping ofh]h the page to check the mapping of}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj_ubj)}(hI``struct vm_area_struct *vma`` the vm area in which the mapping is added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(h)the vm area in which the mapping is addedh]h)the vm area in which the mapping is added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj_ubj)}(h9``unsigned long address`` the user virtual address mappedh](j)}(h``unsigned long address``h]jS)}(hj%h]hunsigned long address}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjubj)}(hhh]jM)}(hthe user virtual address mappedh]hthe user virtual address mapped}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhj_ubeh}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%folio_add_anon_rmap_ptes (C function)c.folio_add_anon_rmap_pteshNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid folio_add_anon_rmap_ptes (struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h]h)}(hvoid folio_add_anon_rmap_ptes(struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM2ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhjhM2ubh)}(hfolio_add_anon_rmap_ptesh]j)}(hfolio_add_anon_rmap_ptesh]hfolio_add_anon_rmap_ptes}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj{hhhjhM2ubj )}(hw(struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_add_anon_rmap_ptesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj.hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj*ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubh)}(hhh]j)}(hpageh]hpage}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjNmodnameN classnameNjpjs)}jv]jc.folio_add_anon_rmap_ptesasbuh1hhj*ubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjF )}(hjI h]h*}(hjxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj*ubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h int nr_pagesh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.folio_add_anon_rmap_ptesasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hj* hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addressh](j)}(hunsignedh]hunsigned}(hjC hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj? ubj)}(h h]h }(hjQ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj? ubj)}(hlongh]hlong}(hj_ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj? ubj)}(h h]h }(hjm hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj? ubj)}(haddressh]haddress}(hj{ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj? ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h rmap_t flagsh](h)}(hhh]j)}(hrmap_th]hrmap_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jc.folio_add_anon_rmap_ptesasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hflagsh]hflags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj{hhhjhM2ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjwhhhjhM2ubah}(h]jrah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM2hjthhubj4)}(hhh]jM)}(h1add PTE mappings to a page range of an anon folioh]h1add PTE mappings to a page range of an anon folio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM2hj hhubah}(h]h ]h"]h$]h&]uh1j3hjthhhjhM2ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!jHj!jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to add the mappings to ``struct page *page`` The first page to add ``int nr_pages`` The number of pages which will be mapped ``struct vm_area_struct *vma`` The vm area in which the mappings are added ``unsigned long address`` The user virtual address of the first page to map ``rmap_t flags`` The rmap flags **Description** The page range of folio is defined by [first_page, first_page + nr_pages) The caller needs to hold the page table lock, and the page must be locked in the anon_vma case: to serialize mapping,index checking after setting, and to ensure that an anon folio is not being upgraded racily to a KSM folio (but KSM folios are never downgraded).h](jM)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj !ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM6hj !ubj)}(hhh](j)}(h9``struct folio *folio`` The folio to add the mappings to h](j)}(h``struct folio *folio``h]jS)}(hj.!h]hstruct folio *folio}(hj0!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,!ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM3hj(!ubj)}(hhh]jM)}(h The folio to add the mappings toh]h The folio to add the mappings to}(hjG!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjC!hM3hjD!ubah}(h]h ]h"]h$]h&]uh1jhj(!ubeh}(h]h ]h"]h$]h&]uh1jhjC!hM3hj%!ubj)}(h,``struct page *page`` The first page to add h](j)}(h``struct page *page``h]jS)}(hjg!h]hstruct page *page}(hji!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhje!ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM4hja!ubj)}(hhh]jM)}(hThe first page to addh]hThe first page to add}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|!hM4hj}!ubah}(h]h ]h"]h$]h&]uh1jhja!ubeh}(h]h ]h"]h$]h&]uh1jhj|!hM4hj%!ubj)}(h:``int nr_pages`` The number of pages which will be mapped h](j)}(h``int nr_pages``h]jS)}(hj!h]h int nr_pages}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj!ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM5hj!ubj)}(hhh]jM)}(h(The number of pages which will be mappedh]h(The number of pages which will be mapped}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!hM5hj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hM5hj%!ubj)}(hK``struct vm_area_struct *vma`` The vm area in which the mappings are added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj!h]hstruct vm_area_struct *vma}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj!ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM6hj!ubj)}(hhh]jM)}(h+The vm area in which the mappings are addedh]h+The vm area in which the mappings are added}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!hM6hj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hM6hj%!ubj)}(hL``unsigned long address`` The user virtual address of the first page to map h](j)}(h``unsigned long address``h]jS)}(hj"h]hunsigned long address}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj"ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM7hj "ubj)}(hhh]jM)}(h1The user virtual address of the first page to maph]h1The user virtual address of the first page to map}(hj+"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'"hM7hj("ubah}(h]h ]h"]h$]h&]uh1jhj "ubeh}(h]h ]h"]h$]h&]uh1jhj'"hM7hj%!ubj)}(h ``rmap_t flags`` The rmap flags h](j)}(h``rmap_t flags``h]jS)}(hjK"h]h rmap_t flags}(hjM"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjI"ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM8hjE"ubj)}(hhh]jM)}(hThe rmap flagsh]hThe rmap flags}(hjd"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`"hM8hja"ubah}(h]h ]h"]h$]h&]uh1jhjE"ubeh}(h]h ]h"]h$]h&]uh1jhj`"hM8hj%!ubeh}(h]h ]h"]h$]h&]uh1jhj !ubjM)}(h**Description**h]j)}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM:hj !ubjM)}(hIThe page range of folio is defined by [first_page, first_page + nr_pages)h]hIThe page range of folio is defined by [first_page, first_page + nr_pages)}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM9hj !ubjM)}(hXThe caller needs to hold the page table lock, and the page must be locked in the anon_vma case: to serialize mapping,index checking after setting, and to ensure that an anon folio is not being upgraded racily to a KSM folio (but KSM folios are never downgraded).h]hXThe caller needs to hold the page table lock, and the page must be locked in the anon_vma case: to serialize mapping,index checking after setting, and to ensure that an anon folio is not being upgraded racily to a KSM folio (but KSM folios are never downgraded).}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM;hj !ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$folio_add_anon_rmap_pmd (C function)c.folio_add_anon_rmap_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid folio_add_anon_rmap_pmd (struct folio *folio, struct page *page, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h]h)}(hvoid folio_add_anon_rmap_pmd(struct folio *folio, struct page *page, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h](j)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMJubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj"hMJubh)}(hfolio_add_anon_rmap_pmdh]j)}(hfolio_add_anon_rmap_pmdh]hfolio_add_anon_rmap_pmd}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj"hhhj"hMJubj )}(hi(struct folio *folio, struct page *page, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj#hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj$#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(hfolioh]hfolio}(hj5#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2#ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7#modnameN classnameNjpjs)}jv]jy)}jlj"sbc.folio_add_anon_rmap_pmdasbuh1hhj#ubj)}(h h]h }(hjU#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hjc#hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hfolioh]hfolio}(hjp#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj#hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(hpageh]hpage}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj#modnameN classnameNjpjs)}jv]jQ#c.folio_add_anon_rmap_pmdasbuh1hhj#ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hj#hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hpageh]hpage}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj#hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj$modnameN classnameNjpjs)}jv]jQ#c.folio_add_anon_rmap_pmdasbuh1hhj#ubj)}(h h]h }(hj5$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hjC$hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hvmah]hvma}(hjP$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(hunsigned long addressh](j)}(hunsignedh]hunsigned}(hji$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje$ubj)}(h h]h }(hjw$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje$ubj)}(hlongh]hlong}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje$ubj)}(haddressh]haddress}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubj )}(h rmap_t flagsh](h)}(hhh]j)}(hrmap_th]hrmap_t}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj$modnameN classnameNjpjs)}jv]jQ#c.folio_add_anon_rmap_pmdasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hflagsh]hflags}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubeh}(h]h ]h"]h$]h&]jjuh1j hj"hhhj"hMJubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj"hhhj"hMJubah}(h]j"ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj"hMJhj"hhubj4)}(hhh]jM)}(h2add a PMD mapping to a page range of an anon folioh]h2add a PMD mapping to a page range of an anon folio}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMJhj%hhubah}(h]h ]h"]h$]h&]uh1j3hj"hhhj"hMJubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj+%jHj+%jIjJjKuh1hhhhjhNhNubj)}(hX***Parameters** ``struct folio *folio`` The folio to add the mapping to ``struct page *page`` The first page to add ``struct vm_area_struct *vma`` The vm area in which the mapping is added ``unsigned long address`` The user virtual address of the first page to map ``rmap_t flags`` The rmap flags **Description** The page range of folio is defined by [first_page, first_page + HPAGE_PMD_NR) The caller needs to hold the page table lock, and the page must be locked in the anon_vma case: to serialize mapping,index checking after setting.h](jM)}(h**Parameters**h]j)}(hj5%h]h Parameters}(hj7%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3%ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMNhj/%ubj)}(hhh](j)}(h8``struct folio *folio`` The folio to add the mapping to h](j)}(h``struct folio *folio``h]jS)}(hjT%h]hstruct folio *folio}(hjV%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjR%ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMKhjN%ubj)}(hhh]jM)}(hThe folio to add the mapping toh]hThe folio to add the mapping to}(hjm%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhji%hMKhjj%ubah}(h]h ]h"]h$]h&]uh1jhjN%ubeh}(h]h ]h"]h$]h&]uh1jhji%hMKhjK%ubj)}(h,``struct page *page`` The first page to add h](j)}(h``struct page *page``h]jS)}(hj%h]hstruct page *page}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMLhj%ubj)}(hhh]jM)}(hThe first page to addh]hThe first page to add}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hMLhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMLhjK%ubj)}(hI``struct vm_area_struct *vma`` The vm area in which the mapping is added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj%h]hstruct vm_area_struct *vma}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMMhj%ubj)}(hhh]jM)}(h)The vm area in which the mapping is addedh]h)The vm area in which the mapping is added}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hMMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMMhjK%ubj)}(hL``unsigned long address`` The user virtual address of the first page to map h](j)}(h``unsigned long address``h]jS)}(hj%h]hunsigned long address}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMNhj%ubj)}(hhh]jM)}(h1The user virtual address of the first page to maph]h1The user virtual address of the first page to map}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj&hMNhj&ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj&hMNhjK%ubj)}(h ``rmap_t flags`` The rmap flags h](j)}(h``rmap_t flags``h]jS)}(hj8&h]h rmap_t flags}(hj:&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6&ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMOhj2&ubj)}(hhh]jM)}(hThe rmap flagsh]hThe rmap flags}(hjQ&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjM&hMOhjN&ubah}(h]h ]h"]h$]h&]uh1jhj2&ubeh}(h]h ]h"]h$]h&]uh1jhjM&hMOhjK%ubeh}(h]h ]h"]h$]h&]uh1jhj/%ubjM)}(h**Description**h]j)}(hjs&h]h Description}(hju&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq&ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMQhj/%ubjM)}(hMThe page range of folio is defined by [first_page, first_page + HPAGE_PMD_NR)h]hMThe page range of folio is defined by [first_page, first_page + HPAGE_PMD_NR)}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMPhj/%ubjM)}(hThe caller needs to hold the page table lock, and the page must be locked in the anon_vma case: to serialize mapping,index checking after setting.h]hThe caller needs to hold the page table lock, and the page must be locked in the anon_vma case: to serialize mapping,index checking after setting.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMRhj/%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$folio_add_new_anon_rmap (C function)c.folio_add_new_anon_rmaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hsvoid folio_add_new_anon_rmap (struct folio *folio, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h]h)}(hrvoid folio_add_new_anon_rmap(struct folio *folio, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h](j)}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMbubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhj&hMbubh)}(hfolio_add_new_anon_rmaph]j)}(hfolio_add_new_anon_rmaph]hfolio_add_new_anon_rmap}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj&hhhj&hMbubj )}(hV(struct folio *folio, struct vm_area_struct *vma, unsigned long address, rmap_t flags)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(hfolioh]hfolio}(hj"'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj$'modnameN classnameNjpjs)}jv]jy)}jlj&sbc.folio_add_new_anon_rmapasbuh1hhj'ubj)}(h h]h }(hjB'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubjF )}(hjI h]h*}(hjP'hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj'ubj)}(hfolioh]hfolio}(hj]'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjv'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjr'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr'ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj'modnameN classnameNjpjs)}jv]j>'c.folio_add_new_anon_rmapasbuh1hhjr'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr'ubjF )}(hjI h]h*}(hj'hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjr'ubj)}(hvmah]hvma}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj )}(hunsigned long addressh](j)}(hunsignedh]hunsigned}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hlongh]hlong}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(haddressh]haddress}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubj )}(h rmap_t flagsh](h)}(hhh]j)}(hrmap_th]hrmap_t}(hj:(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7(ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj<(modnameN classnameNjpjs)}jv]j>'c.folio_add_new_anon_rmapasbuh1hhj3(ubj)}(h h]h }(hjX(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3(ubj)}(hflagsh]hflags}(hjf(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&ubeh}(h]h ]h"]h$]h&]jjuh1j hj&hhhj&hMbubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj&hhhj&hMbubah}(h]j&ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj&hMbhj&hhubj4)}(hhh]jM)}(h%Add mapping to a new anonymous folio.h]h%Add mapping to a new anonymous folio.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMbhj(hhubah}(h]h ]h"]h$]h&]uh1j3hj&hhhj&hMbubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj(jHj(jIjJjKuh1hhhhjhNhNubj)}(hXS**Parameters** ``struct folio *folio`` The folio to add the mapping to. ``struct vm_area_struct *vma`` the vm area in which the mapping is added ``unsigned long address`` the user virtual address mapped ``rmap_t flags`` The rmap flags **Description** Like folio_add_anon_rmap_*() but must only be called on *new* folios. This means the inc-and-test can be bypassed. The folio doesn't necessarily need to be locked while it's exclusive unless two threads map it concurrently. However, the folio must be locked if it's shared. If the folio is pmd-mappable, it is accounted as a THP.h](jM)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMfhj(ubj)}(hhh](j)}(h9``struct folio *folio`` The folio to add the mapping to. h](j)}(h``struct folio *folio``h]jS)}(hj(h]hstruct folio *folio}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj(ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMchj(ubj)}(hhh]jM)}(h The folio to add the mapping to.h]h The folio to add the mapping to.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(hMchj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMchj(ubj)}(hI``struct vm_area_struct *vma`` the vm area in which the mapping is added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj )h]hstruct vm_area_struct *vma}(hj )hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMdhj)ubj)}(hhh]jM)}(h)the vm area in which the mapping is addedh]h)the vm area in which the mapping is added}(hj#)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hMdhj )ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMdhj(ubj)}(h:``unsigned long address`` the user virtual address mapped h](j)}(h``unsigned long address``h]jS)}(hjC)h]hunsigned long address}(hjE)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjA)ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMehj=)ubj)}(hhh]jM)}(hthe user virtual address mappedh]hthe user virtual address mapped}(hj\)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjX)hMehjY)ubah}(h]h ]h"]h$]h&]uh1jhj=)ubeh}(h]h ]h"]h$]h&]uh1jhjX)hMehj(ubj)}(h ``rmap_t flags`` The rmap flags h](j)}(h``rmap_t flags``h]jS)}(hj|)h]h rmap_t flags}(hj~)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjz)ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMfhjv)ubj)}(hhh]jM)}(hThe rmap flagsh]hThe rmap flags}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hMfhj)ubah}(h]h ]h"]h$]h&]uh1jhjv)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMfhj(ubeh}(h]h ]h"]h$]h&]uh1jhj(ubjM)}(h**Description**h]j)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhhj(ubjM)}(hXLike folio_add_anon_rmap_*() but must only be called on *new* folios. This means the inc-and-test can be bypassed. The folio doesn't necessarily need to be locked while it's exclusive unless two threads map it concurrently. However, the folio must be locked if it's shared.h](h8Like folio_add_anon_rmap_*() but must only be called on }(hj)hhhNhNubjB)}(h*new*h]hnew}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jAhj)ubh folios. This means the inc-and-test can be bypassed. The folio doesn’t necessarily need to be locked while it’s exclusive unless two threads map it concurrently. However, the folio must be locked if it’s shared.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMghj(ubjM)}(h7If the folio is pmd-mappable, it is accounted as a THP.h]h7If the folio is pmd-mappable, it is accounted as a THP.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMmhj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%folio_add_file_rmap_ptes (C function)c.folio_add_file_rmap_pteshNtauh1hhjhhhNhNubh)}(hhh](h)}(hpvoid folio_add_file_rmap_ptes (struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma)h]h)}(hovoid folio_add_file_rmap_ptes(struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hj,*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*hhhj+*hMubh)}(hfolio_add_file_rmap_ptesh]j)}(hfolio_add_file_rmap_ptesh]hfolio_add_file_rmap_ptes}(hj>*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:*ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj*hhhj+*hMubj )}(hR(struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjZ*hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjV*ubj)}(h h]h }(hjg*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV*ubh)}(hhh]j)}(hfolioh]hfolio}(hjx*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju*ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjz*modnameN classnameNjpjs)}jv]jy)}jlj@*sbc.folio_add_file_rmap_ptesasbuh1hhjV*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV*ubjF )}(hjI h]h*}(hj*hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjV*ubj)}(hfolioh]hfolio}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjV*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjR*ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj*hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubh)}(hhh]j)}(hpageh]hpage}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj*modnameN classnameNjpjs)}jv]j*c.folio_add_file_rmap_ptesasbuh1hhj*ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj*ubj)}(hpageh]hpage}(hj#+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjR*ubj )}(h int nr_pagesh](j)}(hinth]hint}(hj<+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8+ubj)}(h h]h }(hjJ+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8+ubj)}(hnr_pagesh]hnr_pages}(hjX+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjR*ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjq+hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjm+ubj)}(h h]h }(hj~+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm+ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj+modnameN classnameNjpjs)}jv]j*c.folio_add_file_rmap_ptesasbuh1hhjm+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm+ubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjm+ubj)}(hvmah]hvma}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjm+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjR*ubeh}(h]h ]h"]h$]h&]jjuh1j hj*hhhj+*hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj*hhhj+*hMubah}(h]j*ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj+*hMhj*hhubj4)}(hhh]jM)}(h+add PTE mappings to a page range of a folioh]h+add PTE mappings to a page range of a folio}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj+hhubah}(h]h ]h"]h$]h&]uh1j3hj*hhhj+*hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj ,jHj ,jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to add the mappings to ``struct page *page`` The first page to add ``int nr_pages`` The number of pages that will be mapped using PTEs ``struct vm_area_struct *vma`` The vm area in which the mappings are added **Description** The page range of the folio is defined by [page, page + nr_pages) The caller needs to hold the page table lock.h](jM)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj,ubj)}(hhh](j)}(h9``struct folio *folio`` The folio to add the mappings to h](j)}(h``struct folio *folio``h]jS)}(hj3,h]hstruct folio *folio}(hj5,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1,ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj-,ubj)}(hhh]jM)}(h The folio to add the mappings toh]h The folio to add the mappings to}(hjL,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjH,hMhjI,ubah}(h]h ]h"]h$]h&]uh1jhj-,ubeh}(h]h ]h"]h$]h&]uh1jhjH,hMhj*,ubj)}(h,``struct page *page`` The first page to add h](j)}(h``struct page *page``h]jS)}(hjl,h]hstruct page *page}(hjn,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjj,ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjf,ubj)}(hhh]jM)}(hThe first page to addh]hThe first page to add}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhjf,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj*,ubj)}(hD``int nr_pages`` The number of pages that will be mapped using PTEs h](j)}(h``int nr_pages``h]jS)}(hj,h]h int nr_pages}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj,ubj)}(hhh]jM)}(h2The number of pages that will be mapped using PTEsh]h2The number of pages that will be mapped using PTEs}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj*,ubj)}(hK``struct vm_area_struct *vma`` The vm area in which the mappings are added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj,h]hstruct vm_area_struct *vma}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj,ubj)}(hhh]jM)}(h+The vm area in which the mappings are addedh]h+The vm area in which the mappings are added}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,hMhj*,ubeh}(h]h ]h"]h$]h&]uh1jhj,ubjM)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj,ubjM)}(hAThe page range of the folio is defined by [page, page + nr_pages)h]hAThe page range of the folio is defined by [page, page + nr_pages)}(hj/-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj,ubjM)}(h-The caller needs to hold the page table lock.h]h-The caller needs to hold the page table lock.}(hj>-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$folio_add_file_rmap_pmd (C function)c.folio_add_file_rmap_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(havoid folio_add_file_rmap_pmd (struct folio *folio, struct page *page, struct vm_area_struct *vma)h]h)}(h`void folio_add_file_rmap_pmd(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hjm-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji-hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hj|-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji-hhhj{-hMubh)}(hfolio_add_file_rmap_pmdh]j)}(hfolio_add_file_rmap_pmdh]hfolio_add_file_rmap_pmd}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1hhji-hhhj{-hMubj )}(hD(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj-hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(hfolioh]hfolio}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-modnameN classnameNjpjs)}jv]jy)}jlj-sbc.folio_add_file_rmap_pmdasbuh1hhj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubjF )}(hjI h]h*}(hj-hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj-ubj)}(hfolioh]hfolio}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj-ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj.hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj.ubj)}(h h]h }(hj).hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubh)}(hhh]j)}(hpageh]hpage}(hj:.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7.ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj<.modnameN classnameNjpjs)}jv]j-c.folio_add_file_rmap_pmdasbuh1hhj.ubj)}(h h]h }(hjX.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubjF )}(hjI h]h*}(hjf.hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj.ubj)}(hpageh]hpage}(hjs.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj-ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj.hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.modnameN classnameNjpjs)}jv]j-c.folio_add_file_rmap_pmdasbuh1hhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubjF )}(hjI h]h*}(hj.hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj.ubj)}(hvmah]hvma}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj-ubeh}(h]h ]h"]h$]h&]jjuh1j hji-hhhj{-hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hje-hhhj{-hMubah}(h]j`-ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj{-hMhjb-hhubj4)}(hhh]jM)}(h,add a PMD mapping to a page range of a folioh]h,add a PMD mapping to a page range of a folio}(hj /hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj /hhubah}(h]h ]h"]h$]h&]uh1j3hjb-hhhj{-hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj%/jHj%/jIjJjKuh1hhhhjhNhNubj)}(hXK**Parameters** ``struct folio *folio`` The folio to add the mapping to ``struct page *page`` The first page to add ``struct vm_area_struct *vma`` The vm area in which the mapping is added **Description** The page range of the folio is defined by [page, page + HPAGE_PMD_NR) The caller needs to hold the page table lock.h](jM)}(h**Parameters**h]j)}(hj//h]h Parameters}(hj1/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-/ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj)/ubj)}(hhh](j)}(h8``struct folio *folio`` The folio to add the mapping to h](j)}(h``struct folio *folio``h]jS)}(hjN/h]hstruct folio *folio}(hjP/hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjL/ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjH/ubj)}(hhh]jM)}(hThe folio to add the mapping toh]hThe folio to add the mapping to}(hjg/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjc/hMhjd/ubah}(h]h ]h"]h$]h&]uh1jhjH/ubeh}(h]h ]h"]h$]h&]uh1jhjc/hMhjE/ubj)}(h,``struct page *page`` The first page to add h](j)}(h``struct page *page``h]jS)}(hj/h]hstruct page *page}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj/ubj)}(hhh]jM)}(hThe first page to addh]hThe first page to add}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hMhjE/ubj)}(hI``struct vm_area_struct *vma`` The vm area in which the mapping is added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj/h]hstruct vm_area_struct *vma}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj/ubj)}(hhh]jM)}(h)The vm area in which the mapping is addedh]h)The vm area in which the mapping is added}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hMhjE/ubeh}(h]h ]h"]h$]h&]uh1jhj)/ubjM)}(h**Description**h]j)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj)/ubjM)}(hEThe page range of the folio is defined by [page, page + HPAGE_PMD_NR)h]hEThe page range of the folio is defined by [page, page + HPAGE_PMD_NR)}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj)/ubjM)}(h-The caller needs to hold the page table lock.h]h-The caller needs to hold the page table lock.}(hj 0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj)/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$folio_add_file_rmap_pud (C function)c.folio_add_file_rmap_pudhNtauh1hhjhhhNhNubh)}(hhh](h)}(havoid folio_add_file_rmap_pud (struct folio *folio, struct page *page, struct vm_area_struct *vma)h]h)}(h`void folio_add_file_rmap_pud(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hjO0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK0hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hj^0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK0hhhj]0hMubh)}(hfolio_add_file_rmap_pudh]j)}(hfolio_add_file_rmap_pudh]hfolio_add_file_rmap_pud}(hjp0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl0ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjK0hhhj]0hMubj )}(hD(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj0hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(hfolioh]hfolio}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj0modnameN classnameNjpjs)}jv]jy)}jljr0sbc.folio_add_file_rmap_pudasbuh1hhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubjF )}(hjI h]h*}(hj0hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0ubj)}(hfolioh]hfolio}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj0hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj0ubj)}(h h]h }(hj 1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(hpageh]hpage}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1modnameN classnameNjpjs)}jv]j0c.folio_add_file_rmap_pudasbuh1hhj0ubj)}(h h]h }(hj:1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubjF )}(hjI h]h*}(hjH1hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0ubj)}(hpageh]hpage}(hjU1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjn1hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjj1ubj)}(h h]h }(hj{1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj1ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1modnameN classnameNjpjs)}jv]j0c.folio_add_file_rmap_pudasbuh1hhjj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj1ubjF )}(hjI h]h*}(hj1hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjj1ubj)}(hvmah]hvma}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj0ubeh}(h]h ]h"]h$]h&]jjuh1j hjK0hhhj]0hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjG0hhhj]0hMubah}(h]jB0ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj]0hMhjD0hhubj4)}(hhh]jM)}(h,add a PUD mapping to a page range of a folioh]h,add a PUD mapping to a page range of a folio}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj1hhubah}(h]h ]h"]h$]h&]uh1j3hjD0hhhj]0hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj2jHj2jIjJjKuh1hhhhjhNhNubj)}(hXK**Parameters** ``struct folio *folio`` The folio to add the mapping to ``struct page *page`` The first page to add ``struct vm_area_struct *vma`` The vm area in which the mapping is added **Description** The page range of the folio is defined by [page, page + HPAGE_PUD_NR) The caller needs to hold the page table lock.h](jM)}(h**Parameters**h]j)}(hj2fh]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj 2ubj)}(hhh](j)}(h8``struct folio *folio`` The folio to add the mapping to h](j)}(h``struct folio *folio``h]jS)}(hj02h]hstruct folio *folio}(hj22hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.2ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj*2ubj)}(hhh]jM)}(hThe folio to add the mapping toh]hThe folio to add the mapping to}(hjI2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjE2hMhjF2ubah}(h]h ]h"]h$]h&]uh1jhj*2ubeh}(h]h ]h"]h$]h&]uh1jhjE2hMhj'2ubj)}(h,``struct page *page`` The first page to add h](j)}(h``struct page *page``h]jS)}(hji2h]hstruct page *page}(hjk2hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjg2ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjc2ubj)}(hhh]jM)}(hThe first page to addh]hThe first page to add}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhjc2ubeh}(h]h ]h"]h$]h&]uh1jhj~2hMhj'2ubj)}(hI``struct vm_area_struct *vma`` The vm area in which the mapping is added h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj2h]hstruct vm_area_struct *vma}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj2ubj)}(hhh]jM)}(h)The vm area in which the mapping is addedh]h)The vm area in which the mapping is added}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj'2ubeh}(h]h ]h"]h$]h&]uh1jhj 2ubjM)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj 2ubjM)}(hEThe page range of the folio is defined by [page, page + HPAGE_PUD_NR)h]hEThe page range of the folio is defined by [page, page + HPAGE_PUD_NR)}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj 2ubjM)}(h-The caller needs to hold the page table lock.h]h-The caller needs to hold the page table lock.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj 2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#folio_remove_rmap_ptes (C function)c.folio_remove_rmap_pteshNtauh1hhjhhhNhNubh)}(hhh](h)}(hnvoid folio_remove_rmap_ptes (struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma)h]h)}(hmvoid folio_remove_rmap_ptes(struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hj13hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-3hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMeubj)}(h h]h }(hj@3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-3hhhj?3hMeubh)}(hfolio_remove_rmap_ptesh]j)}(hfolio_remove_rmap_ptesh]hfolio_remove_rmap_ptes}(hjR3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN3ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj-3hhhj?3hMeubj )}(hR(struct folio *folio, struct page *page, int nr_pages, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjn3hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjj3ubj)}(h h]h }(hj{3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj3ubh)}(hhh]j)}(hfolioh]hfolio}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj3modnameN classnameNjpjs)}jv]jy)}jljT3sbc.folio_remove_rmap_ptesasbuh1hhjj3ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj3ubjF )}(hjI h]h*}(hj3hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjj3ubj)}(hfolioh]hfolio}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjf3ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj3hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj3ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubh)}(hhh]j)}(hpageh]hpage}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj4modnameN classnameNjpjs)}jv]j3c.folio_remove_rmap_ptesasbuh1hhj3ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubjF )}(hjI h]h*}(hj*4hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj3ubj)}(hpageh]hpage}(hj74hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjf3ubj )}(h int nr_pagesh](j)}(hinth]hint}(hjP4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL4ubj)}(h h]h }(hj^4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL4ubj)}(hnr_pagesh]hnr_pages}(hjl4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjf3ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj4hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj4modnameN classnameNjpjs)}jv]j3c.folio_remove_rmap_ptesasbuh1hhj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubjF )}(hjI h]h*}(hj4hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj4ubj)}(hvmah]hvma}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjf3ubeh}(h]h ]h"]h$]h&]jjuh1j hj-3hhhj?3hMeubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj)3hhhj?3hMeubah}(h]j$3ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj?3hMehj&3hhubj4)}(hhh]jM)}(h0remove PTE mappings from a page range of a folioh]h0remove PTE mappings from a page range of a folio}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMehj5hhubah}(h]h ]h"]h$]h&]uh1j3hj&3hhhj?3hMeubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj5jHj5jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to remove the mappings from ``struct page *page`` The first page to remove ``int nr_pages`` The number of pages that will be removed from the mapping ``struct vm_area_struct *vma`` The vm area from which the mappings are removed **Description** The page range of the folio is defined by [page, page + nr_pages) The caller needs to hold the page table lock.h](jM)}(h**Parameters**h]j)}(hj(5h]h Parameters}(hj*5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&5ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMihj"5ubj)}(hhh](j)}(h>``struct folio *folio`` The folio to remove the mappings from h](j)}(h``struct folio *folio``h]jS)}(hjG5h]hstruct folio *folio}(hjI5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjE5ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMfhjA5ubj)}(hhh]jM)}(h%The folio to remove the mappings fromh]h%The folio to remove the mappings from}(hj`5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj\5hMfhj]5ubah}(h]h ]h"]h$]h&]uh1jhjA5ubeh}(h]h ]h"]h$]h&]uh1jhj\5hMfhj>5ubj)}(h/``struct page *page`` The first page to remove h](j)}(h``struct page *page``h]jS)}(hj5h]hstruct page *page}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~5ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMghjz5ubj)}(hhh]jM)}(hThe first page to removeh]hThe first page to remove}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5hMghj5ubah}(h]h ]h"]h$]h&]uh1jhjz5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMghj>5ubj)}(hK``int nr_pages`` The number of pages that will be removed from the mapping h](j)}(h``int nr_pages``h]jS)}(hj5h]h int nr_pages}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhhj5ubj)}(hhh]jM)}(h9The number of pages that will be removed from the mappingh]h9The number of pages that will be removed from the mapping}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5hMhhj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMhhj>5ubj)}(hO``struct vm_area_struct *vma`` The vm area from which the mappings are removed h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj5h]hstruct vm_area_struct *vma}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMihj5ubj)}(hhh]jM)}(h/The vm area from which the mappings are removedh]h/The vm area from which the mappings are removed}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hMihj6ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj6hMihj>5ubeh}(h]h ]h"]h$]h&]uh1jhj"5ubjM)}(h**Description**h]j)}(hj-6h]h Description}(hj/6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+6ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMkhj"5ubjM)}(hAThe page range of the folio is defined by [page, page + nr_pages)h]hAThe page range of the folio is defined by [page, page + nr_pages)}(hjC6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMjhj"5ubjM)}(h-The caller needs to hold the page table lock.h]h-The caller needs to hold the page table lock.}(hjR6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMlhj"5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"folio_remove_rmap_pmd (C function)c.folio_remove_rmap_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(h_void folio_remove_rmap_pmd (struct folio *folio, struct page *page, struct vm_area_struct *vma)h]h)}(h^void folio_remove_rmap_pmd(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}6hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMvubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}6hhhj6hMvubh)}(hfolio_remove_rmap_pmdh]j)}(hfolio_remove_rmap_pmdh]hfolio_remove_rmap_pmd}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj}6hhhj6hMvubj )}(hD(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj6hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(hfolioh]hfolio}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj6modnameN classnameNjpjs)}jv]jy)}jlj6sbc.folio_remove_rmap_pmdasbuh1hhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjF )}(hjI h]h*}(hj 7hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj6ubj)}(hfolioh]hfolio}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj07hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj,7ubj)}(h h]h }(hj=7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,7ubh)}(hhh]j)}(hpageh]hpage}(hjN7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjK7ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjP7modnameN classnameNjpjs)}jv]j6c.folio_remove_rmap_pmdasbuh1hhj,7ubj)}(h h]h }(hjl7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,7ubjF )}(hjI h]h*}(hjz7hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj,7ubj)}(hpageh]hpage}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj7hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7modnameN classnameNjpjs)}jv]j6c.folio_remove_rmap_pmdasbuh1hhj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubjF )}(hjI h]h*}(hj7hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj7ubj)}(hvmah]hvma}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubeh}(h]h ]h"]h$]h&]jjuh1j hj}6hhhj6hMvubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjy6hhhj6hMvubah}(h]jt6ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj6hMvhjv6hhubj4)}(hhh]jM)}(h1remove a PMD mapping from a page range of a folioh]h1remove a PMD mapping from a page range of a folio}(hj!8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMvhj8hhubah}(h]h ]h"]h$]h&]uh1j3hjv6hhhj6hMvubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj98jHj98jIjJjKuh1hhhhjhNhNubj)}(hXW**Parameters** ``struct folio *folio`` The folio to remove the mapping from ``struct page *page`` The first page to remove ``struct vm_area_struct *vma`` The vm area from which the mapping is removed **Description** The page range of the folio is defined by [page, page + HPAGE_PMD_NR) The caller needs to hold the page table lock.h](jM)}(h**Parameters**h]j)}(hjC8h]h Parameters}(hjE8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA8ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMzhj=8ubj)}(hhh](j)}(h=``struct folio *folio`` The folio to remove the mapping from h](j)}(h``struct folio *folio``h]jS)}(hjb8h]hstruct folio *folio}(hjd8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`8ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMwhj\8ubj)}(hhh]jM)}(h$The folio to remove the mapping fromh]h$The folio to remove the mapping from}(hj{8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjw8hMwhjx8ubah}(h]h ]h"]h$]h&]uh1jhj\8ubeh}(h]h ]h"]h$]h&]uh1jhjw8hMwhjY8ubj)}(h/``struct page *page`` The first page to remove h](j)}(h``struct page *page``h]jS)}(hj8h]hstruct page *page}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj8ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMxhj8ubj)}(hhh]jM)}(hThe first page to removeh]hThe first page to remove}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj8hMxhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMxhjY8ubj)}(hM``struct vm_area_struct *vma`` The vm area from which the mapping is removed h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj8h]hstruct vm_area_struct *vma}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj8ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMyhj8ubj)}(hhh]jM)}(h-The vm area from which the mapping is removedh]h-The vm area from which the mapping is removed}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj8hMyhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMyhjY8ubeh}(h]h ]h"]h$]h&]uh1jhj=8ubjM)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 9ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM{hj=8ubjM)}(hEThe page range of the folio is defined by [page, page + HPAGE_PMD_NR)h]hEThe page range of the folio is defined by [page, page + HPAGE_PMD_NR)}(hj%9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMzhj=8ubjM)}(h-The caller needs to hold the page table lock.h]h-The caller needs to hold the page table lock.}(hj49hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM|hj=8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"folio_remove_rmap_pud (C function)c.folio_remove_rmap_pudhNtauh1hhjhhhNhNubh)}(hhh](h)}(h_void folio_remove_rmap_pud (struct folio *folio, struct page *page, struct vm_area_struct *vma)h]h)}(h^void folio_remove_rmap_pud(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hjc9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_9hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMubj)}(h h]h }(hjr9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_9hhhjq9hMubh)}(hfolio_remove_rmap_pudh]j)}(hfolio_remove_rmap_pudh]hfolio_remove_rmap_pud}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj_9hhhjq9hMubj )}(hD(struct folio *folio, struct page *page, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj9hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubh)}(hhh]j)}(hfolioh]hfolio}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]jy)}jlj9sbc.folio_remove_rmap_pudasbuh1hhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubjF )}(hjI h]h*}(hj9hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj9ubj)}(hfolioh]hfolio}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj9ubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj:hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubh)}(hhh]j)}(hpageh]hpage}(hj0:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-:ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj2:modnameN classnameNjpjs)}jv]j9c.folio_remove_rmap_pudasbuh1hhj:ubj)}(h h]h }(hjN:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubjF )}(hjI h]h*}(hj\:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj:ubj)}(hpageh]hpage}(hji:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj9ubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hj:hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~:ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj:modnameN classnameNjpjs)}jv]j9c.folio_remove_rmap_pudasbuh1hhj~:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~:ubjF )}(hjI h]h*}(hj:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj~:ubj)}(hvmah]hvma}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj9ubeh}(h]h ]h"]h$]h&]jjuh1j hj_9hhhjq9hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj[9hhhjq9hMubah}(h]jV9ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjq9hMhjX9hhubj4)}(hhh]jM)}(h1remove a PUD mapping from a page range of a folioh]h1remove a PUD mapping from a page range of a folio}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;hhubah}(h]h ]h"]h$]h&]uh1j3hjX9hhhjq9hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj;jHj;jIjJjKuh1hhhhjhNhNubj)}(hXW**Parameters** ``struct folio *folio`` The folio to remove the mapping from ``struct page *page`` The first page to remove ``struct vm_area_struct *vma`` The vm area from which the mapping is removed **Description** The page range of the folio is defined by [page, page + HPAGE_PUD_NR) The caller needs to hold the page table lock.h](jM)}(h**Parameters**h]j)}(hj%;h]h Parameters}(hj';hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#;ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;ubj)}(hhh](j)}(h=``struct folio *folio`` The folio to remove the mapping from h](j)}(h``struct folio *folio``h]jS)}(hjD;h]hstruct folio *folio}(hjF;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjB;ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj>;ubj)}(hhh]jM)}(h$The folio to remove the mapping fromh]h$The folio to remove the mapping from}(hj];hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjY;hMhjZ;ubah}(h]h ]h"]h$]h&]uh1jhj>;ubeh}(h]h ]h"]h$]h&]uh1jhjY;hMhj;;ubj)}(h/``struct page *page`` The first page to remove h](j)}(h``struct page *page``h]jS)}(hj};h]hstruct page *page}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj{;ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhjw;ubj)}(hhh]jM)}(hThe first page to removeh]hThe first page to remove}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jhjw;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhj;;ubj)}(hM``struct vm_area_struct *vma`` The vm area from which the mapping is removed h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj;h]hstruct vm_area_struct *vma}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;ubj)}(hhh]jM)}(h-The vm area from which the mapping is removedh]h-The vm area from which the mapping is removed}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhj;;ubeh}(h]h ]h"]h$]h&]uh1jhj;ubjM)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;ubjM)}(hEThe page range of the folio is defined by [page, page + HPAGE_PUD_NR)h]hEThe page range of the folio is defined by [page, page + HPAGE_PUD_NR)}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;ubjM)}(h-The caller needs to hold the page table lock.h]h-The caller needs to hold the page table lock.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chMhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htry_to_unmap (C function)c.try_to_unmaphNtauh1hhjhhhNhNubh)}(hhh](h)}(h=void try_to_unmap (struct folio *folio, enum ttu_flags flags)h]h)}(h=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjz<ubeh}(h]h ]h"]h$]h&]jjuh1j hjA<hhhjS<hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj=<hhhjS<hM ubah}(h]j8<ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjS<hM hj:<hhubj4)}(hhh]jM)}(h1Try to remove all page table mappings to a folio.h]h1Try to remove all page table mappings to a folio.}(hjh=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hje=hhubah}(h]h ]h"]h$]h&]uh1j3hj:<hhhjS<hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj=jHj=jIjJjKuh1hhhhjhNhNubj)}(hXs**Parameters** ``struct folio *folio`` The folio to unmap. ``enum ttu_flags flags`` action and flags **Description** Tries to remove all the page table entries which are mapping this folio. It is the caller's responsibility to check if the folio is still mapped if needed (use TTU_SYNC to prevent accounting races). **Context** Caller must hold the folio lock.h](jM)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubj)}(hhh](j)}(h,``struct folio *folio`` The folio to unmap. h](j)}(h``struct folio *folio``h]jS)}(hj=h]hstruct folio *folio}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj=ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubj)}(hhh]jM)}(hThe folio to unmap.h]hThe folio to unmap.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hM hj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM hj=ubj)}(h*``enum ttu_flags flags`` action and flags h](j)}(h``enum ttu_flags flags``h]jS)}(hj=h]henum ttu_flags flags}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj=ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubj)}(hhh]jM)}(haction and flagsh]haction and flags}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hM hj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hM hj=ubeh}(h]h ]h"]h$]h&]uh1jhj=ubjM)}(h**Description**h]j)}(hj>h]h Description}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubjM)}(hTries to remove all the page table entries which are mapping this folio. It is the caller's responsibility to check if the folio is still mapped if needed (use TTU_SYNC to prevent accounting races).h]hTries to remove all the page table entries which are mapping this folio. It is the caller’s responsibility to check if the folio is still mapped if needed (use TTU_SYNC to prevent accounting races).}(hj3>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubjM)}(h **Context**h]j)}(hjD>h]hContext}(hjF>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB>ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubjM)}(h Caller must hold the folio lock.h]h Caller must hold the folio lock.}(hjZ>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htry_to_migrate (C function)c.try_to_migratehNtauh1hhjhhhNhNubh)}(hhh](h)}(h?void try_to_migrate (struct folio *folio, enum ttu_flags flags)h]h)}(h>void try_to_migrate(struct folio *folio, enum ttu_flags flags)h](j)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhj>hM ubh)}(htry_to_migrateh]j)}(htry_to_migrateh]htry_to_migrate}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj>hhhj>hM ubj )}(h+(struct folio *folio, enum ttu_flags flags)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj>hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubh)}(hhh]j)}(hfolioh]hfolio}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj>modnameN classnameNjpjs)}jv]jy)}jlj>sbc.try_to_migrateasbuh1hhj>ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubjF )}(hjI h]h*}(hj?hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj>ubj)}(hfolioh]hfolio}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj>ubj )}(henum ttu_flags flagsh](j5)}(hjh]henum}(hj8?hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj4?ubj)}(h h]h }(hjE?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4?ubh)}(hhh]j)}(h ttu_flagsh]h ttu_flags}(hjV?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS?ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjX?modnameN classnameNjpjs)}jv]j?c.try_to_migrateasbuh1hhj4?ubj)}(h h]h }(hjt?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4?ubj)}(hflagsh]hflags}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj>ubeh}(h]h ]h"]h$]h&]jjuh1j hj>hhhj>hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj>hhhj>hM ubah}(h]j|>ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj>hM hj~>hhubj4)}(hhh]jM)}(h8try to replace all page table mappings with swap entriesh]h8try to replace all page table mappings with swap entries}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj?hhubah}(h]h ]h"]h$]h&]uh1j3hj~>hhhj>hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj?jHj?jIjJjKuh1hhhhjhNhNubj)}(hX)**Parameters** ``struct folio *folio`` the folio to replace page table entries for ``enum ttu_flags flags`` action and flags **Description** Tries to remove all the page table entries which are mapping this folio and replace them with special swap entries. Caller must hold the folio lock.h](jM)}(h**Parameters**h]j)}(hj?h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj?ubj)}(hhh](j)}(hD``struct folio *folio`` the folio to replace page table entries for h](j)}(h``struct folio *folio``h]jS)}(hj?h]hstruct folio *folio}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj?ubj)}(hhh]jM)}(h+the folio to replace page table entries forh]h+the folio to replace page table entries for}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hM hj@ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hj?ubj)}(h*``enum ttu_flags flags`` action and flags h](j)}(h``enum ttu_flags flags``h]jS)}(hj&@h]henum ttu_flags flags}(hj(@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj$@ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj @ubj)}(hhh]jM)}(haction and flagsh]haction and flags}(hj?@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;@hM hj<@ubah}(h]h ]h"]h$]h&]uh1jhj @ubeh}(h]h ]h"]h$]h&]uh1jhj;@hM hj?ubeh}(h]h ]h"]h$]h&]uh1jhj?ubjM)}(h**Description**h]j)}(hja@h]h Description}(hjc@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_@ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj?ubjM)}(hTries to remove all the page table entries which are mapping this folio and replace them with special swap entries. Caller must hold the folio lock.h]hTries to remove all the page table entries which are mapping this folio and replace them with special swap entries. Caller must hold the folio lock.}(hjw@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"make_device_exclusive (C function)c.make_device_exclusivehNtauh1hhjhhhNhNubh)}(hhh](h)}(hrstruct page * make_device_exclusive (struct mm_struct *mm, unsigned long addr, void *owner, struct folio **foliop)h]h)}(hpstruct page *make_device_exclusive(struct mm_struct *mm, unsigned long addr, void *owner, struct folio **foliop)h](j5)}(hj8h]hstruct}(hj@hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj@hhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj@hM ubh)}(hhh]j)}(hpageh]hpage}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@modnameN classnameNjpjs)}jv]jy)}jlmake_device_exclusivesbc.make_device_exclusiveasbuh1hhj@hhhj@hM ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj@hM ubjF )}(hjI h]h*}(hj@hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj@hhhj@hM ubh)}(hmake_device_exclusiveh]j)}(hj@h]hmake_device_exclusive}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1hhj@hhhj@hM ubj )}(hN(struct mm_struct *mm, unsigned long addr, void *owner, struct folio **foliop)h](j )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hj AhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjAubj)}(h h]h }(hj-AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubh)}(hhh]j)}(h mm_structh]h mm_struct}(hj>AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;Aubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@AmodnameN classnameNjpjs)}jv]j@c.make_device_exclusiveasbuh1hhjAubj)}(h h]h }(hj\AhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjF )}(hjI h]h*}(hjjAhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjAubj)}(hmmh]hmm}(hjwAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(hlongh]hlong}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(haddrh]haddr}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubj )}(h void *ownerh](j)}(hvoidh]hvoid}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubjF )}(hjI h]h*}(hjAhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjAubj)}(hownerh]howner}(hj BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubj )}(hstruct folio **folioph](j5)}(hj8h]hstruct}(hj#BhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjBubj)}(h h]h }(hj0BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubh)}(hhh]j)}(hfolioh]hfolio}(hjABhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Bubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjCBmodnameN classnameNjpjs)}jv]j@c.make_device_exclusiveasbuh1hhjBubj)}(h h]h }(hj_BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubjF )}(hjI h]h*}(hjmBhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjBubjF )}(hjI h]h*}(hjzBhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjBubj)}(hfolioph]hfoliop}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjAubeh}(h]h ]h"]h$]h&]jjuh1j hj@hhhj@hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj@hhhj@hM ubah}(h]j@ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj@hM hj@hhubj4)}(hhh]jM)}(h)Mark a page for exclusive use by a deviceh]h)Mark a page for exclusive use by a device}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBhhubah}(h]h ]h"]h$]h&]uh1j3hj@hhhj@hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjBjHjBjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mm_struct *mm`` mm_struct of associated target process ``unsigned long addr`` the virtual address to mark for exclusive device access ``void *owner`` passed to MMU_NOTIFY_EXCLUSIVE range notifier to allow filtering ``struct folio **foliop`` folio pointer will be stored here on success. **Description** This function looks up the page mapped at the given address, grabs a folio reference, locks the folio and replaces the PTE with special device-exclusive PFN swap entry, preventing access through the process page tables. The function will return with the folio locked and referenced. On fault, the device-exclusive entries are replaced with the original PTE under folio lock, after calling MMU notifiers. Only anonymous non-hugetlb folios are supported and the VMA must have write permissions such that we can fault in the anonymous page writable in order to mark it exclusive. The caller must hold the mmap_lock in read mode. A driver using this to program access from a device must use a mmu notifier critical section to hold a device specific lock during programming. Once programming is complete it should drop the folio lock and reference after which point CPU access to the page will revoke the exclusive access. **Notes** #. This function always operates on individual PTEs mapping individual pages. PMD-sized THPs are first remapped to be mapped by PTEs before the conversion happens on a single PTE corresponding to **addr**. #. While concurrent access through the process page tables is prevented, concurrent access through other page references (e.g., earlier GUP invocation) is not handled and not supported. #. device-exclusive entries are considered "clean" and "old" by core-mm. Device drivers must update the folio state when informed by MMU notifiers. **Return** pointer to mapped page on success, otherwise a negative error.h](jM)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBubj)}(hhh](j)}(h@``struct mm_struct *mm`` mm_struct of associated target process h](j)}(h``struct mm_struct *mm``h]jS)}(hjBh]hstruct mm_struct *mm}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjBubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBubj)}(hhh]jM)}(h&mm_struct of associated target processh]h&mm_struct of associated target process}(hj ChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChM hjCubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhjChM hjBubj)}(hO``unsigned long addr`` the virtual address to mark for exclusive device access h](j)}(h``unsigned long addr``h]jS)}(hj+Ch]hunsigned long addr}(hj-ChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)Cubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj%Cubj)}(hhh]jM)}(h7the virtual address to mark for exclusive device accessh]h7the virtual address to mark for exclusive device access}(hjDChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@ChM hjACubah}(h]h ]h"]h$]h&]uh1jhj%Cubeh}(h]h ]h"]h$]h&]uh1jhj@ChM hjBubj)}(hQ``void *owner`` passed to MMU_NOTIFY_EXCLUSIVE range notifier to allow filtering h](j)}(h``void *owner``h]jS)}(hjdCh]h void *owner}(hjfChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbCubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hj^Cubj)}(hhh]jM)}(h@passed to MMU_NOTIFY_EXCLUSIVE range notifier to allow filteringh]h@passed to MMU_NOTIFY_EXCLUSIVE range notifier to allow filtering}(hj}ChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyChM hjzCubah}(h]h ]h"]h$]h&]uh1jhj^Cubeh}(h]h ]h"]h$]h&]uh1jhjyChM hjBubj)}(hH``struct folio **foliop`` folio pointer will be stored here on success. h](j)}(h``struct folio **foliop``h]jS)}(hjCh]hstruct folio **foliop}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjCubj)}(hhh]jM)}(h-folio pointer will be stored here on success.h]h-folio pointer will be stored here on success.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChM hjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhjChM hjBubeh}(h]h ]h"]h$]h&]uh1jhjBubjM)}(h**Description**h]j)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBubjM)}(hXThis function looks up the page mapped at the given address, grabs a folio reference, locks the folio and replaces the PTE with special device-exclusive PFN swap entry, preventing access through the process page tables. The function will return with the folio locked and referenced.h]hXThis function looks up the page mapped at the given address, grabs a folio reference, locks the folio and replaces the PTE with special device-exclusive PFN swap entry, preventing access through the process page tables. The function will return with the folio locked and referenced.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBubjM)}(hxOn fault, the device-exclusive entries are replaced with the original PTE under folio lock, after calling MMU notifiers.h]hxOn fault, the device-exclusive entries are replaced with the original PTE under folio lock, after calling MMU notifiers.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBubjM)}(hOnly anonymous non-hugetlb folios are supported and the VMA must have write permissions such that we can fault in the anonymous page writable in order to mark it exclusive. The caller must hold the mmap_lock in read mode.h]hOnly anonymous non-hugetlb folios are supported and the VMA must have write permissions such that we can fault in the anonymous page writable in order to mark it exclusive. The caller must hold the mmap_lock in read mode.}(hj DhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM hjBubjM)}(hX#A driver using this to program access from a device must use a mmu notifier critical section to hold a device specific lock during programming. Once programming is complete it should drop the folio lock and reference after which point CPU access to the page will revoke the exclusive access.h]hX#A driver using this to program access from a device must use a mmu notifier critical section to hold a device specific lock during programming. Once programming is complete it should drop the folio lock and reference after which point CPU access to the page will revoke the exclusive access.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM" hjBubjM)}(h **Notes**h]j)}(hj,Dh]hNotes}(hj.DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*Dubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM' hjBubji)}(hX.#. This function always operates on individual PTEs mapping individual pages. PMD-sized THPs are first remapped to be mapped by PTEs before the conversion happens on a single PTE corresponding to **addr**. #. While concurrent access through the process page tables is prevented, concurrent access through other page references (e.g., earlier GUP invocation) is not handled and not supported. #. device-exclusive entries are considered "clean" and "old" by core-mm. Device drivers must update the folio state when informed by MMU notifiers. h]j/)}(hhh](j/)}(hThis function always operates on individual PTEs mapping individual pages. PMD-sized THPs are first remapped to be mapped by PTEs before the conversion happens on a single PTE corresponding to **addr**.h]jM)}(hThis function always operates on individual PTEs mapping individual pages. PMD-sized THPs are first remapped to be mapped by PTEs before the conversion happens on a single PTE corresponding to **addr**.h](hThis function always operates on individual PTEs mapping individual pages. PMD-sized THPs are first remapped to be mapped by PTEs before the conversion happens on a single PTE corresponding to }(hjMDhhhNhNubj)}(h**addr**h]haddr}(hjUDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMDubh.}(hjMDhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM( hjIDubah}(h]h ]h"]h$]h&]uh1j/hjFDubj/)}(hWhile concurrent access through the process page tables is prevented, concurrent access through other page references (e.g., earlier GUP invocation) is not handled and not supported.h]jM)}(hWhile concurrent access through the process page tables is prevented, concurrent access through other page references (e.g., earlier GUP invocation) is not handled and not supported.h]hWhile concurrent access through the process page tables is prevented, concurrent access through other page references (e.g., earlier GUP invocation) is not handled and not supported.}(hjxDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM+ hjtDubah}(h]h ]h"]h$]h&]uh1j/hjFDubj/)}(hdevice-exclusive entries are considered "clean" and "old" by core-mm. Device drivers must update the folio state when informed by MMU notifiers. h]jM)}(hdevice-exclusive entries are considered "clean" and "old" by core-mm. Device drivers must update the folio state when informed by MMU notifiers.h]hdevice-exclusive entries are considered “clean” and “old” by core-mm. Device drivers must update the folio state when informed by MMU notifiers.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM. hjDubah}(h]h ]h"]h$]h&]uh1j/hjFDubeh}(h]h ]h"]h$]h&]j>0j?0j@0hjA0jB0uh1j/hjBDubah}(h]h ]h"]h$]h&]uh1jhhjmDhM( hjBubjM)}(h **Return**h]j)}(hjDh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM2 hjBubjM)}(h>pointer to mapped page on success, otherwise a negative error.h]h>pointer to mapped page on success, otherwise a negative error.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM3 hjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__rmap_walk_file (C function)c.__rmap_walk_filehNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid __rmap_walk_file (struct folio *folio, struct address_space *mapping, pgoff_t pgoff_start, unsigned long nr_pages, struct rmap_walk_control *rwc, bool locked)h]h)}(hvoid __rmap_walk_file(struct folio *folio, struct address_space *mapping, pgoff_t pgoff_start, unsigned long nr_pages, struct rmap_walk_control *rwc, bool locked)h](j)}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:114: ./mm/rmap.chM ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjEhM ubh)}(h__rmap_walk_fileh]j)}(h__rmap_walk_fileh]h__rmap_walk_file}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ](jjeh"]h$]h&]jjuh1hhjDhhhjEhM ubj )}(h(struct folio *folio, struct address_space *mapping, pgoff_t pgoff_start, unsigned long nr_pages, struct rmap_walk_control *rwc, bool locked)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj6EhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj2Eubj)}(h h]h }(hjCEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Eubh)}(hhh]j)}(hfolioh]hfolio}(hjTEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQEubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjVEmodnameN classnameNjpjs)}jv]jy)}jljEsbc.__rmap_walk_fileasbuh1hhj2Eubj)}(h h]h }(hjtEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2EubjF )}(hjI h]h*}(hjEhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj2Eubj)}(hfolioh]hfolio}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2Eubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj.Eubj )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjEhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(h address_spaceh]h address_space}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jpEc.__rmap_walk_fileasbuh1hhjEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubjF )}(hjI h]h*}(hjEhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjEubj)}(hmappingh]hmapping}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj.Eubj )}(hpgoff_t pgoff_starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjFmodnameN classnameNjpjs)}jv]jpEc.__rmap_walk_fileasbuh1hhjFubj)}(h h]h }(hj9FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h pgoff_starth]h pgoff_start}(hjGFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj.Eubj )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hj`FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\Fubj)}(h h]h }(hjnFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\Fubj)}(hlongh]hlong}(hj|FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\Fubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\Fubj)}(hnr_pagesh]hnr_pages}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\Fubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj.Eubj )}(hstruct rmap_walk_control *rwch](j5)}(hj8h]hstruct}(hjFhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(hrmap_walk_controlh]hrmap_walk_control}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjFmodnameN classnameNjpjs)}jv]jpEc.__rmap_walk_fileasbuh1hhjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjF )}(hjI h]h*}(hjFhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjFubj)}(hrwch]hrwc}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj.Eubj )}(h bool lockedh](j)}(hj-h]hbool}(hj!GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(h h]h }(hj.GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hlockedh]hlocked}(hjmm->mmap_lock. **Return** Either an error, or the address at which the requested mapping has been performed.h](jM)}(h**Parameters**h]j)}(hjC_h]h Parameters}(hjE_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA_ubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMhj=_ubj)}(hhh](j)}(h{``struct file *file`` An optional struct file pointer describing the file which is to be mapped, if a file-backed mapping. h](j)}(h``struct file *file``h]jS)}(hjb_h]hstruct file *file}(hjd_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`_ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM:hj\_ubj)}(hhh]jM)}(hdAn optional struct file pointer describing the file which is to be mapped, if a file-backed mapping.h]hdAn optional struct file pointer describing the file which is to be mapped, if a file-backed mapping.}(hj{_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM9hjx_ubah}(h]h ]h"]h$]h&]uh1jhj\_ubeh}(h]h ]h"]h$]h&]uh1jhjw_hM:hjY_ubj)}(h``unsigned long addr`` If non-zero, hints at (or if **flags** has MAP_FIXED set, specifies) the address at which to perform this mapping. See mmap (2) for details. Must be page-aligned. h](j)}(h``unsigned long addr``h]jS)}(hj_h]hunsigned long addr}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM=hj_ubj)}(hhh]jM)}(hIf non-zero, hints at (or if **flags** has MAP_FIXED set, specifies) the address at which to perform this mapping. See mmap (2) for details. Must be page-aligned.h](hIf non-zero, hints at (or if }(hj_hhhNhNubj)}(h **flags**h]hflags}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh| has MAP_FIXED set, specifies) the address at which to perform this mapping. See mmap (2) for details. Must be page-aligned.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM;hj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hM=hjY_ubj)}(hk``unsigned long len`` The length of the mapping. Will be page-aligned and must be at least 1 page in size. h](j)}(h``unsigned long len``h]jS)}(hj_h]hunsigned long len}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM?hj_ubj)}(hhh]jM)}(hTThe length of the mapping. Will be page-aligned and must be at least 1 page in size.h]hTThe length of the mapping. Will be page-aligned and must be at least 1 page in size.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM>hj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hM?hjY_ubj)}(hl``unsigned long prot`` Protection bits describing access required to the mapping. See mmap (2) for details. h](j)}(h``unsigned long prot``h]jS)}(hj"`h]hunsigned long prot}(hj$`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj `ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMAhj`ubj)}(hhh]jM)}(hTProtection bits describing access required to the mapping. See mmap (2) for details.h]hTProtection bits describing access required to the mapping. See mmap (2) for details.}(hj;`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM@hj8`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj7`hMAhjY_ubj)}(hh``unsigned long flags`` Flags specifying how the mapping should be performed, see mmap (2) for details. h](j)}(h``unsigned long flags``h]jS)}(hj\`h]hunsigned long flags}(hj^`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZ`ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMChjV`ubj)}(hhh]jM)}(hOFlags specifying how the mapping should be performed, see mmap (2) for details.h]hOFlags specifying how the mapping should be performed, see mmap (2) for details.}(hju`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMBhjr`ubah}(h]h ]h"]h$]h&]uh1jhjV`ubeh}(h]h ]h"]h$]h&]uh1jhjq`hMChjY_ubj)}(hb``vma_flags_t vma_flags`` VMA flags which should be set by default, or EMPTY_VMA_FLAGS otherwise. h](j)}(h``vma_flags_t vma_flags``h]jS)}(hj`h]hvma_flags_t vma_flags}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMEhj`ubj)}(hhh]jM)}(hGVMA flags which should be set by default, or EMPTY_VMA_FLAGS otherwise.h]hGVMA flags which should be set by default, or EMPTY_VMA_FLAGS otherwise.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMDhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMEhjY_ubj)}(h]``unsigned long pgoff`` Page offset into the **file** if file-backed, should be 0 otherwise. h](j)}(h``unsigned long pgoff``h]jS)}(hj`h]hunsigned long pgoff}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMFhj`ubj)}(hhh]jM)}(hDPage offset into the **file** if file-backed, should be 0 otherwise.h](hPage offset into the }(hj`hhhNhNubj)}(h**file**h]hfile}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh' if file-backed, should be 0 otherwise.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj`hMFhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMFhjY_ubj)}(hX ``unsigned long *populate`` A pointer to a value which will be set to 0 if no population of the range is required, or the number of bytes to populate if it is. Must be non-NULL. See mmap (2) for details as to under what circumstances population of the range occurs. h](j)}(h``unsigned long *populate``h]jS)}(hjah]hunsigned long *populate}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjaubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMJhjaubj)}(hhh]jM)}(hA pointer to a value which will be set to 0 if no population of the range is required, or the number of bytes to populate if it is. Must be non-NULL. See mmap (2) for details as to under what circumstances population of the range occurs.h]hA pointer to a value which will be set to 0 if no population of the range is required, or the number of bytes to populate if it is. Must be non-NULL. See mmap (2) for details as to under what circumstances population of the range occurs.}(hj4ahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMGhj1aubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj0ahMJhjY_ubj)}(h``struct list_head *uf`` An optional pointer to a list head to track userfaultfd unmap events should unmapping events arise. If provided, it is up to the caller to manage this. h](j)}(h``struct list_head *uf``h]jS)}(hjUah]hstruct list_head *uf}(hjWahhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjSaubah}(h]h ]h"]h$]h&]uh1jhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMMhjOaubj)}(hhh]jM)}(hAn optional pointer to a list head to track userfaultfd unmap events should unmapping events arise. If provided, it is up to the caller to manage this.h]hAn optional pointer to a list head to track userfaultfd unmap events should unmapping events arise. If provided, it is up to the caller to manage this.}(hjnahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMKhjkaubah}(h]h ]h"]h$]h&]uh1jhjOaubeh}(h]h ]h"]h$]h&]uh1jhjjahMMhjY_ubeh}(h]h ]h"]h$]h&]uh1jhj=_ubjM)}(h**Description**h]j)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMOhj=_ubjM)}(hThis function does not perform security checks on the file and assumes, if **uf** is non-NULL, the caller has provided a list head to track unmap events for userfaultfd **uf**.h](hKThis function does not perform security checks on the file and assumes, if }(hjahhhNhNubj)}(h**uf**h]huf}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubhX is non-NULL, the caller has provided a list head to track unmap events for userfaultfd }(hjahhhNhNubj)}(h**uf**h]huf}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMhj=_ubjM)}(hIt also simply indicates whether memory population is required by setting **populate**, which must be non-NULL, expecting the caller to actually perform this task itself if appropriate.h](hJIt also simply indicates whether memory population is required by setting }(hjahhhNhNubj)}(h **populate**h]hpopulate}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubhc, which must be non-NULL, expecting the caller to actually perform this task itself if appropriate.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMhj=_ubjM)}(hThis function will invoke architecture-specific (and if provided and relevant, file system-specific) logic to determine the most appropriate unmapped area in which to place the mapping if not MAP_FIXED.h]hThis function will invoke architecture-specific (and if provided and relevant, file system-specific) logic to determine the most appropriate unmapped area in which to place the mapping if not MAP_FIXED.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM"hj=_ubjM)}(hoCallers which require userland mmap() behaviour should invoke vm_mmap(), which is also exported for module use.h]hoCallers which require userland mmap() behaviour should invoke vm_mmap(), which is also exported for module use.}(hj bhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM&hj=_ubjM)}(hThose which require this behaviour less security checks, userfaultfd and populate behaviour, and who handle the mmap write lock themselves, should call this function.h]hThose which require this behaviour less security checks, userfaultfd and populate behaviour, and who handle the mmap write lock themselves, should call this function.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM)hj=_ubjM)}(hX Note that the returned address may reside within a merged VMA if an appropriate merge were to take place, so it doesn't necessarily specify the start of a VMA, rather only the start of a valid mapped range of length **len** bytes, rounded down to the nearest page size.h](hNote that the returned address may reside within a merged VMA if an appropriate merge were to take place, so it doesn’t necessarily specify the start of a VMA, rather only the start of a valid mapped range of length }(hj(bhhhNhNubj)}(h**len**h]hlen}(hj0bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(bubh. bytes, rounded down to the nearest page size.}(hj(bhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM-hj=_ubjM)}(h2The caller must write-lock current->mm->mmap_lock.h]h2The caller must write-lock current->mm->mmap_lock.}(hjIbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM2hj=_ubjM)}(h **Return**h]j)}(hjZbh]hReturn}(hj\bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXbubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM4hj=_ubjM)}(hREither an error, or the address at which the requested mapping has been performed.h]hREither an error, or the address at which the requested mapping has been performed.}(hjpbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chMOhj=_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"find_vma_intersection (C function)c.find_vma_intersectionhNtauh1hhjhhhNhNubh)}(hhh](h)}(hvstruct vm_area_struct * find_vma_intersection (struct mm_struct *mm, unsigned long start_addr, unsigned long end_addr)h]h)}(htstruct vm_area_struct *find_vma_intersection(struct mm_struct *mm, unsigned long start_addr, unsigned long end_addr)h](j5)}(hj8h]hstruct}(hjbhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjbhhhJ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:116: ./mm/mmap.chM{ubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbhhhjbhM{ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjbmodnameN classnameNjpjs)}jv]jy)}jlfind_vma_intersectionsbc.find_vma_intersectionasbuh1hhjbhhhjbhM{ubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbhhhjbhM{ubjF )}(hjI h]h*}(hjbhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjbhhhjbhM{ubh)}(hfind_vma_intersectionh]j)}(hjbh]hfind_vma_intersection}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1hhjbhhhjbhM{ubj )}(hH(struct mm_struct *mm, unsigned long start_addr, unsigned long end_addr)h](j )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjchhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjcubj)}(h h]h }(hj&chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubh)}(hhh]j)}(h mm_structh]h mm_struct}(hj7chhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4cubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9cmodnameN classnameNjpjs)}jv]jbc.find_vma_intersectionasbuh1hhjcubj)}(h h]h }(hjUchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubjF )}(hjI h]h*}(hjcchhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjcubj)}(hmmh]hmm}(hjpchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcubj )}(hunsigned long start_addrh](j)}(hunsignedh]hunsigned}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hlongh]hlong}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h start_addrh]h start_addr}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcubj )}(hunsigned long end_addrh](j)}(hunsignedh]hunsigned}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hlongh]hlong}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hend_addrh]hend_addr}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjcubeh}(h]h ]h"]h$]h&]jjuh1j hjbhhhjbhM{ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjbhhhjbhM{ubah}(h]jbah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjbhM{hjbhhubj4)}(hhh]jM)}(h3Look up the first VMA which intersects the intervalh]h3Look up the first VMA which intersects the interval}(hjminimum number of references to this object. If during memory scanning a number of references less than **min_count** is found, the object is reported as a memory leak. If **min_count** is 0, the object is never reported as a leak. If **min_count** is -1, the object is ignored (not scanned and not reported as a leak)h](hhminimum number of references to this object. If during memory scanning a number of references less than }(hjmhhhNhNubj)}(h **min_count**h]h min_count}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh7 is found, the object is reported as a memory leak. If }(hjmhhhNhNubj)}(h **min_count**h]h min_count}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh2 is 0, the object is never reported as a leak. If }(hjmhhhNhNubj)}(h **min_count**h]h min_count}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhF is -1, the object is ignored (not scanned and not reported as a leak)}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMNhjmubah}(h]h ]h"]h$]h&]uh1jhjcmubeh}(h]h ]h"]h$]h&]uh1jhj~mhMRhjlubj)}(hL``gfp_t gfp`` kmalloc() flags used for kmemleak internal memory allocations h](j)}(h ``gfp_t gfp``h]jS)}(hjmh]h gfp_t gfp}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjmubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMShjmubj)}(hhh]jM)}(h=kmalloc() flags used for kmemleak internal memory allocationsh]h=kmalloc() flags used for kmemleak internal memory allocations}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjmhMShjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjmhMShjlubeh}(h]h ]h"]h$]h&]uh1jhjlubjM)}(h**Description**h]j)}(hjnh]h Description}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMUhjlubjM)}(hThis function is called from the kernel allocators when a new object (memory block) is allocated (kmem_cache_alloc, kmalloc etc.).h]hThis function is called from the kernel allocators when a new object (memory block) is allocated (kmem_cache_alloc, kmalloc etc.).}(hj*nhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMThjlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"kmemleak_alloc_percpu (C function)c.kmemleak_alloc_percpuhNtauh1hhjhhhNhNubh)}(hhh](h)}(hSvoid __ref kmemleak_alloc_percpu (const void __percpu *ptr, size_t size, gfp_t gfp)h]h)}(hRvoid __ref kmemleak_alloc_percpu(const void __percpu *ptr, size_t size, gfp_t gfp)h](j)}(hvoidh]hvoid}(hjYnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUnhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMcubj)}(h h]h }(hjhnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUnhhhjgnhMcubh__ref}(hjUnhhhNhNubj)}(h h]h }(hjznhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUnhhhjgnhMcubh)}(hkmemleak_alloc_percpuh]j)}(hkmemleak_alloc_percpuh]hkmemleak_alloc_percpu}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ](jjeh"]h$]h&]jjuh1hhjUnhhhjgnhMcubj )}(h2(const void __percpu *ptr, size_t size, gfp_t gfp)h](j )}(hconst void __percpu *ptrh](j5)}(hjh]hconst}(hjnhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjnubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(hvoidh]hvoid}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubh__percpu}(hjnhhhNhNubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubjF )}(hjI h]h*}(hjnhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjnubj)}(hptrh]hptr}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjomodnameN classnameNjpjs)}jv]jy)}jljnsbc.kmemleak_alloc_percpuasbuh1hhjoubj)}(h h]h }(hj:ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj)}(hsizeh]hsize}(hjHohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjdohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaoubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjfomodnameN classnameNjpjs)}jv]j6oc.kmemleak_alloc_percpuasbuh1hhj]oubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]oubj)}(hgfph]hgfp}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]oubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubeh}(h]h ]h"]h$]h&]jjuh1j hjUnhhhjgnhMcubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjQnhhhjgnhMcubah}(h]jLnah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjgnhMchjNnhhubj4)}(hhh]jM)}(h*register a newly allocated __percpu objecth]h*register a newly allocated __percpu object}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMchjohhubah}(h]h ]h"]h$]h&]uh1j3hjNnhhhjgnhMcubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjojHjojIjJjKuh1hhhhjhNhNubj)}(hXN**Parameters** ``const void __percpu *ptr`` __percpu pointer to beginning of the object ``size_t size`` size of the object ``gfp_t gfp`` flags used for kmemleak internal memory allocations **Description** This function is called from the kernel percpu allocator when a new object (memory block) is allocated (alloc_percpu).h](jM)}(h**Parameters**h]j)}(hjoh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMghjoubj)}(hhh](j)}(hI``const void __percpu *ptr`` __percpu pointer to beginning of the object h](j)}(h``const void __percpu *ptr``h]jS)}(hjoh]hconst void __percpu *ptr}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMdhjoubj)}(hhh]jM)}(h+__percpu pointer to beginning of the objecth]h+__percpu pointer to beginning of the object}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjphMdhjpubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjphMdhjoubj)}(h#``size_t size`` size of the object h](j)}(h``size_t size``h]jS)}(hj4ph]h size_t size}(hj6phhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2pubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMehj.pubj)}(hhh]jM)}(hsize of the objecth]hsize of the object}(hjMphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIphMehjJpubah}(h]h ]h"]h$]h&]uh1jhj.pubeh}(h]h ]h"]h$]h&]uh1jhjIphMehjoubj)}(hB``gfp_t gfp`` flags used for kmemleak internal memory allocations h](j)}(h ``gfp_t gfp``h]jS)}(hjmph]h gfp_t gfp}(hjophhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkpubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMfhjgpubj)}(hhh]jM)}(h3flags used for kmemleak internal memory allocationsh]h3flags used for kmemleak internal memory allocations}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjphMfhjpubah}(h]h ]h"]h$]h&]uh1jhjgpubeh}(h]h ]h"]h$]h&]uh1jhjphMfhjoubeh}(h]h ]h"]h$]h&]uh1jhjoubjM)}(h**Description**h]j)}(hjph]h Description}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhhjoubjM)}(hvThis function is called from the kernel percpu allocator when a new object (memory block) is allocated (alloc_percpu).h]hvThis function is called from the kernel percpu allocator when a new object (memory block) is allocated (alloc_percpu).}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMghjoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmemleak_vmalloc (C function)c.kmemleak_vmallochNtauh1hhjhhhNhNubh)}(hhh](h)}(hRvoid __ref kmemleak_vmalloc (const struct vm_struct *area, size_t size, gfp_t gfp)h]h)}(hQvoid __ref kmemleak_vmalloc(const struct vm_struct *area, size_t size, gfp_t gfp)h](j)}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjphhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMvubj)}(h h]h }(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjphhhjphMvubh__ref}(hjphhhNhNubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjphhhjphMvubh)}(hkmemleak_vmalloch]j)}(hkmemleak_vmalloch]hkmemleak_vmalloc}(hj qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ](jjeh"]h$]h&]jjuh1hhjphhhjphMvubj )}(h6(const struct vm_struct *area, size_t size, gfp_t gfp)h](j )}(hconst struct vm_struct *areah](j5)}(hjh]hconst}(hjvubj)}(hhh](j)}(h{``const void *ptr`` pointer to the beginning or inside the object. This also represents the start of the range to be freed h](j)}(h``const void *ptr``h]jS)}(hjcvh]hconst void *ptr}(hjevhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjavubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj]vubj)}(hhh]jM)}(hfpointer to the beginning or inside the object. This also represents the start of the range to be freedh]hfpointer to the beginning or inside the object. This also represents the start of the range to be freed}(hj|vhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjyvubah}(h]h ]h"]h$]h&]uh1jhj]vubeh}(h]h ]h"]h$]h&]uh1jhjxvhMhjZvubj)}(h(``size_t size`` size to be unregistered h](j)}(h``size_t size``h]jS)}(hjvh]h size_t size}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjvubj)}(hhh]jM)}(hsize to be unregisteredh]hsize to be unregistered}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMhjvubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjZvubeh}(h]h ]h"]h$]h&]uh1jhj>vubjM)}(h**Description**h]j)}(hjvh]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj>vubjM)}(hiThis function is called when only a part of a memory block is freed (usually from the bootmem allocator).h]hiThis function is called when only a part of a memory block is freed (usually from the bootmem allocator).}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj>vubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!kmemleak_free_percpu (C function)c.kmemleak_free_percpuhNtauh1hhjhhhNhNubh)}(hhh](h)}(h:void __ref kmemleak_free_percpu (const void __percpu *ptr)h]h)}(h9void __ref kmemleak_free_percpu(const void __percpu *ptr)h](j)}(hvoidh]hvoid}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMubj)}(h h]h }(hj,whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhj+whMubh__ref}(hjwhhhNhNubj)}(h h]h }(hj>whhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwhhhj+whMubh)}(hkmemleak_free_percpuh]j)}(hkmemleak_free_percpuh]hkmemleak_free_percpu}(hjPwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLwubah}(h]h ](jjeh"]h$]h&]jjuh1hhjwhhhj+whMubj )}(h(const void __percpu *ptr)h]j )}(hconst void __percpu *ptrh](j5)}(hjh]hconst}(hjlwhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhwubj)}(h h]h }(hjywhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhwubj)}(hvoidh]hvoid}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhwubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhwubh__percpu}(hjhwhhhNhNubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhwubjF )}(hjI h]h*}(hjwhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhwubj)}(hptrh]hptr}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhwubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjdwubah}(h]h ]h"]h$]h&]jjuh1j hjwhhhj+whMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjwhhhj+whMubah}(h]jwah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj+whMhjwhhubj4)}(hhh]jM)}(h2unregister a previously registered __percpu objecth]h2unregister a previously registered __percpu object}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjwhhubah}(h]h ]h"]h$]h&]uh1j3hjwhhhj+whMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjxjHjxjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const void __percpu *ptr`` __percpu pointer to beginning of the object **Description** This function is called from the kernel percpu allocator when an object (memory block) is freed (free_percpu).h](jM)}(h**Parameters**h]j)}(hjxh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj xubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjxubj)}(hhh]j)}(hI``const void __percpu *ptr`` __percpu pointer to beginning of the object h](j)}(h``const void __percpu *ptr``h]jS)}(hj-xh]hconst void __percpu *ptr}(hj/xhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj+xubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj'xubj)}(hhh]jM)}(h+__percpu pointer to beginning of the objecth]h+__percpu pointer to beginning of the object}(hjFxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjBxhMhjCxubah}(h]h ]h"]h$]h&]uh1jhj'xubeh}(h]h ]h"]h$]h&]uh1jhjBxhMhj$xubah}(h]h ]h"]h$]h&]uh1jhjxubjM)}(h**Description**h]j)}(hjhxh]h Description}(hjjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfxubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjxubjM)}(hnThis function is called from the kernel percpu allocator when an object (memory block) is freed (free_percpu).h]hnThis function is called from the kernel percpu allocator when an object (memory block) is freed (free_percpu).}(hj~xhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"kmemleak_update_trace (C function)c.kmemleak_update_tracehNtauh1hhjhhhNhNubh)}(hhh](h)}(h2void __ref kmemleak_update_trace (const void *ptr)h]h)}(h1void __ref kmemleak_update_trace(const void *ptr)h](j)}(hvoidh]hvoid}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxhhhjxhMubh__ref}(hjxhhhNhNubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxhhhjxhMubh)}(hkmemleak_update_traceh]j)}(hkmemleak_update_traceh]hkmemleak_update_trace}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1hhjxhhhjxhMubj )}(h(const void *ptr)h]j )}(hconst void *ptrh](j5)}(hjh]hconst}(hjxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjxubj)}(h h]h }(hj yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(hvoidh]hvoid}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj)}(h h]h }(hj%yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubjF )}(hjI h]h*}(hj3yhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjxubj)}(hptrh]hptr}(hj@yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubah}(h]h ]h"]h$]h&]jjuh1j hjxhhhjxhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjxhhhjxhMubah}(h]jxah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjxhMhjxhhubj4)}(hhh]jM)}(h$update object allocation stack traceh]h$update object allocation stack trace}(hjjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjgyhhubah}(h]h ]h"]h$]h&]uh1j3hjxhhhjxhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjyjHjyjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const void *ptr`` pointer to beginning of the object **Description** Override the object allocation stack trace for cases where the actual allocation place is not always useful.h](jM)}(h**Parameters**h]j)}(hjyh]h Parameters}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjyubj)}(hhh]j)}(h7``const void *ptr`` pointer to beginning of the object h](j)}(h``const void *ptr``h]jS)}(hjyh]hconst void *ptr}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjyubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjyubj)}(hhh]jM)}(h"pointer to beginning of the objecth]h"pointer to beginning of the object}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhMhjyubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjyubah}(h]h ]h"]h$]h&]uh1jhjyubjM)}(h**Description**h]j)}(hjyh]h Description}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjyubjM)}(hlOverride the object allocation stack trace for cases where the actual allocation place is not always useful.h]hlOverride the object allocation stack trace for cases where the actual allocation place is not always useful.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmemleak_not_leak (C function)c.kmemleak_not_leakhNtauh1hhjhhhNhNubh)}(hhh](h)}(h.void __ref kmemleak_not_leak (const void *ptr)h]h)}(h-void __ref kmemleak_not_leak(const void *ptr)h](j)}(hvoidh]hvoid}(hj+zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'zhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMubj)}(h h]h }(hj:zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'zhhhj9zhMubh__ref}(hj'zhhhNhNubj)}(h h]h }(hjLzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'zhhhj9zhMubh)}(hkmemleak_not_leakh]j)}(hkmemleak_not_leakh]hkmemleak_not_leak}(hj^zhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZzubah}(h]h ](jjeh"]h$]h&]jjuh1hhj'zhhhj9zhMubj )}(h(const void *ptr)h]j )}(hconst void *ptrh](j5)}(hjh]hconst}(hjzzhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjvzubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvzubj)}(hvoidh]hvoid}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvzubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvzubjF )}(hjI h]h*}(hjzhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjvzubj)}(hptrh]hptr}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvzubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjrzubah}(h]h ]h"]h$]h&]jjuh1j hj'zhhhj9zhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj#zhhhj9zhMubah}(h]jzah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj9zhMhj zhhubj4)}(hhh]jM)}(h*mark an allocated object as false positiveh]h*mark an allocated object as false positive}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjzhhubah}(h]h ]h"]h$]h&]uh1j3hj zhhhj9zhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj{jHj{jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const void *ptr`` pointer to beginning of the object **Description** Calling this function on an object will cause the memory block to no longer be reported as leak and always be scanned.h](jM)}(h**Parameters**h]j)}(hj {h]h Parameters}(hj {hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj{ubj)}(hhh]j)}(h7``const void *ptr`` pointer to beginning of the object h](j)}(h``const void *ptr``h]jS)}(hj){h]hconst void *ptr}(hj+{hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj'{ubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj#{ubj)}(hhh]jM)}(h"pointer to beginning of the objecth]h"pointer to beginning of the object}(hjB{hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>{hMhj?{ubah}(h]h ]h"]h$]h&]uh1jhj#{ubeh}(h]h ]h"]h$]h&]uh1jhj>{hMhj {ubah}(h]h ]h"]h$]h&]uh1jhj{ubjM)}(h**Description**h]j)}(hjd{h]h Description}(hjf{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb{ubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj{ubjM)}(hvCalling this function on an object will cause the memory block to no longer be reported as leak and always be scanned.h]hvCalling this function on an object will cause the memory block to no longer be reported as leak and always be scanned.}(hjz{hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$kmemleak_transient_leak (C function)c.kmemleak_transient_leakhNtauh1hhjhhhNhNubh)}(hhh](h)}(h4void __ref kmemleak_transient_leak (const void *ptr)h]h)}(h3void __ref kmemleak_transient_leak(const void *ptr)h](j)}(hvoidh]hvoid}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhj{hMubh__ref}(hj{hhhNhNubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{hhhj{hMubh)}(hkmemleak_transient_leakh]j)}(hkmemleak_transient_leakh]hkmemleak_transient_leak}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj{hhhj{hMubj )}(h(const void *ptr)h]j )}(hconst void *ptrh](j5)}(hjh]hconst}(hj{hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj{ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hvoidh]hvoid}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h h]h }(hj!|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubjF )}(hjI h]h*}(hj/|hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj{ubj)}(hptrh]hptr}(hj<|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{ubah}(h]h ]h"]h$]h&]jjuh1j hj{hhhj{hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj{hhhj{hMubah}(h]j{ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj{hMhj{hhubj4)}(hhh]jM)}(h4mark an allocated object as transient false positiveh]h4mark an allocated object as transient false positive}(hjf|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhjc|hhubah}(h]h ]h"]h$]h&]uh1j3hj{hhhj{hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj~|jHj~|jIjJjKuh1hhhhjhNhNubj)}(hX:**Parameters** ``const void *ptr`` pointer to beginning of the object **Description** Calling this function on an object will cause the memory block to not be reported as a leak temporarily. This may happen, for example, if the object is part of a singly linked list and the ->next reference to it is changed.h](jM)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj|ubj)}(hhh]j)}(h7``const void *ptr`` pointer to beginning of the object h](j)}(h``const void *ptr``h]jS)}(hj|h]hconst void *ptr}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj|ubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj|ubj)}(hhh]jM)}(h"pointer to beginning of the objecth]h"pointer to beginning of the object}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|hMhj|ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj|ubah}(h]h ]h"]h$]h&]uh1jhj|ubjM)}(h**Description**h]j)}(hj|h]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj|ubjM)}(hCalling this function on an object will cause the memory block to not be reported as a leak temporarily. This may happen, for example, if the object is part of a singly linked list and the ->next reference to it is changed.h]hCalling this function on an object will cause the memory block to not be reported as a leak temporarily. This may happen, for example, if the object is part of a singly linked list and the ->next reference to it is changed.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMhj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#kmemleak_ignore_percpu (C function)c.kmemleak_ignore_percpuhNtauh1hhjhhhNhNubh)}(hhh](h)}(hubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhjhM&ubj )}(h)(const void *ptr, size_t size, gfp_t gfp)h](j )}(hconst void *ptrh](j5)}(hjh]hconst}(hj^hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjZubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hvoidh]hvoid}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjZubj)}(hptrh]hptr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljDsbc.kmemleak_scan_areaasbuh1hhjubj)}(h h]h }(hjހhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jڀc.kmemleak_scan_areaasbuh1hhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfph]hgfp}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhjhM&ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM&ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM&hjhhubj4)}(hhh]jM)}(h4limit the range to be scanned in an allocated objecth]h4limit the range to be scanned in an allocated object}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM&hj[hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM&ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjvjHjvjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const void *ptr`` pointer to beginning or inside the object. This also represents the start of the scan area ``size_t size`` size of the scan area ``gfp_t gfp`` kmalloc() flags used for kmemleak internal memory allocations **Description** This function is used when it is known that only certain parts of an object contain references to other objects. Kmemleak will only scan these areas reducing the number false negatives.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM*hjzubj)}(hhh](j)}(ho``const void *ptr`` pointer to beginning or inside the object. This also represents the start of the scan area h](j)}(h``const void *ptr``h]jS)}(hjh]hconst void *ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM(hjubj)}(hhh]jM)}(hZpointer to beginning or inside the object. This also represents the start of the scan areah]hZpointer to beginning or inside the object. This also represents the start of the scan area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM'hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM(hjubj)}(h&``size_t size`` size of the scan area h](j)}(h``size_t size``h]jS)}(hjفh]h size_t size}(hjہhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjׁubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM)hjӁubj)}(hhh]jM)}(hsize of the scan areah]hsize of the scan area}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM)hjubah}(h]h ]h"]h$]h&]uh1jhjӁubeh}(h]h ]h"]h$]h&]uh1jhjhM)hjubj)}(hL``gfp_t gfp`` kmalloc() flags used for kmemleak internal memory allocations h](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM*hj ubj)}(hhh]jM)}(h=kmalloc() flags used for kmemleak internal memory allocationsh]h=kmalloc() flags used for kmemleak internal memory allocations}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'hM*hj(ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj'hM*hjubeh}(h]h ]h"]h$]h&]uh1jhjzubjM)}(h**Description**h]j)}(hjMh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM,hjzubjM)}(hThis function is used when it is known that only certain parts of an object contain references to other objects. Kmemleak will only scan these areas reducing the number false negatives.h]hThis function is used when it is known that only certain parts of an object contain references to other objects. Kmemleak will only scan these areas reducing the number false negatives.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM+hjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hkmemleak_no_scan (C function)c.kmemleak_no_scanhNtauh1hhjhhhNhNubh)}(hhh](h)}(h-void __ref kmemleak_no_scan (const void *ptr)h]h)}(h,void __ref kmemleak_no_scan(const void *ptr)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM:ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM:ubh__ref}(hjhhhNhNubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM:ubh)}(hkmemleak_no_scanh]j)}(hkmemleak_no_scanh]hkmemleak_no_scan}(hjłhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM:ubj )}(h(const void *ptr)h]j )}(hconst void *ptrh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj݂ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj݂ubj)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj݂ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj݂ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj݂ubj)}(hptrh]hptr}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj݂ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjقubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM:ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM:ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM:hjhhubj4)}(hhh]jM)}(hdo not scan an allocated objecth]hdo not scan an allocated object}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM:hjLhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM:ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjgjHjgjIjJjKuh1hhhhjhNhNubj)}(hXY**Parameters** ``const void *ptr`` pointer to beginning of the object **Description** This function notifies kmemleak not to scan the given memory block. Useful in situations where it is known that the given object does not contain any references to other objects. Kmemleak will not scan such objects reducing the number of false negatives.h](jM)}(h**Parameters**h]j)}(hjqh]h Parameters}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM>hjkubj)}(hhh]j)}(h7``const void *ptr`` pointer to beginning of the object h](j)}(h``const void *ptr``h]jS)}(hjh]hconst void *ptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM;hjubj)}(hhh]jM)}(h"pointer to beginning of the objecth]h"pointer to beginning of the object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM;hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM;hjubah}(h]h ]h"]h$]h&]uh1jhjkubjM)}(h**Description**h]j)}(hj˃h]h Description}(hj̓hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɃubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM=hjkubjM)}(hThis function notifies kmemleak not to scan the given memory block. Useful in situations where it is known that the given object does not contain any references to other objects. Kmemleak will not scan such objects reducing the number of false negatives.h]hThis function notifies kmemleak not to scan the given memory block. Useful in situations where it is known that the given object does not contain any references to other objects. Kmemleak will not scan such objects reducing the number of false negatives.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM<hjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h kmemleak_alloc_phys (C function)c.kmemleak_alloc_physhNtauh1hhjhhhNhNubh)}(hhh](h)}(hIvoid __ref kmemleak_alloc_phys (phys_addr_t phys, size_t size, gfp_t gfp)h]h)}(hHvoid __ref kmemleak_alloc_phys(phys_addr_t phys, size_t size, gfp_t gfp)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMLubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMLubh__ref}(hj hhhNhNubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMLubh)}(hkmemleak_alloc_physh]j)}(hkmemleak_alloc_physh]hkmemleak_alloc_phys}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhjhMLubj )}(h*(phys_addr_t phys, size_t size, gfp_t gfp)h](j )}(hphys_addr_t physh](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjdmodnameN classnameNjpjs)}jv]jy)}jljEsbc.kmemleak_alloc_physasbuh1hhj[ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj)}(hphysh]hphys}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjWubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j~c.kmemleak_alloc_physasbuh1hhjubj)}(h h]h }(hjʄhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj؄hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjWubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j~c.kmemleak_alloc_physasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfph]hgfp}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjWubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhjhMLubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMLubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMLhjhhubj4)}(hhh]jM)}(h@similar to kmemleak_alloc but taking a physical address argumenth]h@similar to kmemleak_alloc but taking a physical address argument}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMLhjGhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMLubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjbjHjbjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``phys_addr_t phys`` physical address of the object ``size_t size`` size of the object ``gfp_t gfp`` kmalloc() flags used for kmemleak internal memory allocationsh](jM)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMPhjfubj)}(hhh](j)}(h4``phys_addr_t phys`` physical address of the object h](j)}(h``phys_addr_t phys``h]jS)}(hjh]hphys_addr_t phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMNhjubj)}(hhh]jM)}(hphysical address of the objecth]hphysical address of the object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMNhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjubj)}(h#``size_t size`` size of the object h](j)}(h``size_t size``h]jS)}(hjąh]h size_t size}(hjƅhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj…ubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMOhjubj)}(hhh]jM)}(hsize of the objecth]hsize of the object}(hj݅hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjمhMOhjڅubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjمhMOhjubj)}(hK``gfp_t gfp`` kmalloc() flags used for kmemleak internal memory allocationsh](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMQhjubj)}(hhh]jM)}(h=kmalloc() flags used for kmemleak internal memory allocationsh]h=kmalloc() flags used for kmemleak internal memory allocations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMPhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMQhjubeh}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$kmemleak_free_part_phys (C function)c.kmemleak_free_part_physhNtauh1hhjhhhNhNubh)}(hhh](h)}(hBvoid __ref kmemleak_free_part_phys (phys_addr_t phys, size_t size)h]h)}(hAvoid __ref kmemleak_free_part_phys(phys_addr_t phys, size_t size)h](j)}(hvoidh]hvoid}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjShhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM`ubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjShhhjehM`ubh__ref}(hjShhhNhNubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjShhhjehM`ubh)}(hkmemleak_free_part_physh]j)}(hkmemleak_free_part_physh]hkmemleak_free_part_phys}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjShhhjehM`ubj )}(h(phys_addr_t phys, size_t size)h](j )}(hphys_addr_t physh](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.kmemleak_free_part_physasbuh1hhjubj)}(h h]h }(hjɆhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hphysh]hphys}(hj׆hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jņc.kmemleak_free_part_physasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h4]h ]h"]h$]h&]jjuh1j hjShhhjehM`ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjOhhhjehM`ubah}(h]jJah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjehM`hjLhhubj4)}(hhh]jM)}(hDsimilar to kmemleak_free_part but taking a physical address argumenth]hDsimilar to kmemleak_free_part but taking a physical address argument}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chM`hjFhhubah}(h]h ]h"]h$]h&]uh1j3hjLhhhjehM`ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjajHjajIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``phys_addr_t phys`` physical address if the beginning or inside an object. This also represents the start of the range to be freed ``size_t size`` size to be unregisteredh](jM)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMdhjeubj)}(hhh](j)}(h``phys_addr_t phys`` physical address if the beginning or inside an object. This also represents the start of the range to be freed h](j)}(h``phys_addr_t phys``h]jS)}(hjh]hphys_addr_t phys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMchjubj)}(hhh]jM)}(hnphysical address if the beginning or inside an object. This also represents the start of the range to be freedh]hnphysical address if the beginning or inside an object. This also represents the start of the range to be freed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMbhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMchjubj)}(h'``size_t size`` size to be unregisteredh](j)}(h``size_t size``h]jS)}(hjćh]h size_t size}(hjƇhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj‡ubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMehjubj)}(hhh]jM)}(hsize to be unregisteredh]hsize to be unregistered}(hj݇hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMdhjڇubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjهhMehjubeh}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!kmemleak_ignore_phys (C function)c.kmemleak_ignore_physhNtauh1hhjhhhNhNubh)}(hhh](h)}(h2void __ref kmemleak_ignore_phys (phys_addr_t phys)h]h)}(h1void __ref kmemleak_ignore_phys(phys_addr_t phys)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMpubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj,hMpubh__ref}(hjhhhNhNubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj,hMpubh)}(hkmemleak_ignore_physh]j)}(hkmemleak_ignore_physh]hkmemleak_ignore_phys}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj,hMpubj )}(h(phys_addr_t phys)h]j )}(hphys_addr_t physh](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjrmodnameN classnameNjpjs)}jv]jy)}jljSsbc.kmemleak_ignore_physasbuh1hhjiubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hphysh]hphys}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjeubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj,hMpubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj,hMpubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj,hMphjhhubj4)}(hhh]jM)}(hAsimilar to kmemleak_ignore but taking a physical address argumenth]hAsimilar to kmemleak_ignore but taking a physical address argument}(hjȈhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMphjňhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj,hMpubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hE**Parameters** ``phys_addr_t phys`` physical address of the objecth](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMthjubj)}(hhh]j)}(h3``phys_addr_t phys`` physical address of the objecth](j)}(h``phys_addr_t phys``h]jS)}(hj h]hphys_addr_t phys}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMvhjubj)}(hhh]jM)}(hphysical address of the objecth]hphysical address of the object}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:117: ./mm/kmemleak.chMrhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMvhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubhcomment)}(h'#kernel-doc:: mm/hmm.c (build warnings)h]h'#kernel-doc:: mm/hmm.c (build warnings)}hjLsbah}(h]h ]h"]h$]h&]jjuh1jJhjhhhhhKvubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h devm_memremap_pages (C function)c.devm_memremap_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hJvoid * devm_memremap_pages (struct device *dev, struct dev_pagemap *pgmap)h]h)}(hHvoid *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap)h](j)}(hvoidh]hvoid}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjohhhjhMcubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjohhhjhMcubh)}(hdevm_memremap_pagesh]j)}(hdevm_memremap_pagesh]hdevm_memremap_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjohhhjhMcubj )}(h/(struct device *dev, struct dev_pagemap *pgmap)h](j )}(hstruct device *devh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjʉhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdeviceh]hdevice}(hjۉhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj؉ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj݉modnameN classnameNjpjs)}jv]jy)}jljsbc.devm_memremap_pagesasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct dev_pagemap *pgmaph](j5)}(hj8h]hstruct}(hj/hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj+ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(h dev_pagemaph]h dev_pagemap}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjOmodnameN classnameNjpjs)}jv]jc.devm_memremap_pagesasbuh1hhj+ubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubjF )}(hjI h]h*}(hjyhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj+ubj)}(hpgmaph]hpgmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjohhhjhMcubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjkhhhjhMcubah}(h]jfah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMchjhhhubj4)}(hhh]jM)}(h7remap and provide memmap backing for the given resourceh]h7remap and provide memmap backing for the given resource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMchjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhhjhMcubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjȊjHjȊjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct device *dev`` hosting device for **res** ``struct dev_pagemap *pgmap`` pointer to a struct dev_pagemap **Notes** 1/ At a minimum the range and type members of **pgmap** must be initialized by the caller before passing it to this function 2/ The altmap field may optionally be initialized, in which case PGMAP_ALTMAP_VALID must be set in pgmap->flags. 3/ The ref field may optionally be provided, in which pgmap->ref must be 'live' on entry and will be killed and reaped at devm_memremap_pages_release() time, or if this routine fails. 4/ range is expected to be a host memory range that could feasibly be treated as a "System RAM" range, i.e. not a device mmio range, but this is not enforced.h](jM)}(h**Parameters**h]j)}(hjҊh]h Parameters}(hjԊhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjЊubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMghj̊ubj)}(hhh](j)}(h2``struct device *dev`` hosting device for **res** h](j)}(h``struct device *dev``h]jS)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMdhjubj)}(hhh]jM)}(hhosting device for **res**h](hhosting device for }(hj hhhNhNubj)}(h**res**h]hres}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jLhjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMdhjubj)}(h>``struct dev_pagemap *pgmap`` pointer to a struct dev_pagemap h](j)}(h``struct dev_pagemap *pgmap``h]jS)}(hj8h]hstruct dev_pagemap *pgmap}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMehj2ubj)}(hhh]jM)}(hpointer to a struct dev_pagemaph]hpointer to a struct dev_pagemap}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjMhMehjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMehjubeh}(h]h ]h"]h$]h&]uh1jhj̊ubjM)}(h **Notes**h]j)}(hjsh]hNotes}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMghj̊ubj)}(hhh](j)}(h}1/ At a minimum the range and type members of **pgmap** must be initialized by the caller before passing it to this function h](j)}(hK1/ At a minimum the range and type members of **pgmap** must be initializedh](h.1/ At a minimum the range and type members of }(hjhhhNhNubj)}(h **pgmap**h]hpgmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh must be initialized}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMhhjubj)}(hhh]jM)}(h0by the caller before passing it to this functionh]h0by the caller before passing it to this function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhhjubj)}(hq2/ The altmap field may optionally be initialized, in which case PGMAP_ALTMAP_VALID must be set in pgmap->flags. h](j)}(h@2/ The altmap field may optionally be initialized, in which caseh]h@2/ The altmap field may optionally be initialized, in which case}(hjҋhhhNhNubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMkhj΋ubj)}(hhh]jM)}(h/PGMAP_ALTMAP_VALID must be set in pgmap->flags.h]h/PGMAP_ALTMAP_VALID must be set in pgmap->flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMkhjubah}(h]h ]h"]h$]h&]uh1jhj΋ubeh}(h]h ]h"]h$]h&]uh1jhjhMkhjubj)}(h3/ The ref field may optionally be provided, in which pgmap->ref must be 'live' on entry and will be killed and reaped at devm_memremap_pages_release() time, or if this routine fails. h](j)}(hH3/ The ref field may optionally be provided, in which pgmap->ref must beh]hH3/ The ref field may optionally be provided, in which pgmap->ref must be}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMohjubj)}(hhh]jM)}(hn'live' on entry and will be killed and reaped at devm_memremap_pages_release() time, or if this routine fails.h]hr‘live’ on entry and will be killed and reaped at devm_memremap_pages_release() time, or if this routine fails.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMnhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMohjubj)}(h4/ range is expected to be a host memory range that could feasibly be treated as a "System RAM" range, i.e. not a device mmio range, but this is not enforced.h](j)}(hE4/ range is expected to be a host memory range that could feasibly beh]hE4/ range is expected to be a host memory range that could feasibly be}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMrhj/ubj)}(hhh]jM)}(hXtreated as a "System RAM" range, i.e. not a device mmio range, but this is not enforced.h]h\treated as a “System RAM” range, i.e. not a device mmio range, but this is not enforced.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjAhMrhjBubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhjAhMrhjubeh}(h]h ]h"]h$]h&]uh1jhj̊ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hget_dev_pagemap (C function)c.get_dev_pagemaphNtauh1hhjhhhNhNubh)}(hhh](h)}(h8struct dev_pagemap * get_dev_pagemap (unsigned long pfn)h]h)}(h6struct dev_pagemap *get_dev_pagemap(unsigned long pfn)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(h dev_pagemaph]h dev_pagemap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlget_dev_pagemapsbc.get_dev_pagemapasbuh1hhjhhhjhMubj)}(h h]h }(hjŌhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjF )}(hjI h]h*}(hjӌhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMubh)}(hget_dev_pagemaph]j)}(hjŒh]hget_dev_pagemap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(unsigned long pfn)h]j )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(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)}(hpfnh]hpfn}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj}hhhjhMubah}(h]jxah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjzhhubj4)}(hhh]jM)}(h8take a new live reference on the dev_pagemap for **pfn**h](h1take a new live reference on the dev_pagemap for }(hjahhhNhNubj)}(h**pfn**h]hpfn}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMhj^hhubah}(h]h ]h"]h$]h&]uh1j3hjzhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hL**Parameters** ``unsigned long pfn`` page frame number to lookup page_maph](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMhjubj)}(hhh]j)}(h:``unsigned long pfn`` page frame number to lookup page_maph](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMhjubj)}(hhh]jM)}(h$page frame number to lookup page_maph]h$page frame number to lookup page_map}(hjɍhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhN/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:119: ./mm/memremap.chMhjƍubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjōhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h hugetlb_alloc_folio (C function)c.hugetlb_alloc_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hjstruct folio * hugetlb_alloc_folio (struct hstate *h, struct mempolicy_interpreted *mpoli, u8 alloc_flags)h]h)}(hhstruct folio *hugetlb_alloc_folio(struct hstate *h, struct mempolicy_interpreted *mpoli, u8 alloc_flags)h](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hhh]j)}(hfolioh]hfolio}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj+modnameN classnameNjpjs)}jv]jy)}jlhugetlb_alloc_foliosbc.hugetlb_alloc_folioasbuh1hhjhhhjhM ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubjF )}(hjI h]h*}(hjXhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhM ubh)}(hhugetlb_alloc_folioh]j)}(hjGh]hhugetlb_alloc_folio}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(hG(struct hstate *h, struct mempolicy_interpreted *mpoli, u8 alloc_flags)h](j )}(hstruct hstate *hh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hhstateh]hhstate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jEc.hugetlb_alloc_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjΎhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hhh]hh}(hjێhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj|ubj )}(h#struct mempolicy_interpreted *mpolih](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hmempolicy_interpretedh]hmempolicy_interpreted}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jEc.hugetlb_alloc_folioasbuh1hhjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj>hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmpolih]hmpoli}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj|ubj )}(hu8 alloc_flagsh](h)}(hhh]j)}(hu8h]hu8}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjimodnameN classnameNjpjs)}jv]jEc.hugetlb_alloc_folioasbuh1hhj`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(h alloc_flagsh]h alloc_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj|ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(hAllocate a hugetlb folio.h]hAllocate a hugetlb folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjՏjHjՏjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct hstate *h`` Hugetlb state control block. ``struct mempolicy_interpreted *mpoli`` Interpreted memory policy to use for allocation. ``u8 alloc_flags`` Flags controlling the allocation behavior. **Description** Allocates a hugetlb folio and handles cgroup charging and global hstate reservations. **Return** A pointer to the allocated folio, or an ERR_PTR on failure. -ENOSPC if cgroup charging fails or no folio is available. -ENOMEM if mem cgroup charging fails.h](jM)}(h**Parameters**h]j)}(hjߏh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjݏubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjُubj)}(hhh](j)}(h2``struct hstate *h`` Hugetlb state control block. h](j)}(h``struct hstate *h``h]jS)}(hjh]hstruct hstate *h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjubj)}(hhh]jM)}(hHugetlb state control block.h]hHugetlb state control block.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hY``struct mempolicy_interpreted *mpoli`` Interpreted memory policy to use for allocation. h](j)}(h'``struct mempolicy_interpreted *mpoli``h]jS)}(hj7h]h#struct mempolicy_interpreted *mpoli}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hj1ubj)}(hhh]jM)}(h0Interpreted memory policy to use for allocation.h]h0Interpreted memory policy to use for allocation.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhM hjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhM hjubj)}(h>``u8 alloc_flags`` Flags controlling the allocation behavior. h](j)}(h``u8 alloc_flags``h]jS)}(hjph]hu8 alloc_flags}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjjubj)}(hhh]jM)}(h*Flags controlling the allocation behavior.h]h*Flags controlling the allocation behavior.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjُubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjُubjM)}(hUAllocates a hugetlb folio and handles cgroup charging and global hstate reservations.h]hUAllocates a hugetlb folio and handles cgroup charging and global hstate reservations.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjُubjM)}(h **Return**h]j)}(hjҐh]hReturn}(hjԐhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjАubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjُubjM)}(hA pointer to the allocated folio, or an ERR_PTR on failure. -ENOSPC if cgroup charging fails or no folio is available. -ENOMEM if mem cgroup charging fails.h]hA pointer to the allocated folio, or an ERR_PTR on failure. -ENOSPC if cgroup charging fails or no folio is available. -ENOMEM if mem cgroup charging fails.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM hjُubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hhuge_pmd_unshare (C function)c.huge_pmd_unsharehNtauh1hhjhhhNhNubh)}(hhh](h)}(hjint huge_pmd_unshare (struct mmu_gather *tlb, struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)h]h)}(hiint huge_pmd_unshare(struct mmu_gather *tlb, struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj%hMubh)}(hhuge_pmd_unshareh]j)}(hhuge_pmd_unshareh]hhuge_pmd_unshare}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj%hMubj )}(hU(struct mmu_gather *tlb, struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)h](j )}(hstruct mmu_gather *tlbh](j5)}(hj8h]hstruct}(hjThhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjPubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubh)}(hhh]j)}(h mmu_gatherh]h mmu_gather}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjtmodnameN classnameNjpjs)}jv]jy)}jlj:sbc.huge_pmd_unshareasbuh1hhjPubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjPubj)}(htlbh]htlb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjƑhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj‘ubj)}(h h]h }(hjӑhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj‘ubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.huge_pmd_unshareasbuh1hhj‘ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj‘ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj‘ubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj‘ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hlongh]hlong}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(haddrh]haddr}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(h pte_t *pteph](h)}(hhh]j)}(hpte_th]hpte_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.huge_pmd_unshareasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpteph]hptep}(hjÒhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj%hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj%hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%hMhj hhubj4)}(hhh]jM)}(h3Unmap a pmd table if it is shared by multiple usersh]h3Unmap a pmd table if it is shared by multiple users}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj%hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXH**Parameters** ``struct mmu_gather *tlb`` the current mmu_gather. ``struct vm_area_struct *vma`` the vma covering the pmd table. ``unsigned long addr`` the address we are trying to unshare. ``pte_t *ptep`` pointer into the (pmd) page table. **Description** Called with the page table lock held, the i_mmap_rwsem held in write mode and the hugetlb vma lock held in write mode. **Note** The caller must call huge_pmd_unshare_flush() before dropping the i_mmap_rwsem. **Return** 1 if it was a shared PMD table and it got unmapped, or 0 if it was not a shared PMD table.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubj)}(hhh](j)}(h3``struct mmu_gather *tlb`` the current mmu_gather. h](j)}(h``struct mmu_gather *tlb``h]jS)}(hj.h]hstruct mmu_gather *tlb}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj(ubj)}(hhh]jM)}(hthe current mmu_gather.h]hthe current mmu_gather.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChMhjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhj%ubj)}(h?``struct vm_area_struct *vma`` the vma covering the pmd table. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjgh]hstruct vm_area_struct *vma}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhjaubj)}(hhh]jM)}(hthe vma covering the pmd table.h]hthe vma covering the pmd table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhj%ubj)}(h=``unsigned long addr`` the address we are trying to unshare. h](j)}(h``unsigned long addr``h]jS)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhjubj)}(hhh]jM)}(h%the address we are trying to unshare.h]h%the address we are trying to unshare.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubj)}(h3``pte_t *ptep`` pointer into the (pmd) page table. h](j)}(h``pte_t *ptep``h]jS)}(hjٓh]h pte_t *ptep}(hjۓhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjדubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhjӓubj)}(hhh]jM)}(h"pointer into the (pmd) page table.h]h"pointer into the (pmd) page table.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjӓubeh}(h]h ]h"]h$]h&]uh1jhjhMhj%ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubjM)}(hvCalled with the page table lock held, the i_mmap_rwsem held in write mode and the hugetlb vma lock held in write mode.h]hvCalled with the page table lock held, the i_mmap_rwsem held in write mode and the hugetlb vma lock held in write mode.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubjM)}(h**Note**h]j)}(hj;h]hNote}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubjM)}(hOThe caller must call huge_pmd_unshare_flush() before dropping the i_mmap_rwsem.h]hOThe caller must call huge_pmd_unshare_flush() before dropping the i_mmap_rwsem.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubjM)}(h **Return**h]j)}(hjbh]hReturn}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubjM)}(hZ1 if it was a shared PMD table and it got unmapped, or 0 if it was not a shared PMD table.h]hZ1 if it was a shared PMD table and it got unmapped, or 0 if it was not a shared PMD table.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"folio_isolate_hugetlb (C function)c.folio_isolate_hugetlbhNtauh1hhjhhhNhNubh)}(hhh](h)}(hHbool folio_isolate_hugetlb (struct folio *folio, struct list_head *list)h]h)}(hGbool folio_isolate_hugetlb(struct folio *folio, struct list_head *list)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM@ubh)}(hfolio_isolate_hugetlbh]j)}(hfolio_isolate_hugetlbh]hfolio_isolate_hugetlb}(hjǔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjÔubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM@ubj )}(h-(struct folio *folio, struct list_head *list)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjߔubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߔubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljɔsbc.folio_isolate_hugetlbasbuh1hhjߔubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߔubjF )}(hjI h]h*}(hj/hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjߔubj)}(hfolioh]hfolio}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjߔubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj۔ubj )}(hstruct list_head *listh](j5)}(hj8h]hstruct}(hjUhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjQubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubh)}(hhh]j)}(h list_headh]h list_head}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjumodnameN classnameNjpjs)}jv]jc.folio_isolate_hugetlbasbuh1hhjQubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjQubj)}(hlisth]hlist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj۔ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM@ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM@ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM@hjhhubj4)}(hhh]jM)}(h)try to isolate an allocated hugetlb folioh]h)try to isolate an allocated hugetlb folio}(hj֕hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM@hjӕhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM@ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXN**Parameters** ``struct folio *folio`` the folio to isolate ``struct list_head *list`` the list to add the folio to on success **Description** Isolate an allocated (refcount > 0) hugetlb folio, marking it as isolated/non-migratable, and moving it from the active list to the given list. Isolation will fail if **folio** is not an allocated hugetlb folio, or if it is already isolated/non-migratable. On success, an additional folio reference is taken that must be dropped using folio_putback_hugetlb() to undo the isolation. **Return** True if isolation worked, otherwise False.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMDhjubj)}(hhh](j)}(h-``struct folio *folio`` the folio to isolate h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMAhjubj)}(hhh]jM)}(hthe folio to isolateh]hthe folio to isolate}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,hMAhj-ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj,hMAhjubj)}(hC``struct list_head *list`` the list to add the folio to on success h](j)}(h``struct list_head *list``h]jS)}(hjPh]hstruct list_head *list}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjNubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMBhjJubj)}(hhh]jM)}(h'the list to add the folio to on successh]h'the list to add the folio to on success}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjehMBhjfubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjehMBhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMDhjubjM)}(hIsolate an allocated (refcount > 0) hugetlb folio, marking it as isolated/non-migratable, and moving it from the active list to the given list.h]hIsolate an allocated (refcount > 0) hugetlb folio, marking it as isolated/non-migratable, and moving it from the active list to the given list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMChjubjM)}(hpIsolation will fail if **folio** is not an allocated hugetlb folio, or if it is already isolated/non-migratable.h](hIsolation will fail if }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhP is not an allocated hugetlb folio, or if it is already isolated/non-migratable.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMGhjubjM)}(h|On success, an additional folio reference is taken that must be dropped using folio_putback_hugetlb() to undo the isolation.h]h|On success, an additional folio reference is taken that must be dropped using folio_putback_hugetlb() to undo the isolation.}(hjіhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMJhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMMhjubjM)}(h*True if isolation worked, otherwise False.h]h*True if isolation worked, otherwise False.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMNhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"folio_putback_hugetlb (C function)c.folio_putback_hugetlbhNtauh1hhjhhhNhNubh)}(hhh](h)}(h0void folio_putback_hugetlb (struct folio *folio)h]h)}(h/void folio_putback_hugetlb(struct folio *folio)h](j)}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMvubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj5hMvubh)}(hfolio_putback_hugetlbh]j)}(hfolio_putback_hugetlbh]hfolio_putback_hugetlb}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]jjuh1hhj#hhhj5hMvubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjdhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj`ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljJsbc.folio_putback_hugetlbasbuh1hhj`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj`ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj\ubah}(h]h ]h"]h$]h&]jjuh1j hj#hhhj5hMvubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj5hMvubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj5hMvhjhhubj4)}(hhh]jM)}(hunisolate a hugetlb folioh]hunisolate a hugetlb folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMvhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj5hMvubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXV**Parameters** ``struct folio *folio`` the isolated hugetlb folio **Description** Putback/un-isolate the hugetlb folio that was previous isolated using folio_isolate_hugetlb(): marking it non-isolated/migratable and putting it back onto the active list. Will drop the additional folio reference obtained through folio_isolate_hugetlb().h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMzhjubj)}(hhh]j)}(h3``struct folio *folio`` the isolated hugetlb folio h](j)}(h``struct folio *folio``h]jS)}(hj(h]hstruct folio *folio}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMwhj"ubj)}(hhh]jM)}(hthe isolated hugetlb folioh]hthe isolated hugetlb folio}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hMwhj>ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMwhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjch]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMyhjubjM)}(hPutback/un-isolate the hugetlb folio that was previous isolated using folio_isolate_hugetlb(): marking it non-isolated/migratable and putting it back onto the active list.h]hPutback/un-isolate the hugetlb folio that was previous isolated using folio_isolate_hugetlb(): marking it non-isolated/migratable and putting it back onto the active list.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chMxhjubjM)}(hRWill drop the additional folio reference obtained through folio_isolate_hugetlb().h]hRWill drop the additional folio reference obtained through folio_isolate_hugetlb().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:120: ./mm/hugetlb.chM|hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h folio_mark_accessed (C function)c.folio_mark_accessedhNtauh1hhjhhhNhNubh)}(hhh](h)}(h.void folio_mark_accessed (struct folio *folio)h]h)}(h-void folio_mark_accessed(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hjƘhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjŘhMubh)}(hfolio_mark_accessedh]j)}(hfolio_mark_accessedh]hfolio_mark_accessed}(hjؘhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԘubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjŘhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljژsbc.folio_mark_accessedasbuh1hhjubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj@hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjŘhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjŘhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjŘhMhjhhubj4)}(hhh]jM)}(h%Mark a folio as having seen activity.h]h%Mark a folio as having seen activity.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjthhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjŘhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to mark. **Description** This function will perform one of the following transitions: * inactive,unreferenced -> inactive,referenced * inactive,referenced -> active,unreferenced * active,unreferenced -> active,referenced When a newly allocated folio is not yet visible, so safe for non-atomic ops, __folio_set_referenced() may be substituted for folio_mark_accessed().h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]j)}(h+``struct folio *folio`` The folio to mark. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]jM)}(hThe folio to mark.h]hThe folio to mark.}(hjљhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj͙hMhjΙubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj͙hMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(h inactive,referencedh]jM)}(hjh]h6inactive,unreferenced -> inactive,referenced}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h6inactive,referenced -> active,unreferencedh]jM)}(hj5h]h6inactive,referenced -> active,unreferenced}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj3ubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(h5active,unreferenced -> active,referenced h]jM)}(h4active,unreferenced -> active,referencedh]h4active,unreferenced -> active,referenced}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjKubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]jWjI uh1j`Whj,hMhjubjM)}(hWhen a newly allocated folio is not yet visible, so safe for non-atomic ops, __folio_set_referenced() may be substituted for folio_mark_accessed().h]hWhen a newly allocated folio is not yet visible, so safe for non-atomic ops, __folio_set_referenced() may be substituted for folio_mark_accessed().}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_add_lru (C function)c.folio_add_lruhNtauh1hhjhhhNhNubh)}(hhh](h)}(h(void folio_add_lru (struct folio *folio)h]h)}(h'void folio_add_lru(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h folio_add_lruh]j)}(h folio_add_lruh]h folio_add_lru}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj֚hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjҚubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҚubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_add_lruasbuh1hhjҚubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҚubjF )}(hjI h]h*}(hj"hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjҚubj)}(hfolioh]hfolio}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҚubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjΚubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hAdd a folio to an LRU list.h]hAdd a folio to an LRU list.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjVhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjqjHjqjIjJjKuh1hhhhjhNhNubj)}(hXz**Parameters** ``struct folio *folio`` The folio to be added to the LRU. **Description** Queue the folio for addition to the LRU. The decision on whether to add the page to the [in]active [file|anon] list is deferred until the folio_batch is drained. This gives a chance for the caller of folio_add_lru() have the folio added to the active list using folio_mark_accessed().h](jM)}(h**Parameters**h]j)}(hj{h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjuubj)}(hhh]j)}(h:``struct folio *folio`` The folio to be added to the LRU. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]jM)}(h!The folio to be added to the LRU.h]h!The folio to be added to the LRU.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjuubjM)}(h**Description**h]j)}(hj՛h]h Description}(hjכhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӛubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjuubjM)}(hXQueue the folio for addition to the LRU. The decision on whether to add the page to the [in]active [file|anon] list is deferred until the folio_batch is drained. This gives a chance for the caller of folio_add_lru() have the folio added to the active list using folio_mark_accessed().h]hXQueue the folio for addition to the LRU. The decision on whether to add the page to the [in]active [file|anon] list is deferred until the folio_batch is drained. This gives a chance for the caller of folio_add_lru() have the folio added to the active list using folio_mark_accessed().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_add_lru_vma (C function)c.folio_add_lru_vmahNtauh1hhjhhhNhNubh)}(hhh](h)}(hHvoid folio_add_lru_vma (struct folio *folio, struct vm_area_struct *vma)h]h)}(hGvoid folio_add_lru_vma(struct folio *folio, struct vm_area_struct *vma)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMubh)}(hfolio_add_lru_vmah]j)}(hfolio_add_lru_vmah]hfolio_add_lru_vma}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj(hMubj )}(h1(struct folio *folio, struct vm_area_struct *vma)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjWhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(hfolioh]hfolio}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jy)}jlj=sbc.folio_add_lru_vmaasbuh1hhjSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjɜhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjŜubj)}(h h]h }(hj֜hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŜubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.folio_add_lru_vmaasbuh1hhjŜubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŜubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjŜubj)}(hvmah]hvma}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŜubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj(hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj(hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj(hMhjhhubj4)}(hhh]jM)}(h5Add a folio to the appropriate LRU list for this VMA.h]h5Add a folio to the appropriate LRU list for this VMA.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjGhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj(hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjbjHjbjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` The folio to be added to the LRU. ``struct vm_area_struct *vma`` VMA in which the folio is mapped. **Description** If the VMA is mlocked, **folio** is added to the unevictable list. Otherwise, it is treated the same way as folio_add_lru().h](jM)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjfubj)}(hhh](j)}(h:``struct folio *folio`` The folio to be added to the LRU. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]jM)}(h!The folio to be added to the LRU.h]h!The folio to be added to the LRU.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hA``struct vm_area_struct *vma`` VMA in which the folio is mapped. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjĝh]hstruct vm_area_struct *vma}(hjƝhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]jM)}(h!VMA in which the folio is mapped.h]h!VMA in which the folio is mapped.}(hjݝhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjٝhMhjڝubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjٝhMhjubeh}(h]h ]h"]h$]h&]uh1jhjfubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjfubjM)}(h|If the VMA is mlocked, **folio** is added to the unevictable list. Otherwise, it is treated the same way as folio_add_lru().h](hIf the VMA is mlocked, }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\ is added to the unevictable list. Otherwise, it is treated the same way as folio_add_lru().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"deactivate_file_folio (C function)c.deactivate_file_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(h0void deactivate_file_folio (struct folio *folio)h]h)}(h/void deactivate_file_folio(struct folio *folio)h](j)}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRhhhjdhMubh)}(hdeactivate_file_folioh]j)}(hdeactivate_file_folioh]hdeactivate_file_folio}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]jjuh1hhjRhhhjdhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljysbc.deactivate_file_folioasbuh1hhjubj)}(h h]h }(hjўhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjߞhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjRhhhjdhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjNhhhjdhMubah}(h]jIah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjdhMhjKhhubj4)}(hhh]jM)}(hDeactivate a file folio.h]hDeactivate a file folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjKhhhjdhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj.jHj.jIjJjKuh1hhhhjhNhNubj)}(hX&**Parameters** ``struct folio *folio`` Folio to deactivate. **Description** This function hints to the VM that **folio** is a good reclaim candidate, for example if its invalidation fails due to the folio being dirty or under writeback. **Context** Caller holds a reference on the folio.h](jM)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj2ubj)}(hhh]j)}(h-``struct folio *folio`` Folio to deactivate. h](j)}(h``struct folio *folio``h]jS)}(hjWh]hstruct folio *folio}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjQubj)}(hhh]jM)}(hFolio to deactivate.h]hFolio to deactivate.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhMhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj2ubjM)}(hThis function hints to the VM that **folio** is a good reclaim candidate, for example if its invalidation fails due to the folio being dirty or under writeback.h](h#This function hints to the VM that }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubht is a good reclaim candidate, for example if its invalidation fails due to the folio being dirty or under writeback.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj2ubjM)}(h **Context**h]j)}(hj˟h]hContext}(hj͟hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɟubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj2ubjM)}(h&Caller holds a reference on the folio.h]h&Caller holds a reference on the folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h folio_mark_lazyfree (C function)c.folio_mark_lazyfreehNtauh1hhjhhhNhNubh)}(hhh](h)}(h.void folio_mark_lazyfree (struct folio *folio)h]h)}(h-void folio_mark_lazyfree(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMubh)}(hfolio_mark_lazyfreeh]j)}(hfolio_mark_lazyfreeh]hfolio_mark_lazyfree}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhjhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjMhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjIubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubh)}(hhh]j)}(hfolioh]hfolio}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmmodnameN classnameNjpjs)}jv]jy)}jlj3sbc.folio_mark_lazyfreeasbuh1hhjIubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjIubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjEubah}(h]h ]h"]h$]h&]jjuh1j hj hhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hmake an anon folio lazyfreeh]hmake an anon folio lazyfree}(hjРhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj͠hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` folio to deactivate **Description** folio_mark_lazyfree() moves **folio** to the inactive file list. This is done to accelerate the reclaim of **folio**.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]j)}(h,``struct folio *folio`` folio to deactivate h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhj ubj)}(hhh]jM)}(hfolio to deactivateh]hfolio to deactivate}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj&hMhj'ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj&hMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjLh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(hufolio_mark_lazyfree() moves **folio** to the inactive file list. This is done to accelerate the reclaim of **folio**.h](hfolio_mark_lazyfree() moves }(hjbhhhNhNubj)}(h **folio**h]hfolio}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubhF to the inactive file list. This is done to accelerate the reclaim of }(hjbhhhNhNubj)}(h **folio**h]hfolio}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubh.}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&lru_cache_drain_for_folio (C function)c.lru_cache_drain_for_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(htvoid lru_cache_drain_for_folio (const struct folio *folio, unsigned int extra_refs, enum lru_cache_drained *drained)h]h)}(hsvoid lru_cache_drain_for_folio(const struct folio *folio, unsigned int extra_refs, enum lru_cache_drained *drained)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMvubj)}(h h]h }(hjġhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjáhMvubh)}(hlru_cache_drain_for_folioh]j)}(hlru_cache_drain_for_folioh]hlru_cache_drain_for_folio}(hj֡hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjҡubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjáhMvubj )}(hU(const struct folio *folio, unsigned int extra_refs, enum lru_cache_drained *drained)h](j )}(hconst struct folio *folioh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-modnameN classnameNjpjs)}jv]jy)}jljءsbc.lru_cache_drain_for_folioasbuh1hhjubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjYhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int extra_refsh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h extra_refsh]h extra_refs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum lru_cache_drained *drainedh](j5)}(hjh]henum}(hjТhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj̢ubj)}(h h]h }(hjݢhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̢ubh)}(hhh]j)}(hlru_cache_drainedh]hlru_cache_drained}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jGc.lru_cache_drain_for_folioasbuh1hhj̢ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̢ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj̢ubj)}(hdrainedh]hdrained}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj̢ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjáhMvubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjáhMvubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjáhMvhjhhubj4)}(hhh]jM)}(h:drain LRU caches if the caches might hold folio referencesh]h:drain LRU caches if the caches might hold folio references}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMvhjNhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjáhMvubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjijHjijIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct folio *folio`` The folio. ``unsigned int extra_refs`` Extra folio references held by the caller. ``enum lru_cache_drained *drained`` Drain status for batch folio processing. **Description** Drain LRU caches if the caches might hold folio references. Start with a local LRU cache drain, to then drain LRU caches on all CPUs if local draining was insufficient. This function detects LRU cache references by comparing the folio refcount with the sum of the expected folio refcount + extra references held by the caller. Note that we cannot rely on PG_lru to reliably detect all LRU cache references, and there are rare scenarios (concurrent folio (un)mapping) where this function might miss detecting LRU cache references. If **drained** is not NULL, the function will avoid re-draining LRU caches when processing multiple folios in a row. In that case, the variable **drained** points at must be initialized to LRU_CACHE_NOT_DRAINED before the first invocation by the caller.h](jM)}(h**Parameters**h]j)}(hjsh]h Parameters}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMzhjmubj)}(hhh](j)}(h)``const struct folio *folio`` The folio. h](j)}(h``const struct folio *folio``h]jS)}(hjh]hconst struct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMxhjubj)}(hhh]jM)}(h The folio.h]h The folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMxhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMxhjubj)}(hG``unsigned int extra_refs`` Extra folio references held by the caller. h](j)}(h``unsigned int extra_refs``h]jS)}(hjˣh]hunsigned int extra_refs}(hjͣhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjɣubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMyhjţubj)}(hhh]jM)}(h*Extra folio references held by the caller.h]h*Extra folio references held by the caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMyhjubah}(h]h ]h"]h$]h&]uh1jhjţubeh}(h]h ]h"]h$]h&]uh1jhjhMyhjubj)}(hM``enum lru_cache_drained *drained`` Drain status for batch folio processing. h](j)}(h#``enum lru_cache_drained *drained``h]jS)}(hjh]henum lru_cache_drained *drained}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMzhjubj)}(hhh]jM)}(h(Drain status for batch folio processing.h]h(Drain status for batch folio processing.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMzhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMzhjubeh}(h]h ]h"]h$]h&]uh1jhjmubjM)}(h**Description**h]j)}(hj?h]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chM|hjmubjM)}(hDrain LRU caches if the caches might hold folio references. Start with a local LRU cache drain, to then drain LRU caches on all CPUs if local draining was insufficient.h]hDrain LRU caches if the caches might hold folio references. Start with a local LRU cache drain, to then drain LRU caches on all CPUs if local draining was insufficient.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chM{hjmubjM)}(hXhThis function detects LRU cache references by comparing the folio refcount with the sum of the expected folio refcount + extra references held by the caller. Note that we cannot rely on PG_lru to reliably detect all LRU cache references, and there are rare scenarios (concurrent folio (un)mapping) where this function might miss detecting LRU cache references.h]hXhThis function detects LRU cache references by comparing the folio refcount with the sum of the expected folio refcount + extra references held by the caller. Note that we cannot rely on PG_lru to reliably detect all LRU cache references, and there are rare scenarios (concurrent folio (un)mapping) where this function might miss detecting LRU cache references.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjmubjM)}(hIf **drained** is not NULL, the function will avoid re-draining LRU caches when processing multiple folios in a row. In that case, the variable **drained** points at must be initialized to LRU_CACHE_NOT_DRAINED before the first invocation by the caller.h](hIf }(hjshhhNhNubj)}(h **drained**h]hdrained}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh is not NULL, the function will avoid re-draining LRU caches when processing multiple folios in a row. In that case, the variable }(hjshhhNhNubj)}(h **drained**h]hdrained}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubhb points at must be initialized to LRU_CACHE_NOT_DRAINED before the first invocation by the caller.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolios_put_refs (C function)c.folios_put_refshNtauh1hhjhhhNhNubh)}(hhh](h)}(hEvoid folios_put_refs (struct folio_batch *folios, unsigned int *refs)h]h)}(hDvoid folios_put_refs(struct folio_batch *folios, unsigned int *refs)h](j)}(hvoidh]hvoid}(hjƤhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj¤hhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hjդhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj¤hhhjԤhMubh)}(hfolios_put_refsh]j)}(hfolios_put_refsh]hfolios_put_refs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj¤hhhjԤhMubj )}(h0(struct folio_batch *folios, unsigned int *refs)h](j )}(hstruct folio_batch *foliosh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj#modnameN classnameNjpjs)}jv]jy)}jljsbc.folios_put_refsasbuh1hhjubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjOhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfoliosh]hfolios}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int *refsh](j)}(hunsignedh]hunsigned}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjqubj)}(hrefsh]hrefs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj¤hhhjԤhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjԤhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjԤhMhjhhubj4)}(hhh]jM)}(h0Reduce the reference count on a batch of folios.h]h0Reduce the reference count on a batch of folios.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjԤhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX{**Parameters** ``struct folio_batch *folios`` The folios. ``unsigned int *refs`` The number of refs to subtract from each folio. **Description** Like folio_put(), but for a batch of folios. This is more efficient than writing the loop yourself as it will optimise the locks which need to be taken if the folios are freed. The folios batch is returned empty and ready to be reused for another batch; there is no need to reinitialise it. If **refs** is NULL, we subtract one from each folio refcount. **Context** May be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh](j)}(h+``struct folio_batch *folios`` The folios. h](j)}(h``struct folio_batch *folios``h]jS)}(hj%h]hstruct folio_batch *folios}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]jM)}(h The folios.h]h The folios.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(hG``unsigned int *refs`` The number of refs to subtract from each folio. h](j)}(h``unsigned int *refs``h]jS)}(hj^h]hunsigned int *refs}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjXubj)}(hhh]jM)}(h/The number of refs to subtract from each folio.h]h/The number of refs to subtract from each folio.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjshMhjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(hXdLike folio_put(), but for a batch of folios. This is more efficient than writing the loop yourself as it will optimise the locks which need to be taken if the folios are freed. The folios batch is returned empty and ready to be reused for another batch; there is no need to reinitialise it. If **refs** is NULL, we subtract one from each folio refcount.h](hX)Like folio_put(), but for a batch of folios. This is more efficient than writing the loop yourself as it will optimise the locks which need to be taken if the folios are freed. The folios batch is returned empty and ready to be reused for another batch; there is no need to reinitialise it. If }(hjhhhNhNubj)}(h**refs**h]hrefs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 is NULL, we subtract one from each folio refcount.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(h **Context**h]j)}(hjҦh]hContext}(hjԦhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjЦubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.h]hoMay be called in process or interrupt context, but not in NMI context. May be called while holding a spinlock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hrelease_pages (C function)c.release_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h2void release_pages (release_pages_arg arg, int nr)h]h)}(h1void release_pages(release_pages_arg arg, int nr)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj%hMubh)}(h release_pagesh]j)}(h release_pagesh]h release_pages}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj%hMubj )}(h(release_pages_arg arg, int nr)h](j )}(hrelease_pages_arg argh](h)}(hhh]j)}(hrelease_pages_argh]hrelease_pages_arg}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjYmodnameN classnameNjpjs)}jv]jy)}jlj:sbc.release_pagesasbuh1hhjPubj)}(h h]h }(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubj)}(hargh]harg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubj )}(hint nrh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnrh]hnr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjLubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj%hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj%hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%hMhj hhubj4)}(hhh]jM)}(hbatched put_page()h]hbatched put_page()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj%hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``release_pages_arg arg`` array of pages to release ``int nr`` number of pages **Description** Decrement the reference count on all the pages in **arg**. If it fell to zero, remove the page from the LRU and free it. Note that the argument can be an array of pages, encoded pages, or folio pointers. We ignore any encoded bits, and turn any of them into just a folio that gets free'd.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh](j)}(h4``release_pages_arg arg`` array of pages to release h](j)}(h``release_pages_arg arg``h]jS)}(hj%h]hrelease_pages_arg arg}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubj)}(hhh]jM)}(harray of pages to releaseh]harray of pages to release}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hMhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjubj)}(h``int nr`` number of pages h](j)}(h ``int nr``h]jS)}(hj^h]hint nr}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjXubj)}(hhh]jM)}(hnumber of pagesh]hnumber of pages}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjshMhjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjshMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(hyDecrement the reference count on all the pages in **arg**. If it fell to zero, remove the page from the LRU and free it.h](h2Decrement the reference count on all the pages in }(hjhhhNhNubj)}(h**arg**h]harg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@. If it fell to zero, remove the page from the LRU and free it.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubjM)}(hNote that the argument can be an array of pages, encoded pages, or folio pointers. We ignore any encoded bits, and turn any of them into just a folio that gets free'd.h]hNote that the argument can be an array of pages, encoded pages, or folio pointers. We ignore any encoded bits, and turn any of them into just a folio that gets free’d.}(hjШhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h,folio_batch_remove_exceptionals (C function)!c.folio_batch_remove_exceptionalshNtauh1hhjhhhNhNubh)}(hhh](h)}(hAvoid folio_batch_remove_exceptionals (struct folio_batch *fbatch)h]h)}(h@void folio_batch_remove_exceptionals(struct folio_batch *fbatch)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMMubh)}(hfolio_batch_remove_exceptionalsh]j)}(hfolio_batch_remove_exceptionalsh]hfolio_batch_remove_exceptionals}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMMubj )}(h(struct folio_batch *fbatch)h]j )}(hstruct folio_batch *fbatchh](j5)}(hj8h]hstruct}(hj<hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj8ubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj\modnameN classnameNjpjs)}jv]jy)}jlj"sb!c.folio_batch_remove_exceptionalsasbuh1hhj8ubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj8ubj)}(hfbatchh]hfbatch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj4ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMMhjhhubj4)}(hhh]jM)}(hPrune non-folios from a batch.h]hPrune non-folios from a batch.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjשjHjשjIjJjKuh1hhhhjhNhNubj)}(hX7**Parameters** ``struct folio_batch *fbatch`` The batch to prune **Description** find_get_entries() fills a batch with both folios and shadow/swap/DAX entries. This function prunes all the non-folio entries from **fbatch** without leaving holes, so that it can be passed on to folio-only batch operations.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjߩubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMQhj۩ubj)}(hhh]j)}(h2``struct folio_batch *fbatch`` The batch to prune h](j)}(h``struct folio_batch *fbatch``h]jS)}(hjh]hstruct folio_batch *fbatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMNhjubj)}(hhh]jM)}(hThe batch to pruneh]hThe batch to prune}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMNhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjubah}(h]h ]h"]h$]h&]uh1jhj۩ubjM)}(h**Description**h]j)}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMPhj۩ubjM)}(hfind_get_entries() fills a batch with both folios and shadow/swap/DAX entries. This function prunes all the non-folio entries from **fbatch** without leaving holes, so that it can be passed on to folio-only batch operations.h](hfind_get_entries() fills a batch with both folios and shadow/swap/DAX entries. This function prunes all the non-folio entries from }(hjQhhhNhNubj)}(h **fbatch**h]hfbatch}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubhS without leaving holes, so that it can be passed on to folio-only batch operations.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:121: ./mm/folio.chMOhj۩ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*get_mem_cgroup_css_from_folio (C function)c.get_mem_cgroup_css_from_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hPstruct cgroup_subsys_state * get_mem_cgroup_css_from_folio (struct folio *folio)h]h)}(hNstruct cgroup_subsys_state *get_mem_cgroup_css_from_folio(struct folio *folio)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMDubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMDubh)}(hhh]j)}(hcgroup_subsys_stateh]hcgroup_subsys_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlget_mem_cgroup_css_from_foliosbc.get_mem_cgroup_css_from_folioasbuh1hhjhhhjhMDubj)}(h h]h }(hjҪhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMDubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMDubh)}(hget_mem_cgroup_css_from_folioh]j)}(hjϪh]hget_mem_cgroup_css_from_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMDubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj,modnameN classnameNjpjs)}jv]jͪc.get_mem_cgroup_css_from_folioasbuh1hhjubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjVhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMDubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMDubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMDhjhhubj4)}(hhh]jM)}(h2acquire a css of the memcg associated with a folioh]h2acquire a css of the memcg associated with a folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMDhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMDubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXR**Parameters** ``struct folio *folio`` folio of interest **Description** If memcg is bound to the default hierarchy, css of the memcg associated with **folio** is returned. The returned css remains associated with **folio** until it is released. If memcg is bound to a traditional hierarchy, the css of root_mem_cgroup is returned.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMHhjubj)}(hhh]j)}(h*``struct folio *folio`` folio of interest h](j)}(h``struct folio *folio``h]jS)}(hjΫh]hstruct folio *folio}(hjЫhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj̫ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMEhjȫubj)}(hhh]jM)}(hfolio of interesth]hfolio of interest}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMEhjubah}(h]h ]h"]h$]h&]uh1jhjȫubeh}(h]h ]h"]h$]h&]uh1jhjhMEhjūubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMGhjubjM)}(hIf memcg is bound to the default hierarchy, css of the memcg associated with **folio** is returned. The returned css remains associated with **folio** until it is released.h](hMIf memcg is bound to the default hierarchy, css of the memcg associated with }(hjhhhNhNubj)}(h **folio**h]hfolio}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh8 is returned. The returned css remains associated with }(hjhhhNhNubj)}(h **folio**h]hfolio}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh until it is released.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMFhjubjM)}(hUIf memcg is bound to a traditional hierarchy, the css of root_mem_cgroup is returned.h]hUIf memcg is bound to a traditional hierarchy, the css of root_mem_cgroup is returned.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMJhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpage_cgroup_ino (C function)c.page_cgroup_inohNtauh1hhjhhhNhNubh)}(hhh](h)}(h)ino_t page_cgroup_ino (struct page *page)h]h)}(h(ino_t page_cgroup_ino(struct page *page)h](h)}(hhh]j)}(hino_th]hino_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlpage_cgroup_inosbc.page_cgroup_inoasbuh1hhj}hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM[ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhjhM[ubh)}(hpage_cgroup_inoh]j)}(hjh]hpage_cgroup_ino}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj}hhhjhM[ubj )}(h(struct page *page)h]j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjӬhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjϬubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjϬubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.page_cgroup_inoasbuh1hhjϬubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjϬubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjϬubj)}(hpageh]hpage}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjϬubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjˬubah}(h]h ]h"]h$]h&]jjuh1j hj}hhhjhM[ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjyhhhjhM[ubah}(h]jtah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM[hjvhhubj4)}(hhh]jM)}(h5return inode number of the memcg a page is charged toh]h5return inode number of the memcg a page is charged to}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM[hjQhhubah}(h]h ]h"]h$]h&]uh1j3hjvhhhjhM[ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjljHjljIjJjKuh1hhhhjhNhNubj)}(hX5**Parameters** ``struct page *page`` the page **Description** Look up the closest online ancestor of the memory cgroup **page** is charged to and return its inode number or 0 if **page** is not charged to any cgroup. It is safe to call this function without holding a reference to **page**. Note, this function is inherently racy, because there is nothing to prevent the cgroup inode from getting torn down and potentially reallocated a moment after page_cgroup_ino() returns, so it only should be used by callers that do not care (such as procfs interfaces).h](jM)}(h**Parameters**h]j)}(hjvh]h Parameters}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM_hjpubj)}(hhh]j)}(h``struct page *page`` the page h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM\hjubj)}(hhh]jM)}(hthe pageh]hthe page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM\hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM\hjubah}(h]h ]h"]h$]h&]uh1jhjpubjM)}(h**Description**h]j)}(hjЭh]h Description}(hjҭhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjέubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM^hjpubjM)}(hLook up the closest online ancestor of the memory cgroup **page** is charged to and return its inode number or 0 if **page** is not charged to any cgroup. It is safe to call this function without holding a reference to **page**.h](h9Look up the closest online ancestor of the memory cgroup }(hjhhhNhNubj)}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 is charged to and return its inode number or 0 if }(hjhhhNhNubj)}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh_ is not charged to any cgroup. It is safe to call this function without holding a reference to }(hjhhhNhNubj)}(h**page**h]hpage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM]hjpubjM)}(hX Note, this function is inherently racy, because there is nothing to prevent the cgroup inode from getting torn down and potentially reallocated a moment after page_cgroup_ino() returns, so it only should be used by callers that do not care (such as procfs interfaces).h]hX Note, this function is inherently racy, because there is nothing to prevent the cgroup inode from getting torn down and potentially reallocated a moment after page_cgroup_ino() returns, so it only should be used by callers that do not care (such as procfs interfaces).}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMahjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(lruvec_page_state_monotonic (C function)c.lruvec_page_state_monotonichNtauh1hhjhhhNhNubh)}(hhh](h)}(hZunsigned long lruvec_page_state_monotonic (struct lruvec *lruvec, enum node_stat_item idx)h]h)}(hYunsigned long lruvec_page_state_monotonic(struct lruvec *lruvec, enum node_stat_item idx)h](j)}(hunsignedh]hunsigned}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhjhhMubj)}(hlongh]hlong}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhjhhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhjhhMubh)}(hlruvec_page_state_monotonich]j)}(hlruvec_page_state_monotonich]hlruvec_page_state_monotonic}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjVhhhjhhMubj )}(h0(struct lruvec *lruvec, enum node_stat_item idx)h](j )}(hstruct lruvec *lruvech](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hlruvech]hlruvec}(hjѮhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjήubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjӮmodnameN classnameNjpjs)}jv]jy)}jljsbc.lruvec_page_state_monotonicasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hlruvech]hlruvec}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum node_stat_item idxh](j5)}(hjh]henum}(hj%hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj!ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubh)}(hhh]j)}(hnode_stat_itemh]hnode_stat_item}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jc.lruvec_page_state_monotonicasbuh1hhj!ubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hidxh]hidx}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjVhhhjhhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjRhhhjhhMubah}(h]jMah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhhMhjOhhubj4)}(hhh]jM)}(h0non-clamping lruvec stat read for delta samplingh]h0non-clamping lruvec stat read for delta sampling}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjOhhhjhhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX/**Parameters** ``struct lruvec *lruvec`` the LRU vector to read from ``enum node_stat_item idx`` the node_stat_item to read **Description** Returns the raw state[idx] value cast to unsigned long, skipping the clamp-negative-to-zero step in lruvec_page_state(). Intended for callers that snapshot a monotonically-incremented counter and subtract two samples: unsigned modular arithmetic then yields the correct delta across a signed-long wraparound (a real hazard on 32-bit) that the clamp would otherwise turn into a huge spurious delta. Do NOT use for non-monotonic page-count reads where a transient negative reading from per-CPU delta skew must present as zero. XXX: This helper (and its node/global peers) exists because some monotonically-incremented event counters are stored in enum node_stat_item.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h6``struct lruvec *lruvec`` the LRU vector to read from h](j)}(h``struct lruvec *lruvec``h]jS)}(hjگh]hstruct lruvec *lruvec}(hjܯhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjدubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjԯubj)}(hhh]jM)}(hthe LRU vector to read fromh]hthe LRU vector to read from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjԯubeh}(h]h ]h"]h$]h&]uh1jhjhMhjѯubj)}(h7``enum node_stat_item idx`` the node_stat_item to read h](j)}(h``enum node_stat_item idx``h]jS)}(hjh]henum node_stat_item idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj ubj)}(hhh]jM)}(hthe node_stat_item to readh]hthe node_stat_item to read}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj(hMhjѯubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjNh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hXReturns the raw state[idx] value cast to unsigned long, skipping the clamp-negative-to-zero step in lruvec_page_state(). Intended for callers that snapshot a monotonically-incremented counter and subtract two samples: unsigned modular arithmetic then yields the correct delta across a signed-long wraparound (a real hazard on 32-bit) that the clamp would otherwise turn into a huge spurious delta.h]hXReturns the raw state[idx] value cast to unsigned long, skipping the clamp-negative-to-zero step in lruvec_page_state(). Intended for callers that snapshot a monotonically-incremented counter and subtract two samples: unsigned modular arithmetic then yields the correct delta across a signed-long wraparound (a real hazard on 32-bit) that the clamp would otherwise turn into a huge spurious delta.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h~Do NOT use for non-monotonic page-count reads where a transient negative reading from per-CPU delta skew must present as zero. h]h~Do NOT use for non-monotonic page-count reads where a transient negative reading from per-CPU delta skew must present as zero.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hjubjM)}(hXXX: This helper (and its node/global peers) exists because some monotonically-incremented event counters are stored in enum node_stat_item.h]hXXX: This helper (and its node/global peers) exists because some monotonically-incremented event counters are stored in enum node_stat_item.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmod_memcg_state (C function)c.mod_memcg_statehNtauh1hhjhhhNhNubh)}(hhh](h)}(hRvoid mod_memcg_state (struct mem_cgroup *memcg, enum memcg_stat_item idx, int val)h]h)}(hQvoid mod_memcg_state(struct mem_cgroup *memcg, enum memcg_stat_item idx, int val)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmod_memcg_stateh]j)}(hmod_memcg_stateh]hmod_memcg_state}(hjҰhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjΰubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h=(struct mem_cgroup *memcg, enum memcg_stat_item idx, int val)h](j )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj԰sbc.mod_memcg_stateasbuh1hhjubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj:hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmemcgh]hmemcg}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum memcg_stat_item idxh](j5)}(hjh]henum}(hj`hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj\ubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubh)}(hhh]j)}(hmemcg_stat_itemh]hmemcg_stat_item}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j(c.mod_memcg_stateasbuh1hhj\ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubj)}(hidxh]hidx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hint valh](j)}(hinth]hint}(hjñhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjѱhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvalh]hval}(hj߱hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hupdate cgroup memory statisticsh]hupdate cgroup memory statistics}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!jHj!jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mem_cgroup *memcg`` the memory cgroup ``enum memcg_stat_item idx`` the stat item - can be enum memcg_stat_item or enum node_stat_item ``int val`` delta to add to the counter, can be negativeh](jM)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj%ubj)}(hhh](j)}(h/``struct mem_cgroup *memcg`` the memory cgroup h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hjJh]hstruct mem_cgroup *memcg}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjDubj)}(hhh]jM)}(hthe memory cgrouph]hthe memory cgroup}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_hMhj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj_hMhjAubj)}(h```enum memcg_stat_item idx`` the stat item - can be enum memcg_stat_item or enum node_stat_item h](j)}(h``enum memcg_stat_item idx``h]jS)}(hjh]henum memcg_stat_item idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj}ubj)}(hhh]jM)}(hBthe stat item - can be enum memcg_stat_item or enum node_stat_itemh]hBthe stat item - can be enum memcg_stat_item or enum node_stat_item}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjAubj)}(h8``int val`` delta to add to the counter, can be negativeh](j)}(h ``int val``h]jS)}(hjh]hint val}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h,delta to add to the counter, can be negativeh]h,delta to add to the counter, can be negative}(hjղhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjҲubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjѲhMhjAubeh}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmod_lruvec_state (C function)c.mod_lruvec_statehNtauh1hhjhhhNhNubh)}(hhh](h)}(hOvoid mod_lruvec_state (struct lruvec *lruvec, enum node_stat_item idx, int val)h]h)}(hNvoid mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, int val)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj$hMubh)}(hmod_lruvec_stateh]j)}(hmod_lruvec_stateh]hmod_lruvec_state}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj$hMubj )}(h9(struct lruvec *lruvec, enum node_stat_item idx, int val)h](j )}(hstruct lruvec *lruvech](j5)}(hj8h]hstruct}(hjShhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjOubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubh)}(hhh]j)}(hlruvech]hlruvec}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjsmodnameN classnameNjpjs)}jv]jy)}jlj9sbc.mod_lruvec_stateasbuh1hhjOubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjOubj)}(hlruvech]hlruvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjKubj )}(henum node_stat_item idxh](j5)}(hjh]henum}(hjųhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjҳhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hnode_stat_itemh]hnode_stat_item}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mod_lruvec_stateasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidxh]hidx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjKubj )}(hint valh](j)}(hinth]hint}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hvalh]hval}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjKubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj$hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj$hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj$hMhj hhubj4)}(hhh]jM)}(hupdate lruvec memory statisticsh]hupdate lruvec memory statistics}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjkhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj$hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXt**Parameters** ``struct lruvec *lruvec`` the lruvec ``enum node_stat_item idx`` the stat item ``int val`` delta to add to the counter, can be negative **Description** The lruvec is the intersection of the NUMA node and a cgroup. This function updates the all three counters that are affected by a change of state at this level: per-node, per-cgroup, per-lruvec.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h%``struct lruvec *lruvec`` the lruvec h](j)}(h``struct lruvec *lruvec``h]jS)}(hjh]hstruct lruvec *lruvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h the lruvech]h the lruvec}(hjȴhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjĴhMhjŴubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjĴhMhjubj)}(h*``enum node_stat_item idx`` the stat item h](j)}(h``enum node_stat_item idx``h]jS)}(hjh]henum node_stat_item idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h the stat itemh]h the stat item}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h9``int val`` delta to add to the counter, can be negative h](j)}(h ``int val``h]jS)}(hj!h]hint val}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h,delta to add to the counter, can be negativeh]h,delta to add to the counter, can be negative}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj\h]h Description}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hThe lruvec is the intersection of the NUMA node and a cgroup. This function updates the all three counters that are affected by a change of state at this level: per-node, per-cgroup, per-lruvec.h]hThe lruvec is the intersection of the NUMA node and a cgroup. This function updates the all three counters that are affected by a change of state at this level: per-node, per-cgroup, per-lruvec.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hcount_memcg_events (C function)c.count_memcg_eventshNtauh1hhjhhhNhNubh)}(hhh](h)}(h_void count_memcg_events (struct mem_cgroup *memcg, enum vm_event_item idx, unsigned long count)h]h)}(h^void count_memcg_events(struct mem_cgroup *memcg, enum vm_event_item idx, unsigned long count)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM,ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM,ubh)}(hcount_memcg_eventsh]j)}(hcount_memcg_eventsh]hcount_memcg_events}(hjµhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM,ubj )}(hG(struct mem_cgroup *memcg, enum vm_event_item idx, unsigned long count)h](j )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hj޵hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjڵubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڵubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljĵsbc.count_memcg_eventsasbuh1hhjڵubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڵubjF )}(hjI h]h*}(hj*hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjڵubj)}(hmemcgh]hmemcg}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڵubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjֵubj )}(henum vm_event_item idxh](j5)}(hjh]henum}(hjPhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjLubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubh)}(hhh]j)}(h vm_event_itemh]h vm_event_item}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjpmodnameN classnameNjpjs)}jv]jc.count_memcg_eventsasbuh1hhjLubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj)}(hidxh]hidx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjֵubj )}(hunsigned long counth](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj϶hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjݶhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjֵubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM,ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM,ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM,hjhhubj4)}(hhh]jM)}(haccount VM events in a cgrouph]haccount VM events in a cgroup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM,hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM,ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj-jHj-jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mem_cgroup *memcg`` the memory cgroup ``enum vm_event_item idx`` the event item ``unsigned long count`` the number of events that occurredh](jM)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM0hj1ubj)}(hhh](j)}(h/``struct mem_cgroup *memcg`` the memory cgroup h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hjVh]hstruct mem_cgroup *memcg}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjTubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM-hjPubj)}(hhh]jM)}(hthe memory cgrouph]hthe memory cgroup}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjkhM-hjlubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjkhM-hjMubj)}(h*``enum vm_event_item idx`` the event item h](j)}(h``enum vm_event_item idx``h]jS)}(hjh]henum vm_event_item idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM.hjubj)}(hhh]jM)}(hthe event itemh]hthe event item}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM.hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjMubj)}(h:``unsigned long count`` the number of events that occurredh](j)}(h``unsigned long count``h]jS)}(hjȷh]hunsigned long count}(hjʷhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjƷubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM0hj·ubj)}(hhh]jM)}(h"the number of events that occurredh]h"the number of events that occurred}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM/hj޷ubah}(h]h ]h"]h$]h&]uh1jhj·ubeh}(h]h ]h"]h$]h&]uh1jhjݷhM0hjMubeh}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#get_mem_cgroup_from_mm (C function)c.get_mem_cgroup_from_mmhNtauh1hhjhhhNhNubh)}(hhh](h)}(hAstruct mem_cgroup * get_mem_cgroup_from_mm (struct mm_struct *mm)h]h)}(h?struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm)h](j5)}(hj8h]hstruct}(hj"hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM{ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj/hM{ubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjCmodnameN classnameNjpjs)}jv]jy)}jlget_mem_cgroup_from_mmsbc.get_mem_cgroup_from_mmasbuh1hhjhhhj/hM{ubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj/hM{ubjF )}(hjI h]h*}(hjphhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj/hM{ubh)}(hget_mem_cgroup_from_mmh]j)}(hj_h]hget_mem_cgroup_from_mm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj/hM{ubj )}(h(struct mm_struct *mm)h]j )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j]c.get_mem_cgroup_from_mmasbuh1hhjubj)}(h h]h }(hjظhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmmh]hmm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj/hM{ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj/hM{ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/hM{hjhhubj4)}(hhh]jM)}(h.Obtain a reference on given mm_struct's memcg.h]h0Obtain a reference on given mm_struct’s memcg.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM{hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj/hM{ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj5jHj5jIjJjKuh1hhhhjhNhNubj)}(hXc**Parameters** ``struct mm_struct *mm`` mm from which memcg should be extracted. It can be NULL. **Description** Obtain a reference on mm->memcg and returns it if successful. If mm is NULL, then the memcg is chosen as follows: 1) The active memcg, if set. 2) current->mm->memcg, if available 3) root memcg If mem_cgroup is disabled, NULL is returned.h](jM)}(h**Parameters**h]j)}(hj?h]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj9ubj)}(hhh]j)}(hR``struct mm_struct *mm`` mm from which memcg should be extracted. It can be NULL. h](j)}(h``struct mm_struct *mm``h]jS)}(hj^h]hstruct mm_struct *mm}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM|hjXubj)}(hhh]jM)}(h8mm from which memcg should be extracted. It can be NULL.h]h8mm from which memcg should be extracted. It can be NULL.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjshM|hjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjshM|hjUubah}(h]h ]h"]h$]h&]uh1jhj9ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM~hj9ubjM)}(hObtain a reference on mm->memcg and returns it if successful. If mm is NULL, then the memcg is chosen as follows: 1) The active memcg, if set. 2) current->mm->memcg, if available 3) root memcg If mem_cgroup is disabled, NULL is returned.h]hObtain a reference on mm->memcg and returns it if successful. If mm is NULL, then the memcg is chosen as follows: 1) The active memcg, if set. 2) current->mm->memcg, if available 3) root memcg If mem_cgroup is disabled, NULL is returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM}hj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(get_mem_cgroup_from_current (C function)c.get_mem_cgroup_from_currenthNtauh1hhjhhhNhNubh)}(hhh](h)}(h6struct mem_cgroup * get_mem_cgroup_from_current (void)h]h)}(h4struct mem_cgroup *get_mem_cgroup_from_current(void)h](j5)}(hj8h]hstruct}(hj޹hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjڹhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڹhhhjhMubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlget_mem_cgroup_from_currentsbc.get_mem_cgroup_from_currentasbuh1hhjڹhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڹhhhjhMubjF )}(hjI h]h*}(hj,hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjڹhhhjhMubh)}(hget_mem_cgroup_from_currenth]j)}(hjh]hget_mem_cgroup_from_current}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjڹhhhjhMubj )}(h(void)h]j )}(hvoidh]j)}(hvoidh]hvoid}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]noemphjjuh1j hjPubah}(h]h ]h"]h$]h&]jjuh1j hjڹhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjֹhhhjhMubah}(h]jѹah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjӹhhubj4)}(hhh]jM)}(h+Obtain a reference on current task's memcg.h]h-Obtain a reference on current task’s memcg.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjӹhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h'**Parameters** ``void`` no argumentsh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]j)}(h``void`` no argumentsh](j)}(h``void``h]jS)}(hjúh]hvoid}(hjźhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h no argumentsh]h no arguments}(hjܺhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chKhjٺubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjغhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&get_mem_cgroup_from_folio (C function)c.get_mem_cgroup_from_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hCstruct mem_cgroup * get_mem_cgroup_from_folio (struct folio *folio)h]h)}(hAstruct mem_cgroup *get_mem_cgroup_from_folio(struct folio *folio)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj*hMubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj>modnameN classnameNjpjs)}jv]jy)}jlget_mem_cgroup_from_foliosbc.get_mem_cgroup_from_folioasbuh1hhjhhhj*hMubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj*hMubjF )}(hjI h]h*}(hjkhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhj*hMubh)}(hget_mem_cgroup_from_folioh]j)}(hjZh]hget_mem_cgroup_from_folio}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj*hMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jXc.get_mem_cgroup_from_folioasbuh1hhjubj)}(h h]h }(hjӻhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj*hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj*hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj*hMhjhhubj4)}(hhh]jM)}(h,Obtain a reference on a given folio's memcg.h]h.Obtain a reference on a given folio’s memcg.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj*hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj0jHj0jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` folio from which memcg should be extracted. **Description** See folio_memcg() for folio->objcg/memcg binding rules.h](jM)}(h**Parameters**h]j)}(hj:h]h Parameters}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj4ubj)}(hhh]j)}(hD``struct folio *folio`` folio from which memcg should be extracted. h](j)}(h``struct folio *folio``h]jS)}(hjYh]hstruct folio *folio}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjWubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjSubj)}(hhh]jM)}(h+folio from which memcg should be extracted.h]h+folio from which memcg should be extracted.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnhMhjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjnhMhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj4ubjM)}(h7See folio_memcg() for folio->objcg/memcg binding rules.h]h7See folio_memcg() for folio->objcg/memcg binding rules.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmem_cgroup_iter (C function)c.mem_cgroup_iterhNtauh1hhjhhhNhNubh)}(hhh](h)}(hstruct mem_cgroup * mem_cgroup_iter (struct mem_cgroup *root, struct mem_cgroup *prev, struct mem_cgroup_reclaim_cookie *reclaim)h]h)}(hstruct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, struct mem_cgroup *prev, struct mem_cgroup_reclaim_cookie *reclaim)h](j5)}(hj8h]hstruct}(hjټhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjռhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjռhhhjhMubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlmem_cgroup_itersbc.mem_cgroup_iterasbuh1hhjռhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjռhhhjhMubjF )}(hjI h]h*}(hj'hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjռhhhjhMubh)}(hmem_cgroup_iterh]j)}(hjh]hmem_cgroup_iter}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjռhhhjhMubj )}(h](struct mem_cgroup *root, struct mem_cgroup *prev, struct mem_cgroup_reclaim_cookie *reclaim)h](j )}(hstruct mem_cgroup *rooth](j5)}(hj8h]hstruct}(hjShhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjOubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjsmodnameN classnameNjpjs)}jv]jc.mem_cgroup_iterasbuh1hhjOubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjOubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjKubj )}(hstruct mem_cgroup *prevh](j5)}(hj8h]hstruct}(hjýhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjнhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj޽ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mem_cgroup_iterasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hprevh]hprev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjKubj )}(h)struct mem_cgroup_reclaim_cookie *reclaimh](j5)}(hj8h]hstruct}(hj3hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj/ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j)}(hmem_cgroup_reclaim_cookieh]hmem_cgroup_reclaim_cookie}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjSmodnameN classnameNjpjs)}jv]jc.mem_cgroup_iterasbuh1hhj/ubj)}(h h]h }(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubjF )}(hjI h]h*}(hj}hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj/ubj)}(hreclaimh]hreclaim}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjKubeh}(h]h ]h"]h$]h&]jjuh1j hjռhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjѼhhhjhMubah}(h]j̼ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjμhhubj4)}(hhh]jM)}(h$iterate over memory cgroup hierarchyh]h$iterate over memory cgroup hierarchy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjμhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj̾jHj̾jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mem_cgroup *root`` hierarchy root ``struct mem_cgroup *prev`` previously returned memcg, NULL on first invocation ``struct mem_cgroup_reclaim_cookie *reclaim`` cookie for shared reclaim walks, NULL for full walks **Description** Returns references to children of the hierarchy below **root**, or **root** itself, or ``NULL`` after a full round-trip. Caller must pass the return value in **prev** on subsequent invocations for reference counting, or use mem_cgroup_iter_break() to cancel a hierarchy walk before the round-trip is complete. Reclaimers can specify a node in **reclaim** to divide up the memcgs in the hierarchy among all concurrent reclaimers operating on the same node.h](jM)}(h**Parameters**h]j)}(hj־h]h Parameters}(hjؾhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԾubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjоubj)}(hhh](j)}(h+``struct mem_cgroup *root`` hierarchy root h](j)}(h``struct mem_cgroup *root``h]jS)}(hjh]hstruct mem_cgroup *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hhierarchy rooth]hhierarchy root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(hP``struct mem_cgroup *prev`` previously returned memcg, NULL on first invocation h](j)}(h``struct mem_cgroup *prev``h]jS)}(hj.h]hstruct mem_cgroup *prev}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj,ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj(ubj)}(hhh]jM)}(h3previously returned memcg, NULL on first invocationh]h3previously returned memcg, NULL on first invocation}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChMhjDubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jhjChMhjubj)}(hc``struct mem_cgroup_reclaim_cookie *reclaim`` cookie for shared reclaim walks, NULL for full walks h](j)}(h-``struct mem_cgroup_reclaim_cookie *reclaim``h]jS)}(hjgh]h)struct mem_cgroup_reclaim_cookie *reclaim}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjeubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjaubj)}(hhh]jM)}(h4cookie for shared reclaim walks, NULL for full walksh]h4cookie for shared reclaim walks, NULL for full walks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|hMhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhj|hMhjubeh}(h]h ]h"]h$]h&]uh1jhjоubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjоubjM)}(hxReturns references to children of the hierarchy below **root**, or **root** itself, or ``NULL`` after a full round-trip.h](h6Returns references to children of the hierarchy below }(hjhhhNhNubj)}(h**root**h]hroot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, or }(hjhhhNhNubj)}(h**root**h]hroot}(hjҿhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh itself, or }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh after a full round-trip.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjоubjM)}(hCaller must pass the return value in **prev** on subsequent invocations for reference counting, or use mem_cgroup_iter_break() to cancel a hierarchy walk before the round-trip is complete.h](h%Caller must pass the return value in }(hjhhhNhNubj)}(h**prev**h]hprev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on subsequent invocations for reference counting, or use mem_cgroup_iter_break() to cancel a hierarchy walk before the round-trip is complete.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjоubjM)}(hReclaimers can specify a node in **reclaim** to divide up the memcgs in the hierarchy among all concurrent reclaimers operating on the same node.h](h!Reclaimers can specify a node in }(hjhhhNhNubj)}(h **reclaim**h]hreclaim}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhe to divide up the memcgs in the hierarchy among all concurrent reclaimers operating on the same node.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjоubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"mem_cgroup_iter_break (C function)c.mem_cgroup_iter_breakhNtauh1hhjhhhNhNubh)}(hhh](h)}(hMvoid mem_cgroup_iter_break (struct mem_cgroup *root, struct mem_cgroup *prev)h]h)}(hLvoid mem_cgroup_iter_break(struct mem_cgroup *root, struct mem_cgroup *prev)h](j)}(hvoidh]hvoid}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMBubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[hhhjmhMBubh)}(hmem_cgroup_iter_breakh]j)}(hmem_cgroup_iter_breakh]hmem_cgroup_iter_break}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj[hhhjmhMBubj )}(h2(struct mem_cgroup *root, struct mem_cgroup *prev)h](j )}(hstruct mem_cgroup *rooth](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_iter_breakasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mem_cgroup *prevh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj.modnameN classnameNjpjs)}jv]jc.mem_cgroup_iter_breakasbuh1hhj ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjXhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hprevh]hprev}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj[hhhjmhMBubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjWhhhjmhMBubah}(h]jRah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjmhMBhjThhubj4)}(hhh]jM)}(h"abort a hierarchy walk prematurelyh]h"abort a hierarchy walk prematurely}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMBhjhhubah}(h]h ]h"]h$]h&]uh1j3hjThhhjmhMBubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mem_cgroup *root`` hierarchy root ``struct mem_cgroup *prev`` last visited hierarchy member as returned by mem_cgroup_iter()h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMFhjubj)}(hhh](j)}(h+``struct mem_cgroup *root`` hierarchy root h](j)}(h``struct mem_cgroup *root``h]jS)}(hjh]hstruct mem_cgroup *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMChjubj)}(hhh]jM)}(hhierarchy rooth]hhierarchy root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubj)}(hZ``struct mem_cgroup *prev`` last visited hierarchy member as returned by mem_cgroup_iter()h](j)}(h``struct mem_cgroup *prev``h]jS)}(hj h]hstruct mem_cgroup *prev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMEhjubj)}(hhh]jM)}(h>last visited hierarchy member as returned by mem_cgroup_iter()h]h>last visited hierarchy member as returned by mem_cgroup_iter()}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMDhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMEhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"mem_cgroup_scan_tasks (C function)c.mem_cgroup_scan_taskshNtauh1hhjhhhNhNubh)}(hhh](h)}(hivoid mem_cgroup_scan_tasks (struct mem_cgroup *memcg, int (*fn)(struct task_struct *, void *), void *arg)h]h)}(hfvoid mem_cgroup_scan_tasks(struct mem_cgroup *memcg, int (*fn)(struct task_struct*, void*), void *arg)h](j)}(hvoidh]hvoid}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMsubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjqhMsubh)}(hmem_cgroup_scan_tasksh]j)}(hmem_cgroup_scan_tasksh]hmem_cgroup_scan_tasks}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj_hhhjqhMsubj )}(hL(struct mem_cgroup *memcg, int (*fn)(struct task_struct*, void*), void *arg)h](j )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_scan_tasksasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmemcgh]hmemcg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h%int (*fn)(struct task_struct*, void*)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hj!h]h(}(hj.hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hjI h]h*}(hj;hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfnh]hfn}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hj!h]h)}(hjVhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hj!h]h(}(hjchhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj5)}(hj8h]hstruct}(hjphhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h task_structh]h task_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mem_cgroup_scan_tasksasbuh1hhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(h,h]h,}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hj!h]h)}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h void *argh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj$hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hargh]harg}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj_hhhjqhMsubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj[hhhjqhMsubah}(h]jVah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjqhMshjXhhubj4)}(hhh]jM)}(h/iterate over tasks of a memory cgroup hierarchyh]h/iterate over tasks of a memory cgroup hierarchy}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMshjXhhubah}(h]h ]h"]h$]h&]uh1j3hjXhhhjqhMsubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjsjHjsjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mem_cgroup *memcg`` hierarchy root ``int (*fn)(struct task_struct *, void *)`` function to call for each task ``void *arg`` argument passed to **fn** **Description** This function iterates over tasks attached to **memcg** or to any of its descendants and calls **fn** for each task. If **fn** returns a non-zero value, the function breaks the iteration loop. Otherwise, it will iterate over all tasks and return 0. This function must not be called for the root memory cgroup.h](jM)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMwhjwubj)}(hhh](j)}(h,``struct mem_cgroup *memcg`` hierarchy root h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hjh]hstruct mem_cgroup *memcg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMthjubj)}(hhh]jM)}(hhierarchy rooth]hhierarchy root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMthjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMthjubj)}(hK``int (*fn)(struct task_struct *, void *)`` function to call for each task h](j)}(h+``int (*fn)(struct task_struct *, void *)``h]jS)}(hjh]h'int (*fn)(struct task_struct *, void *)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMuhjubj)}(hhh]jM)}(hfunction to call for each taskh]hfunction to call for each task}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMuhjubj)}(h(``void *arg`` argument passed to **fn** h](j)}(h ``void *arg``h]jS)}(hjh]h void *arg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMvhjubj)}(hhh]jM)}(hargument passed to **fn**h](hargument passed to }(hj'hhhNhNubj)}(h**fn**h]hfn}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jLhj#hMvhj$ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#hMvhjubeh}(h]h ]h"]h$]h&]uh1jhjwubjM)}(h**Description**h]j)}(hjWh]h Description}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMxhjwubjM)}(hThis function iterates over tasks attached to **memcg** or to any of its descendants and calls **fn** for each task. If **fn** returns a non-zero value, the function breaks the iteration loop. Otherwise, it will iterate over all tasks and return 0.h](h.This function iterates over tasks attached to }(hjmhhhNhNubj)}(h **memcg**h]hmemcg}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh( or to any of its descendants and calls }(hjmhhhNhNubj)}(h**fn**h]hfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh for each task. If }(hjmhhhNhNubj)}(h**fn**h]hfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhz returns a non-zero value, the function breaks the iteration loop. Otherwise, it will iterate over all tasks and return 0.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMwhjwubjM)}(hhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj:ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubh)}(hhh]j)}(hfolioh]hfolio}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj^modnameN classnameNjpjs)}jv]jc.folio_lruvec_lock_irqasbuh1hhj:ubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj:ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hLock the lruvec for a folio.h]hLock the lruvec for a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXI**Parameters** ``struct folio *folio`` Pointer to the folio. **Description** These functions are safe to use under any of the following conditions: - folio locked - folio_test_lru false - folio frozen (refcount of 0) **Return** The lruvec this folio is on with its lock held and interrupts disabled and rcu read lock held.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]j)}(h.``struct folio *folio`` Pointer to the folio. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hPointer to the folio.h]hPointer to the folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj;h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hThese functions are safe to use under any of the following conditions: - folio locked - folio_test_lru false - folio frozen (refcount of 0)h]hThese functions are safe to use under any of the following conditions: - folio locked - folio_test_lru false - folio frozen (refcount of 0)}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h **Return**h]j)}(hjbh]hReturn}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h^The lruvec this folio is on with its lock held and interrupts disabled and rcu read lock held.h]h^The lruvec this folio is on with its lock held and interrupts disabled and rcu read lock held.}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&folio_lruvec_lock_irqsave (C function)c.folio_lruvec_lock_irqsavehNtauh1hhjhhhNhNubh)}(hhh](h)}(hUstruct lruvec * folio_lruvec_lock_irqsave (struct folio *folio, unsigned long *flags)h]h)}(hSstruct lruvec *folio_lruvec_lock_irqsave(struct folio *folio, unsigned long *flags)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(hlruvech]hlruvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlfolio_lruvec_lock_irqsavesbc.folio_lruvec_lock_irqsaveasbuh1hhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMubh)}(hfolio_lruvec_lock_irqsaveh]j)}(hjh]hfolio_lruvec_lock_irqsave}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h+(struct folio *folio, unsigned long *flags)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj!hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjAmodnameN classnameNjpjs)}jv]jc.folio_lruvec_lock_irqsaveasbuh1hhjubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjkhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long *flagsh](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&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hflagsh]hflags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hLock the lruvec for a folio.h]hLock the lruvec for a folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` Pointer to the folio. ``unsigned long *flags`` Pointer to irqsave flags. **Description** These functions are safe to use under any of the following conditions: - folio locked - folio_test_lru false - folio frozen (refcount of 0) **Return** The lruvec this folio is on with its lock held and interrupts disabled and rcu read lock held.h](jM)}(h**Parameters**h]j)}(hj"h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h.``struct folio *folio`` Pointer to the folio. h](j)}(h``struct folio *folio``h]jS)}(hjAh]hstruct folio *folio}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj;ubj)}(hhh]jM)}(hPointer to the folio.h]hPointer to the folio.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVhMhjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhj8ubj)}(h3``unsigned long *flags`` Pointer to irqsave flags. h](j)}(h``unsigned long *flags``h]jS)}(hjzh]hunsigned long *flags}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjtubj)}(hhh]jM)}(hPointer to irqsave flags.h]hPointer to irqsave flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhj8ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hThese functions are safe to use under any of the following conditions: - folio locked - folio_test_lru false - folio frozen (refcount of 0)h]hThese functions are safe to use under any of the following conditions: - folio locked - folio_test_lru false - folio frozen (refcount of 0)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h^The lruvec this folio is on with its lock held and interrupts disabled and rcu read lock held.h]h^The lruvec this folio is on with its lock held and interrupts disabled and rcu read lock held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'mem_cgroup_update_lru_size (C function)c.mem_cgroup_update_lru_sizehNtauh1hhjhhhNhNubh)}(hhh](h)}(hbvoid mem_cgroup_update_lru_size (struct lruvec *lruvec, enum lru_list lru, int zid, long nr_pages)h]h)}(havoid mem_cgroup_update_lru_size(struct lruvec *lruvec, enum lru_list lru, int zid, long nr_pages)h](j)}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj/hMubh)}(hmem_cgroup_update_lru_sizeh]j)}(hmem_cgroup_update_lru_sizeh]hmem_cgroup_update_lru_size}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj/hMubj )}(hB(struct lruvec *lruvec, enum lru_list lru, int zid, long nr_pages)h](j )}(hstruct lruvec *lruvech](j5)}(hj8h]hstruct}(hj^hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjZubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubh)}(hhh]j)}(hlruvech]hlruvec}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj~modnameN classnameNjpjs)}jv]jy)}jljDsbc.mem_cgroup_update_lru_sizeasbuh1hhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjZubj)}(hlruvech]hlruvec}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(henum lru_list lruh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hlru_listh]hlru_list}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mem_cgroup_update_lru_sizeasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlruh]hlru}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(hint zidh](j)}(hinth]hint}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hzidh]hzid}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(h long nr_pagesh](j)}(hlongh]hlong}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj/hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj/hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/hMhjhhubj4)}(hhh]jM)}(h*account for adding or removing an lru pageh]h*account for adding or removing an lru page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj/hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct lruvec *lruvec`` mem_cgroup per zone lru vector ``enum lru_list lru`` index of lru list the page is sitting on ``int zid`` zone id of the accounted pages ``long nr_pages`` positive when adding or negative when removing **Description** This function must be called under lru_lock, just before a page is added to or just after a page is removed from an lru list.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h9``struct lruvec *lruvec`` mem_cgroup per zone lru vector h](j)}(h``struct lruvec *lruvec``h]jS)}(hjh]hstruct lruvec *lruvec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hmem_cgroup per zone lru vectorh]hmem_cgroup per zone lru vector}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h?``enum lru_list lru`` index of lru list the page is sitting on h](j)}(h``enum lru_list lru``h]jS)}(hj(h]henum lru_list lru}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj"ubj)}(hhh]jM)}(h(index of lru list the page is sitting onh]h(index of lru list the page is sitting on}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]uh1jhj=hMhjubj)}(h+``int zid`` zone id of the accounted pages h](j)}(h ``int zid``h]jS)}(hjah]hint zid}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj[ubj)}(hhh]jM)}(hzone id of the accounted pagesh]hzone id of the accounted pages}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvhMhjwubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhjvhMhjubj)}(hA``long nr_pages`` positive when adding or negative when removing h](j)}(h``long nr_pages``h]jS)}(hjh]h long nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h.positive when adding or negative when removingh]h.positive when adding or negative when removing}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h}This function must be called under lru_lock, just before a page is added to or just after a page is removed from an lru list.h]h}This function must be called under lru_lock, just before a page is added to or just after a page is removed from an lru list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmem_cgroup_margin (C function)c.mem_cgroup_marginhNtauh1hhjhhhNhNubh)}(hhh](h)}(h:unsigned long mem_cgroup_margin (struct mem_cgroup *memcg)h]h)}(h9unsigned long mem_cgroup_margin(struct mem_cgroup *memcg)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMubj)}(hlongh]hlong}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj(hMubh)}(hmem_cgroup_marginh]j)}(hmem_cgroup_marginh]hmem_cgroup_margin}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj(hMubj )}(h(struct mem_cgroup *memcg)h]j )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hjshhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjoubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljYsbc.mem_cgroup_marginasbuh1hhjoubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjoubj)}(hmemcgh]hmemcg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjkubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj(hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj(hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj(hMhjhhubj4)}(hhh]jM)}(h-calculate chargeable space of a memory cgrouph]h-calculate chargeable space of a memory cgroup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj(hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mem_cgroup *memcg`` the memory cgroup **Description** Returns the maximum amount of memory **mem** can be charged with, in pages.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]j)}(h/``struct mem_cgroup *memcg`` the memory cgroup h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hj7h]hstruct mem_cgroup *memcg}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj1ubj)}(hhh]jM)}(hthe memory cgrouph]hthe memory cgroup}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhj.ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hKReturns the maximum amount of memory **mem** can be charged with, in pages.h](h%Returns the maximum amount of memory }(hjhhhNhNubj)}(h**mem**h]hmem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh can be charged with, in pages.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)mem_cgroup_print_oom_context (C function)c.mem_cgroup_print_oom_contexthNtauh1hhjhhhNhNubh)}(hhh](h)}(hSvoid mem_cgroup_print_oom_context (struct mem_cgroup *memcg, struct task_struct *p)h]h)}(hRvoid mem_cgroup_print_oom_context(struct mem_cgroup *memcg, struct task_struct *p)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmem_cgroup_print_oom_contexth]j)}(hmem_cgroup_print_oom_contexth]hmem_cgroup_print_oom_context}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h1(struct mem_cgroup *memcg, struct task_struct *p)h](j )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj&modnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_print_oom_contextasbuh1hhjubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjRhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmemcgh]hmemcg}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct task_struct *ph](j5)}(hj8h]hstruct}(hjxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh)}(hhh]j)}(h task_structh]h task_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j@c.mem_cgroup_print_oom_contextasbuh1hhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjtubj)}(hjR h]hp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h4Print OOM information relevant to memory controller.h]h4Print OOM information relevant to memory controller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct mem_cgroup *memcg`` The memory cgroup that went over limit ``struct task_struct *p`` Task that is going to be killed **NOTE** **memcg** and **p**'s mem_cgroup can be different when hierarchy is enabledh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(hD``struct mem_cgroup *memcg`` The memory cgroup that went over limit h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hj9h]hstruct mem_cgroup *memcg}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj7ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj3ubj)}(hhh]jM)}(h&The memory cgroup that went over limith]h&The memory cgroup that went over limit}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjNhMhjOubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhjNhMhj0ubj)}(h:``struct task_struct *p`` Task that is going to be killed h](j)}(h``struct task_struct *p``h]jS)}(hjrh]hstruct task_struct *p}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjpubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjlubj)}(hhh]jM)}(hTask that is going to be killedh]hTask that is going to be killed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jhjhMhj0ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hK**memcg** and **p**'s mem_cgroup can be different when hierarchy is enabledh](j)}(h **memcg**h]hmemcg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**p**h]hp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:’s mem_cgroup can be different when hierarchy is enabled}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)mem_cgroup_print_oom_meminfo (C function)c.mem_cgroup_print_oom_meminfohNtauh1hhjhhhNhNubh)}(hhh](h)}(hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mem_cgroup *oom_domainh](j5)}(hj8h]hstruct}(hjWhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jc.mem_cgroup_get_oom_groupasbuh1hhjSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSubj)}(h oom_domainh]h oom_domain}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjihhhjzhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjehhhjzhMubah}(h]j`ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjzhMhjbhhubj4)}(hhh]jM)}(h)get a memory cgroup to clean up after OOMh]h)get a memory cgroup to clean up after OOM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjbhhhjzhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXz**Parameters** ``struct task_struct *victim`` task to be killed by the OOM killer ``struct mem_cgroup *oom_domain`` memcg in case of memcg OOM, NULL in case of system-wide OOM **Description** Returns a pointer to a memory cgroup, which has to be cleaned up by killing all belonging OOM-killable tasks. Caller has to call mem_cgroup_put() on the returned non-NULL memcg.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(hC``struct task_struct *victim`` task to be killed by the OOM killer h](j)}(h``struct task_struct *victim``h]jS)}(hjh]hstruct task_struct *victim}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h#task to be killed by the OOM killerh]h#task to be killed by the OOM killer}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hMhj/ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj.hMhjubj)}(h^``struct mem_cgroup *oom_domain`` memcg in case of memcg OOM, NULL in case of system-wide OOM h](j)}(h!``struct mem_cgroup *oom_domain``h]jS)}(hjRh]hstruct mem_cgroup *oom_domain}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjPubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjLubj)}(hhh]jM)}(h;memcg in case of memcg OOM, NULL in case of system-wide OOMh]h;memcg in case of memcg OOM, NULL in case of system-wide OOM}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjghMhjhubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjghMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hmReturns a pointer to a memory cgroup, which has to be cleaned up by killing all belonging OOM-killable tasks.h]hmReturns a pointer to a memory cgroup, which has to be cleaned up by killing all belonging OOM-killable tasks.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hCCaller has to call mem_cgroup_put() on the returned non-NULL memcg.h]hCCaller has to call mem_cgroup_put() on the returned non-NULL memcg.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hconsume_stock (C function)c.consume_stockhNtauh1hhjhhhNhNubh)}(hhh](h)}(hDbool consume_stock (struct mem_cgroup *memcg, unsigned int nr_pages)h]h)}(hCbool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMBubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMBubh)}(h consume_stockh]j)}(h consume_stockh]h consume_stock}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMBubj )}(h1(struct mem_cgroup *memcg, unsigned int nr_pages)h](j )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]jy)}jljsbc.consume_stockasbuh1hhjubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjihhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmemcgh]hmemcg}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int nr_pagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMBubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMBubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMBhjhhubj4)}(hhh]jM)}(h*Try to consume stocked charge on this cpu.h]h*Try to consume stocked charge on this cpu.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMBhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMBubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hX|**Parameters** ``struct mem_cgroup *memcg`` memcg to consume from. ``unsigned int nr_pages`` how many pages to charge. **Description** Consume the cached charge if enough nr_pages are present otherwise return failure. Also return failure for charge request larger than MEMCG_CHARGE_BATCH or if the local lock is already taken. returns true if successful, false otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMFhj ubj)}(hhh](j)}(h4``struct mem_cgroup *memcg`` memcg to consume from. h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hj2h]hstruct mem_cgroup *memcg}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMChj,ubj)}(hhh]jM)}(hmemcg to consume from.h]hmemcg to consume from.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjGhMChjHubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhjGhMChj)ubj)}(h4``unsigned int nr_pages`` how many pages to charge. h](j)}(h``unsigned int nr_pages``h]jS)}(hjkh]hunsigned int nr_pages}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjiubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMDhjeubj)}(hhh]jM)}(hhow many pages to charge.h]hhow many pages to charge.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMDhjubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhjhMDhj)ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMFhj ubjM)}(hConsume the cached charge if enough nr_pages are present otherwise return failure. Also return failure for charge request larger than MEMCG_CHARGE_BATCH or if the local lock is already taken.h]hConsume the cached charge if enough nr_pages are present otherwise return failure. Also return failure for charge request larger than MEMCG_CHARGE_BATCH or if the local lock is already taken.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMEhj ubjM)}(h,returns true if successful, false otherwise.h]h,returns true if successful, false otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMIhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%__memcg_kmem_charge_page (C function)c.__memcg_kmem_charge_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(hFint __memcg_kmem_charge_page (struct page *page, gfp_t gfp, int order)h]h)}(hEint __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMw ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMw ubh)}(h__memcg_kmem_charge_pageh]j)}(h__memcg_kmem_charge_pageh]h__memcg_kmem_charge_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMw ubj )}(h)(struct page *page, gfp_t gfp, int order)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj7hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj3ubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubh)}(hhh]j)}(hpageh]hpage}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjWmodnameN classnameNjpjs)}jv]jy)}jljsbc.__memcg_kmem_charge_pageasbuh1hhj3ubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj3ubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jqc.__memcg_kmem_charge_pageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubj )}(h int orderh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(horderh]horder}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj/ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMw ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMw ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMw hjhhubj4)}(hhh]jM)}(h/charge a kmem page to the current memory cgrouph]h/charge a kmem page to the current memory cgroup}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMw hj4hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMw ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjOjHjOjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct page *page`` page to charge ``gfp_t gfp`` reclaim mode ``int order`` allocation order **Description** Returns 0 on success, an error code on failure.h](jM)}(h**Parameters**h]j)}(hjYh]h Parameters}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM{ hjSubj)}(hhh](j)}(h%``struct page *page`` page to charge h](j)}(h``struct page *page``h]jS)}(hjxh]hstruct page *page}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjvubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMx hjrubj)}(hhh]jM)}(hpage to chargeh]hpage to charge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMx hjubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhjhMx hjoubj)}(h``gfp_t gfp`` reclaim mode h](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMy hjubj)}(hhh]jM)}(h reclaim modeh]h reclaim mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMy hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMy hjoubj)}(h``int order`` allocation order h](j)}(h ``int order``h]jS)}(hjh]h int order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMz hjubj)}(hhh]jM)}(hallocation orderh]hallocation order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMz hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMz hjoubeh}(h]h ]h"]h$]h&]uh1jhjSubjM)}(h**Description**h]j)}(hj%h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM| hjSubjM)}(h/Returns 0 on success, an error code on failure.h]h/Returns 0 on success, an error code on failure.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM{ hjSubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'__memcg_kmem_uncharge_page (C function)c.__memcg_kmem_uncharge_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(h>void __memcg_kmem_uncharge_page (struct page *page, int order)h]h)}(h=void __memcg_kmem_uncharge_page(struct page *page, int order)h](j)}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM ubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfhhhjxhM ubh)}(h__memcg_kmem_uncharge_pageh]j)}(h__memcg_kmem_uncharge_pageh]h__memcg_kmem_uncharge_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjfhhhjxhM ubj )}(h(struct page *page, int order)h](j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.__memcg_kmem_uncharge_pageasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h int orderh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(horderh]horder}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjfhhhjxhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjbhhhjxhM ubah}(h]j]ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjxhM hj_hhubj4)}(hhh]jM)}(huncharge a kmem pageh]huncharge a kmem page}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hj\hhubah}(h]h ]h"]h$]h&]uh1j3hj_hhhjxhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjwjHjwjIjJjKuh1hhhhjhNhNubj)}(hZ**Parameters** ``struct page *page`` page to uncharge ``int order`` allocation orderh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hj{ubj)}(hhh](j)}(h'``struct page *page`` page to uncharge h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hjubj)}(hhh]jM)}(hpage to unchargeh]hpage to uncharge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h``int order`` allocation orderh](j)}(h ``int order``h]jS)}(hjh]h int order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hjubj)}(hhh]jM)}(hallocation orderh]hallocation order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h mem_cgroup_wb_stats (C function)c.mem_cgroup_wb_statshNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid mem_cgroup_wb_stats (struct bdi_writeback *wb, unsigned long *pfilepages, unsigned long *pheadroom, unsigned long *pdirty, unsigned long *pwriteback)h]h)}(hvoid mem_cgroup_wb_stats(struct bdi_writeback *wb, unsigned long *pfilepages, unsigned long *pheadroom, unsigned long *pdirty, unsigned long *pwriteback)h](j)}(hvoidh]hvoid}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/hhhjAhMubh)}(hmem_cgroup_wb_statsh]j)}(hmem_cgroup_wb_statsh]hmem_cgroup_wb_stats}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ](jjeh"]h$]h&]jjuh1hhj/hhhjAhMubj )}(h(struct bdi_writeback *wb, unsigned long *pfilepages, unsigned long *pheadroom, unsigned long *pdirty, unsigned long *pwriteback)h](j )}(hstruct bdi_writeback *wbh](j5)}(hj8h]hstruct}(hjphhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjlubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubh)}(hhh]j)}(h bdi_writebackh]h bdi_writeback}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljVsbc.mem_cgroup_wb_statsasbuh1hhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjlubj)}(hwbh]hwb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hunsigned long *pfilepagesh](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&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h pfilepagesh]h pfilepages}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hunsigned long *pheadroomh](j)}(hunsignedh]hunsigned}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hlongh]hlong}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubjF )}(hjI h]h*}(hjxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj<ubj)}(h pheadroomh]h pheadroom}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hunsigned long *pdirtyh](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&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpdirtyh]hpdirty}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hunsigned long *pwritebackh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(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&]uh1jhjubjF )}(hjI h]h*}(hj4hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h pwritebackh]h pwriteback}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubeh}(h]h ]h"]h$]h&]jjuh1j hj/hhhjAhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj+hhhjAhMubah}(h]j&ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjAhMhj(hhubj4)}(hhh]jM)}(h/retrieve writeback related stats from its memcgh]h/retrieve writeback related stats from its memcg}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhhubah}(h]h ]h"]h$]h&]uh1j3hj(hhhjAhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXh**Parameters** ``struct bdi_writeback *wb`` bdi_writeback in question ``unsigned long *pfilepages`` out parameter for number of file pages ``unsigned long *pheadroom`` out parameter for number of allocatable pages according to memcg ``unsigned long *pdirty`` out parameter for number of dirty pages ``unsigned long *pwriteback`` out parameter for number of pages under writeback **Description** Determine the numbers of file, headroom, dirty, and writeback pages in **wb**'s memcg. File, dirty and writeback are self-explanatory. Headroom is a bit more involved. A memcg's headroom is "min(max, high) - used". In the hierarchy, the headroom is calculated as the lowest headroom of itself and the ancestors. Note that this doesn't consider the actual amount of available memory in the system. The caller should further cap ***pheadroom** accordingly.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h7``struct bdi_writeback *wb`` bdi_writeback in question h](j)}(h``struct bdi_writeback *wb``h]jS)}(hjh]hstruct bdi_writeback *wb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hbdi_writeback in questionh]hbdi_writeback in question}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hE``unsigned long *pfilepages`` out parameter for number of file pages h](j)}(h``unsigned long *pfilepages``h]jS)}(hjh]hunsigned long *pfilepages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h&out parameter for number of file pagesh]h&out parameter for number of file pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h^``unsigned long *pheadroom`` out parameter for number of allocatable pages according to memcg h](j)}(h``unsigned long *pheadroom``h]jS)}(hjh]hunsigned long *pheadroom}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h@out parameter for number of allocatable pages according to memcgh]h@out parameter for number of allocatable pages according to memcg}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjubj)}(hB``unsigned long *pdirty`` out parameter for number of dirty pages h](j)}(h``unsigned long *pdirty``h]jS)}(hjWh]hunsigned long *pdirty}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjQubj)}(hhh]jM)}(h'out parameter for number of dirty pagesh]h'out parameter for number of dirty pages}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhMhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjubj)}(hP``unsigned long *pwriteback`` out parameter for number of pages under writeback h](j)}(h``unsigned long *pwriteback``h]jS)}(hjh]hunsigned long *pwriteback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h1out parameter for number of pages under writebackh]h1out parameter for number of pages under writeback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hDetermine the numbers of file, headroom, dirty, and writeback pages in **wb**'s memcg. File, dirty and writeback are self-explanatory. Headroom is a bit more involved.h](hGDetermine the numbers of file, headroom, dirty, and writeback pages in }(hjhhhNhNubj)}(h**wb**h]hwb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh^’s memcg. File, dirty and writeback are self-explanatory. Headroom is a bit more involved.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hX!A memcg's headroom is "min(max, high) - used". In the hierarchy, the headroom is calculated as the lowest headroom of itself and the ancestors. Note that this doesn't consider the actual amount of available memory in the system. The caller should further cap ***pheadroom** accordingly.h](hXA memcg’s headroom is “min(max, high) - used”. In the hierarchy, the headroom is calculated as the lowest headroom of itself and the ancestors. Note that this doesn’t consider the actual amount of available memory in the system. The caller should further cap }(hjhhhNhNubj)}(h***pheadroom**h]h *pheadroom}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh accordingly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'mem_cgroup_from_private_id (C function)c.mem_cgroup_from_private_idhNtauh1hhjhhhNhNubh)}(hhh](h)}(hBstruct mem_cgroup * mem_cgroup_from_private_id (unsigned short id)h]h)}(h@struct mem_cgroup *mem_cgroup_from_private_id(unsigned short id)h](j5)}(hj8h]hstruct}(hjChhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj?hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhjPhMubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjdmodnameN classnameNjpjs)}jv]jy)}jlmem_cgroup_from_private_idsbc.mem_cgroup_from_private_idasbuh1hhj?hhhjPhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhjPhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj?hhhjPhMubh)}(hmem_cgroup_from_private_idh]j)}(hjh]hmem_cgroup_from_private_id}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj?hhhjPhMubj )}(h(unsigned short id)h]j )}(hunsigned short idh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hshorth]hshort}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hj?hhhjPhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj;hhhjPhMubah}(h]j6ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjPhMhj8hhubj4)}(hhh]jM)}(hlook up a memcg from a memcg idh]hlook up a memcg from a memcg id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj8hhhjPhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj7jHj7jIjJjKuh1hhhhjhNhNubj)}(hs**Parameters** ``unsigned short id`` the memcg id to look up **Description** Caller must hold rcu_read_lock().h](jM)}(h**Parameters**h]j)}(hjAh]h Parameters}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj;ubj)}(hhh]j)}(h.``unsigned short id`` the memcg id to look up h](j)}(h``unsigned short id``h]jS)}(hj`h]hunsigned short id}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjZubj)}(hhh]jM)}(hthe memcg id to look uph]hthe memcg id to look up}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjuhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhjWubah}(h]h ]h"]h$]h&]uh1jhj;ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj;ubjM)}(h!Caller must hold rcu_read_lock().h]h!Caller must hold rcu_read_lock().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!mem_cgroup_css_reset (C function)c.mem_cgroup_css_resethNtauh1hhjhhhNhNubh)}(hhh](h)}(h;void mem_cgroup_css_reset (struct cgroup_subsys_state *css)h]h)}(h:void mem_cgroup_css_reset(struct cgroup_subsys_state *css)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM9ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM9ubh)}(hmem_cgroup_css_reseth]j)}(hmem_cgroup_css_reseth]hmem_cgroup_css_reset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM9ubj )}(h!(struct cgroup_subsys_state *css)h]j )}(hstruct cgroup_subsys_state *cssh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcgroup_subsys_stateh]hcgroup_subsys_state}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_css_resetasbuh1hhjubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjihhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hcssh]hcss}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM9ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM9ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM9hjhhubj4)}(hhh]jM)}(h reset the states of a mem_cgrouph]h reset the states of a mem_cgroup}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM9hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM9ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct cgroup_subsys_state *css`` the target css **Description** Reset the states of the mem_cgroup associated with **css**. This is invoked when the userland requests disabling on the default hierarchy but the memcg is pinned through dependency. The memcg should stop applying policies and should revert to the vanilla state as it may be made visible again. The current implementation only resets the essential configurations. This needs to be expanded to cover all the visible parts.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM=hjubj)}(hhh]j)}(h3``struct cgroup_subsys_state *css`` the target css h](j)}(h#``struct cgroup_subsys_state *css``h]jS)}(hjh]hstruct cgroup_subsys_state *css}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM:hjubj)}(hhh]jM)}(hthe target cssh]hthe target css}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM:hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM:hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM<hjubjM)}(hX'Reset the states of the mem_cgroup associated with **css**. This is invoked when the userland requests disabling on the default hierarchy but the memcg is pinned through dependency. The memcg should stop applying policies and should revert to the vanilla state as it may be made visible again.h](h3Reset the states of the mem_cgroup associated with }(hj2hhhNhNubj)}(h**css**h]hcss}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh. This is invoked when the userland requests disabling on the default hierarchy but the memcg is pinned through dependency. The memcg should stop applying policies and should revert to the vanilla state as it may be made visible again.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM;hjubjM)}(h~The current implementation only resets the essential configurations. This needs to be expanded to cover all the visible parts.h]h~The current implementation only resets the essential configurations. This needs to be expanded to cover all the visible parts.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMAhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h,mem_cgroup_calculate_protection (C function)!c.mem_cgroup_calculate_protectionhNtauh1hhjhhhNhNubh)}(hhh](h)}(hXvoid mem_cgroup_calculate_protection (struct mem_cgroup *root, struct mem_cgroup *memcg)h]h)}(hWvoid mem_cgroup_calculate_protection(struct mem_cgroup *root, struct mem_cgroup *memcg)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM;ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhjhM;ubh)}(hmem_cgroup_calculate_protectionh]j)}(hmem_cgroup_calculate_protectionh]hmem_cgroup_calculate_protection}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj~hhhjhM;ubj )}(h3(struct mem_cgroup *root, struct mem_cgroup *memcg)h](j )}(hstruct mem_cgroup *rooth](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsb!c.mem_cgroup_calculate_protectionasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hrooth]hroot}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mem_cgroup *memcgh](j5)}(hj8h]hstruct}(hj1hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj-ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(h mem_cgrouph]h mem_cgroup}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjQmodnameN classnameNjpjs)}jv]j!c.mem_cgroup_calculate_protectionasbuh1hhj-ubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubjF )}(hjI h]h*}(hj{hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj-ubj)}(hmemcgh]hmemcg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj~hhhjhM;ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjzhhhjhM;ubah}(h]juah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM;hjwhhubj4)}(hhh]jM)}(h2check if memory consumption is in the normal rangeh]h2check if memory consumption is in the normal range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM;hjhhubah}(h]h ]h"]h$]h&]uh1j3hjwhhhjhM;ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX/**Parameters** ``struct mem_cgroup *root`` the top ancestor of the sub-tree being checked ``struct mem_cgroup *memcg`` the memory cgroup to check **Description** WARNING: This function is not stateless! It can only be used as part of a top-down tree iteration, not for isolated queries.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM?hjubj)}(hhh](j)}(hK``struct mem_cgroup *root`` the top ancestor of the sub-tree being checked h](j)}(h``struct mem_cgroup *root``h]jS)}(hjh]hstruct mem_cgroup *root}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM<hjubj)}(hhh]jM)}(h.the top ancestor of the sub-tree being checkedh]h.the top ancestor of the sub-tree being checked}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM<hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM<hjubj)}(h8``struct mem_cgroup *memcg`` the memory cgroup to check h](j)}(h``struct mem_cgroup *memcg``h]jS)}(hj,h]hstruct mem_cgroup *memcg}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj*ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM=hj&ubj)}(hhh]jM)}(hthe memory cgroup to checkh]hthe memory cgroup to check}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjAhM=hjBubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhM=hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjgh]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM?hjubj)}(hhh]j)}(h|WARNING: This function is not stateless! It can only be used as part of a top-down tree iteration, not for isolated queries.h](j)}(hDWARNING: This function is not stateless! It can only be used as parth]hDWARNING: This function is not stateless! It can only be used as part}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM>hjubj)}(hhh]jM)}(h7of a top-down tree iteration, not for isolated queries.h]h7of a top-down tree iteration, not for isolated queries.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM?hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM>hj}ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&mem_cgroup_charge_hugetlb (C function)c.mem_cgroup_charge_hugetlbhNtauh1hhjhhhNhNubh)}(hhh](h)}(h>int mem_cgroup_charge_hugetlb (struct folio *folio, gfp_t gfp)h]h)}(h=int mem_cgroup_charge_hugetlb(struct folio *folio, gfp_t gfp)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMrubh)}(hmem_cgroup_charge_hugetlbh]j)}(hmem_cgroup_charge_hugetlbh]hmem_cgroup_charge_hugetlb}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMrubj )}(h (struct folio *folio, gfp_t gfp)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj4modnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_charge_hugetlbasbuh1hhjubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj`hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jNc.mem_cgroup_charge_hugetlbasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMrubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMrubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMrhjhhubj4)}(hhh]jM)}(h$charge the memcg for a hugetlb folioh]h$charge the memcg for a hugetlb folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMrhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMrubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` folio being charged ``gfp_t gfp`` reclaim mode **Description** This function is called when allocating a huge page folio, after the page has already been obtained and charged to the appropriate hugetlb cgroup controller (if it is enabled). Returns ENOMEM if the memcg is already full. Returns 0 if either the charge was successful, or if we skip the charging.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMvhjubj)}(hhh](j)}(h,``struct folio *folio`` folio being charged h](j)}(h``struct folio *folio``h]jS)}(hj h]hstruct folio *folio}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMshjubj)}(hhh]jM)}(hfolio being chargedh]hfolio being charged}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5hMshj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj5hMshjubj)}(h``gfp_t gfp`` reclaim mode h](j)}(h ``gfp_t gfp``h]jS)}(hjYh]h gfp_t gfp}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjWubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMthjSubj)}(hhh]jM)}(h reclaim modeh]h reclaim mode}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnhMthjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjnhMthjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMvhjubjM)}(hThis function is called when allocating a huge page folio, after the page has already been obtained and charged to the appropriate hugetlb cgroup controller (if it is enabled).h]hThis function is called when allocating a huge page folio, after the page has already been obtained and charged to the appropriate hugetlb cgroup controller (if it is enabled).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMuhjubjM)}(hwReturns ENOMEM if the memcg is already full. Returns 0 if either the charge was successful, or if we skip the charging.h]hwReturns ENOMEM if the memcg is already full. Returns 0 if either the charge was successful, or if we skip the charging.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMyhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h+mem_cgroup_swapin_charge_folio (C function) c.mem_cgroup_swapin_charge_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hlint mem_cgroup_swapin_charge_folio (struct folio *folio, unsigned short id, struct mm_struct *mm, gfp_t gfp)h]h)}(hkint mem_cgroup_swapin_charge_folio(struct folio *folio, unsigned short id, struct mm_struct *mm, gfp_t gfp)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmem_cgroup_swapin_charge_folioh]j)}(hmem_cgroup_swapin_charge_folioh]hmem_cgroup_swapin_charge_folio}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hI(struct folio *folio, unsigned short id, struct mm_struct *mm, gfp_t gfp)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj%hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj!ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubh)}(hhh]j)}(hfolioh]hfolio}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jy)}jlj sb c.mem_cgroup_swapin_charge_folioasbuh1hhj!ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj!ubj)}(hfolioh]hfolio}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned short idh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hshorth]hshort}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j_ c.mem_cgroup_swapin_charge_folioasbuh1hhjubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj2hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmmh]hmm}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj]modnameN classnameNjpjs)}jv]j_ c.mem_cgroup_swapin_charge_folioasbuh1hhjTubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hgfph]hgfp}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h*Charge a newly allocated folio for swapin.h]h*Charge a newly allocated folio for swapin.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXx**Parameters** ``struct folio *folio`` the folio to charge ``unsigned short id`` memory cgroup id ``struct mm_struct *mm`` mm context of the victim ``gfp_t gfp`` reclaim mode **Description** This function charges a folio allocated for swapin. Please call this before adding the folio to the swapcache. Returns 0 on success. Otherwise, an error code is returned.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h,``struct folio *folio`` the folio to charge h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hthe folio to chargeh]hthe folio to charge}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h'``unsigned short id`` memory cgroup id h](j)}(h``unsigned short id``h]jS)}(hj+h]hunsigned short id}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj%ubj)}(hhh]jM)}(hmemory cgroup idh]hmemory cgroup id}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hMhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubj)}(h2``struct mm_struct *mm`` mm context of the victim h](j)}(h``struct mm_struct *mm``h]jS)}(hjdh]hstruct mm_struct *mm}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj^ubj)}(hhh]jM)}(hmm context of the victimh]hmm context of the victim}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjyhMhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhMhjubj)}(h``gfp_t gfp`` reclaim mode h](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h reclaim modeh]h reclaim mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hnThis function charges a folio allocated for swapin. Please call this before adding the folio to the swapcache.h]hnThis function charges a folio allocated for swapin. Please call this before adding the folio to the swapcache.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h;Returns 0 on success. Otherwise, an error code is returned.h]h;Returns 0 on success. Otherwise, an error code is returned.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%mem_cgroup_replace_folio (C function)c.mem_cgroup_replace_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hDvoid mem_cgroup_replace_folio (struct folio *old, struct folio *new)h]h)}(hCvoid mem_cgroup_replace_folio(struct folio *old, struct folio *new)h](j)}(hvoidh]hvoid}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(hhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMGubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(hhhj:hMGubh)}(hmem_cgroup_replace_folioh]j)}(hmem_cgroup_replace_folioh]hmem_cgroup_replace_folio}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](jjeh"]h$]h&]jjuh1hhj(hhhj:hMGubj )}(h&(struct folio *old, struct folio *new)h](j )}(hstruct folio *oldh](j5)}(hj8h]hstruct}(hjihhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjeubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljOsbc.mem_cgroup_replace_folioasbuh1hhjeubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjeubj)}(holdh]hold}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubj )}(hstruct folio *newh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mem_cgroup_replace_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj%hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hnewh]hnew}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubeh}(h]h ]h"]h$]h&]jjuh1j hj(hhhj:hMGubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj$hhhj:hMGubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj:hMGhj!hhubj4)}(hhh]jM)}(hCharge a folio's replacement.h]hCharge a folio’s replacement.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMGhjYhhubah}(h]h ]h"]h$]h&]uh1j3hj!hhhj:hMGubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjtjHjtjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *old`` Currently circulating folio. ``struct folio *new`` Replacement folio. **Description** Charge **new** as a replacement folio for **old**. **old** will be uncharged upon free. Both folios must be locked, **new->mapping** must be set up.h](jM)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMKhjxubj)}(hhh](j)}(h3``struct folio *old`` Currently circulating folio. h](j)}(h``struct folio *old``h]jS)}(hjh]hstruct folio *old}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMHhjubj)}(hhh]jM)}(hCurrently circulating folio.h]hCurrently circulating folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMHhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMHhjubj)}(h)``struct folio *new`` Replacement folio. h](j)}(h``struct folio *new``h]jS)}(hjh]hstruct folio *new}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMIhjubj)}(hhh]jM)}(hReplacement folio.h]hReplacement folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMIhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMIhjubeh}(h]h ]h"]h$]h&]uh1jhjxubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMKhjxubjM)}(hWCharge **new** as a replacement folio for **old**. **old** will be uncharged upon free.h](hCharge }(hj'hhhNhNubj)}(h**new**h]hnew}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh as a replacement folio for }(hj'hhhNhNubj)}(h**old**h]hold}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh. }(hj'hhhNhNubj)}(h**old**h]hold}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubh will be uncharged upon free.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMJhjxubjM)}(hmapping** must be set up.h](hBoth folios must be locked, }(hjlhhhNhNubj)}(h**new->mapping**h]h new->mapping}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubh must be set up.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMMhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmem_cgroup_migrate (C function)c.mem_cgroup_migratehNtauh1hhjhhhNhNubh)}(hhh](h)}(h>void mem_cgroup_migrate (struct folio *old, struct folio *new)h]h)}(h=void mem_cgroup_migrate(struct folio *old, struct folio *new)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM~ubh)}(hmem_cgroup_migrateh]j)}(hmem_cgroup_migrateh]hmem_cgroup_migrate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM~ubj )}(h&(struct folio *old, struct folio *new)h](j )}(hstruct folio *oldh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_migrateasbuh1hhjubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj6hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(holdh]hold}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio *newh](j5)}(hj8h]hstruct}(hj\hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(hfolioh]hfolio}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj|modnameN classnameNjpjs)}jv]j$c.mem_cgroup_migrateasbuh1hhjXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjXubj)}(hnewh]hnew}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM~ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM~ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM~hjhhubj4)}(hhh]jM)}(h6Transfer the memcg data from the old to the new folio.h]h6Transfer the memcg data from the old to the new folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM~hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM~ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *old`` Currently circulating folio. ``struct folio *new`` Replacement folio. **Description** Transfer the memcg data from the old folio to the new folio for migration. The old folio's data info will be cleared. The memory counters remain unchanged, unless the charge moves out of a fully reparented ancestry and has to be settled (see below). Both folios must be locked, **new->mapping** must be set up.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h3``struct folio *old`` Currently circulating folio. h](j)}(h``struct folio *old``h]jS)}(hjh]hstruct folio *old}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hCurrently circulating folio.h]hCurrently circulating folio.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjubj)}(h)``struct folio *new`` Replacement folio. h](j)}(h``struct folio *new``h]jS)}(hjWh]hstruct folio *new}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjQubj)}(hhh]jM)}(hReplacement folio.h]hReplacement folio.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhMhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hTransfer the memcg data from the old folio to the new folio for migration. The old folio's data info will be cleared. The memory counters remain unchanged, unless the charge moves out of a fully reparented ancestry and has to be settled (see below).h]hTransfer the memcg data from the old folio to the new folio for migration. The old folio’s data info will be cleared. The memory counters remain unchanged, unless the charge moves out of a fully reparented ancestry and has to be settled (see below).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hmapping** must be set up.h](hBoth folios must be locked, }(hjhhhNhNubj)}(h**new->mapping**h]h new->mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh must be set up.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!mem_cgroup_sk_charge (C function)c.mem_cgroup_sk_chargehNtauh1hhjhhhNhNubh)}(hhh](h)}(hXbool mem_cgroup_sk_charge (const struct sock *sk, unsigned int nr_pages, gfp_t gfp_mask)h]h)}(hWbool mem_cgroup_sk_charge(const struct sock *sk, unsigned int nr_pages, gfp_t gfp_mask)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmem_cgroup_sk_chargeh]j)}(hmem_cgroup_sk_chargeh]hmem_cgroup_sk_charge}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h>(const struct sock *sk, unsigned int nr_pages, gfp_t gfp_mask)h](j )}(hconst struct sock *skh](j5)}(hjh]hconst}(hj4hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj0ubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj5)}(hj8h]hstruct}(hjOhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj0ubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubh)}(hhh]j)}(hsockh]hsock}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjomodnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_sk_chargeasbuh1hhj0ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj0ubj)}(hskh]hsk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,ubj )}(hunsigned int nr_pagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,ubj )}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mem_cgroup_sk_chargeasbuh1hhjubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hgfp_maskh]hgfp_mask}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hcharge socket memoryh]hcharge socket memory}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX5**Parameters** ``const struct sock *sk`` socket in memcg to charge ``unsigned int nr_pages`` number of pages to charge ``gfp_t gfp_mask`` reclaim mode **Description** Charges **nr_pages** to **memcg**. Returns ``true`` if the charge fit within **memcg**'s configured limit, ``false`` if it doesn't.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h4``const struct sock *sk`` socket in memcg to charge h](j)}(h``const struct sock *sk``h]jS)}(hjh]hconst struct sock *sk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hsocket in memcg to chargeh]hsocket in memcg to charge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h4``unsigned int nr_pages`` number of pages to charge h](j)}(h``unsigned int nr_pages``h]jS)}(hjh]hunsigned int nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hnumber of pages to chargeh]hnumber of pages to charge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h ``gfp_t gfp_mask`` reclaim mode h](j)}(h``gfp_t gfp_mask``h]jS)}(hjh]hgfp_t gfp_mask}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h reclaim modeh]h reclaim mode}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hMhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjYh]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hCharges **nr_pages** to **memcg**. Returns ``true`` if the charge fit within **memcg**'s configured limit, ``false`` if it doesn't.h](hCharges }(hjohhhNhNubj)}(h **nr_pages**h]hnr_pages}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh to }(hjohhhNhNubj)}(h **memcg**h]hmemcg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh . Returns }(hjohhhNhNubjS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubh if the charge fit within }(hjohhhNhNubj)}(h **memcg**h]hmemcg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh’s configured limit, }(hjohhhNhNubjS)}(h ``false``h]hfalse}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubh if it doesn’t.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#mem_cgroup_sk_uncharge (C function)c.mem_cgroup_sk_unchargehNtauh1hhjhhhNhNubh)}(hhh](h)}(hJvoid mem_cgroup_sk_uncharge (const struct sock *sk, unsigned int nr_pages)h]h)}(hIvoid mem_cgroup_sk_uncharge(const struct sock *sk, unsigned int nr_pages)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmem_cgroup_sk_unchargeh]j)}(hmem_cgroup_sk_unchargeh]hmem_cgroup_sk_uncharge}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h.(const struct sock *sk, unsigned int nr_pages)h](j )}(hconst struct sock *skh](j5)}(hjh]hconst}(hj5hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj1ubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj5)}(hj8h]hstruct}(hjPhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj1ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubh)}(hhh]j)}(hsockh]hsock}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjpmodnameN classnameNjpjs)}jv]jy)}jljsbc.mem_cgroup_sk_unchargeasbuh1hhj1ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj1ubj)}(hskh]hsk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj-ubj )}(hunsigned int nr_pagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj-ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(huncharge socket memoryh]huncharge socket memory}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj!hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj<jHj<jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const struct sock *sk`` socket in memcg to uncharge ``unsigned int nr_pages`` number of pages to unchargeh](jM)}(h**Parameters**h]j)}(hjFh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hj@ubj)}(hhh](j)}(h6``const struct sock *sk`` socket in memcg to uncharge h](j)}(h``const struct sock *sk``h]jS)}(hjeh]hconst struct sock *sk}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj_ubj)}(hhh]jM)}(hsocket in memcg to unchargeh]hsocket in memcg to uncharge}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMhj\ubj)}(h5``unsigned int nr_pages`` number of pages to unchargeh](j)}(h``unsigned int nr_pages``h]jS)}(hjh]hunsigned int nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM hjubj)}(hhh]jM)}(hnumber of pages to unchargeh]hnumber of pages to uncharge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj\ubeh}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)__mem_cgroup_try_charge_swap (C function)c.__mem_cgroup_try_charge_swaphNtauh1hhjhhhNhNubh)}(hhh](h)}(h6int __mem_cgroup_try_charge_swap (struct folio *folio)h]h)}(h5int __mem_cgroup_try_charge_swap(struct folio *folio)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM]ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM]ubh)}(h__mem_cgroup_try_charge_swaph]j)}(h__mem_cgroup_try_charge_swaph]h__mem_cgroup_try_charge_swap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM]ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj5hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj1ubj)}(h h]h }(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubh)}(hhh]j)}(hfolioh]hfolio}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjUmodnameN classnameNjpjs)}jv]jy)}jljsbc.__mem_cgroup_try_charge_swapasbuh1hhj1ubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj1ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj-ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM]ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM]ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM]hjhhubj4)}(hhh]jM)}(h#try charging swap space for a folioh]h#try charging swap space for a folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM]hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM]ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct folio *folio`` folio being added to swap **Description** Try to charge **folio**'s memcg for the swap space at folio->swap. Returns 0 on success, -ENOMEM on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMahjubj)}(hhh]j)}(h2``struct folio *folio`` folio being added to swap h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM^hjubj)}(hhh]jM)}(hfolio being added to swaph]hfolio being added to swap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM^hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM^hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj4h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM`hjubjM)}(hBTry to charge **folio**'s memcg for the swap space at folio->swap.h](hTry to charge }(hjJhhhNhNubj)}(h **folio**h]hfolio}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh-’s memcg for the swap space at folio->swap.}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM_hjubjM)}(h)Returns 0 on success, -ENOMEM on failure.h]h)Returns 0 on success, -ENOMEM on failure.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMahjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'__mem_cgroup_uncharge_swap (C function)c.__mem_cgroup_uncharge_swaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hJvoid __mem_cgroup_uncharge_swap (unsigned short id, unsigned int nr_pages)h]h)}(hIvoid __mem_cgroup_uncharge_swap(unsigned short id, unsigned int nr_pages)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(h__mem_cgroup_uncharge_swaph]j)}(h__mem_cgroup_uncharge_swaph]h__mem_cgroup_uncharge_swap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h*(unsigned short id, unsigned int nr_pages)h](j )}(hunsigned short idh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hshorth]hshort}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hidh]hid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int nr_pagesh](j)}(hunsignedh]hunsigned}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hinth]hint}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hnr_pagesh]hnr_pages}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(huncharge swap spaceh]huncharge swap space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``unsigned short id`` cgroup id to uncharge ``unsigned int nr_pages`` the amount of swap space to unchargeh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h,``unsigned short id`` cgroup id to uncharge h](j)}(h``unsigned short id``h]jS)}(hjh]hunsigned short id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(hcgroup id to unchargeh]hcgroup id to uncharge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h>``unsigned int nr_pages`` the amount of swap space to unchargeh](j)}(h``unsigned int nr_pages``h]jS)}(hjh]hunsigned int nr_pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh]jM)}(h$the amount of swap space to unchargeh]h$the amount of swap space to uncharge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!obj_cgroup_may_zswap (C function)c.obj_cgroup_may_zswaphNtauh1hhjhhhNhNubh)}(hhh](h)}(h4bool obj_cgroup_may_zswap (struct obj_cgroup *objcg)h]h)}(h3bool obj_cgroup_may_zswap(struct obj_cgroup *objcg)h](j)}(hj-h]hbool}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMXubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjkhMXubh)}(hobj_cgroup_may_zswaph]j)}(hobj_cgroup_may_zswaph]hobj_cgroup_may_zswap}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ](jjeh"]h$]h&]jjuh1hhjZhhhjkhMXubj )}(h(struct obj_cgroup *objcg)h]j )}(hstruct obj_cgroup *objcgh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h obj_cgrouph]h obj_cgroup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.obj_cgroup_may_zswapasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hobjcgh]hobjcg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjZhhhjkhMXubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjVhhhjkhMXubah}(h]jQah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjkhMXhjShhubj4)}(hhh]jM)}(hcheck if this cgroup can zswaph]hcheck if this cgroup can zswap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMXhjhhubah}(h]h ]h"]h$]h&]uh1j3hjShhhjkhMXubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj5jHj5jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct obj_cgroup *objcg`` the object cgroup **Description** Check if the hierarchical zswap limit has been reached. This doesn't check for specific headroom, and it is not atomic either. But with zswap, the size of the allocation is only known once compression has occurred, and this optimistic pre-check avoids spending cycles on compression when there is already no room left or zswap is disabled altogether somewhere in the hierarchy.h](jM)}(h**Parameters**h]j)}(hj?h]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM\hj9ubj)}(hhh]j)}(h/``struct obj_cgroup *objcg`` the object cgroup h](j)}(h``struct obj_cgroup *objcg``h]jS)}(hj^h]hstruct obj_cgroup *objcg}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj\ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMYhjXubj)}(hhh]jM)}(hthe object cgrouph]hthe object cgroup}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjshMYhjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jhjshMYhjUubah}(h]h ]h"]h$]h&]uh1jhj9ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM[hj9ubjM)}(h7Check if the hierarchical zswap limit has been reached.h]h7Check if the hierarchical zswap limit has been reached.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMZhj9ubjM)}(hXAThis doesn't check for specific headroom, and it is not atomic either. But with zswap, the size of the allocation is only known once compression has occurred, and this optimistic pre-check avoids spending cycles on compression when there is already no room left or zswap is disabled altogether somewhere in the hierarchy.h]hXCThis doesn’t check for specific headroom, and it is not atomic either. But with zswap, the size of the allocation is only known once compression has occurred, and this optimistic pre-check avoids spending cycles on compression when there is already no room left or zswap is disabled altogether somewhere in the hierarchy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chM\hj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$obj_cgroup_charge_zswap (C function)c.obj_cgroup_charge_zswaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hDvoid obj_cgroup_charge_zswap (struct obj_cgroup *objcg, size_t size)h]h)}(hCvoid obj_cgroup_charge_zswap(struct obj_cgroup *objcg, size_t size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hobj_cgroup_charge_zswaph]j)}(hobj_cgroup_charge_zswaph]hobj_cgroup_charge_zswap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h'(struct obj_cgroup *objcg, size_t size)h](j )}(hstruct obj_cgroup *objcgh](j5)}(hj8h]hstruct}(hj*hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj&ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j)}(h obj_cgrouph]h obj_cgroup}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjJmodnameN classnameNjpjs)}jv]jy)}jljsbc.obj_cgroup_charge_zswapasbuh1hhj&ubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjF )}(hjI h]h*}(hjvhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj&ubj)}(hobjcgh]hobjcg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj"ubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jdc.obj_cgroup_charge_zswapasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj"ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h!charge compression backend memoryh]h!charge compression backend memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct obj_cgroup *objcg`` the object cgroup ``size_t size`` size of compressed object **Description** This forces the charge after obj_cgroup_may_zswap() allowed compression and storage in zswap for this cgroup to go ahead.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h/``struct obj_cgroup *objcg`` the object cgroup h](j)}(h``struct obj_cgroup *objcg``h]jS)}(hj6h]hstruct obj_cgroup *objcg}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj4ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj0ubj)}(hhh]jM)}(hthe object cgrouph]hthe object cgroup}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjKhMhjLubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhjKhMhj-ubj)}(h*``size_t size`` size of compressed object h](j)}(h``size_t size``h]jS)}(hjoh]h size_t size}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjmubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjiubj)}(hhh]jM)}(hsize of compressed objecth]hsize of compressed object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhj-ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(hyThis forces the charge after obj_cgroup_may_zswap() allowed compression and storage in zswap for this cgroup to go ahead.h]hyThis forces the charge after obj_cgroup_may_zswap() allowed compression and storage in zswap for this cgroup to go ahead.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&obj_cgroup_uncharge_zswap (C function)c.obj_cgroup_uncharge_zswaphNtauh1hhjhhhNhNubh)}(hhh](h)}(hFvoid obj_cgroup_uncharge_zswap (struct obj_cgroup *objcg, size_t size)h]h)}(hEvoid obj_cgroup_uncharge_zswap(struct obj_cgroup *objcg, size_t size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hobj_cgroup_uncharge_zswaph]j)}(hobj_cgroup_uncharge_zswaph]hobj_cgroup_uncharge_zswap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h'(struct obj_cgroup *objcg, size_t size)h](j )}(hstruct obj_cgroup *objcgh](j5)}(hj8h]hstruct}(hj,hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh)}(hhh]j)}(h obj_cgrouph]h obj_cgroup}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjLmodnameN classnameNjpjs)}jv]jy)}jljsbc.obj_cgroup_uncharge_zswapasbuh1hhj(ubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF )}(hjI h]h*}(hjxhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(ubj)}(hobjcgh]hobjcg}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jfc.obj_cgroup_uncharge_zswapasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h#uncharge compression backend memoryh]h#uncharge compression backend memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct obj_cgroup *objcg`` the object cgroup ``size_t size`` size of compressed object **Description** Uncharges zswap memory on page in.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubj)}(hhh](j)}(h/``struct obj_cgroup *objcg`` the object cgroup h](j)}(h``struct obj_cgroup *objcg``h]jS)}(hj8h]hstruct obj_cgroup *objcg}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhj2ubj)}(hhh]jM)}(hthe object cgrouph]hthe object cgroup}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjMhMhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhMhj/ubj)}(h*``size_t size`` size of compressed object h](j)}(h``size_t size``h]jS)}(hjqh]h size_t size}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjkubj)}(hhh]jM)}(hsize of compressed objecth]hsize of compressed object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjhMhj/ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubjM)}(h"Uncharges zswap memory on page in.h]h"Uncharges zswap memory on page in.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhP/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:122: ./mm/memcontrol.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubjK)}(h0#kernel-doc:: mm/memory-tiers.c (build warnings)h]h0#kernel-doc:: mm/memory-tiers.c (build warnings)}hjsbah}(h]h ]h"]h$]h&]jjuh1jJhjhhhhhK{ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hshmem_recalc_inode (C function)c.shmem_recalc_inodehNtauh1hhjhhhNhNubh)}(hhh](h)}(hIbool shmem_recalc_inode (struct inode *inode, long alloced, long swapped)h]h)}(hHbool shmem_recalc_inode(struct inode *inode, long alloced, long swapped)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubh)}(hshmem_recalc_inodeh]j)}(hshmem_recalc_inodeh]hshmem_recalc_inode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hMubj )}(h1(struct inode *inode, long alloced, long swapped)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hj;hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj7ubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubh)}(hhh]j)}(hinodeh]hinode}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj[modnameN classnameNjpjs)}jv]jy)}jlj!sbc.shmem_recalc_inodeasbuh1hhj7ubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj7ubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubj )}(h long allocedh](j)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hallocedh]halloced}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubj )}(h long swappedh](j)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hswappedh]hswapped}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhjhhubj4)}(hhh]jM)}(h'recalculate the block usage of an inodeh]h'recalculate the block usage of an inode}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj%hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj@jHj@jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct inode *inode`` inode to recalc ``long alloced`` the change in number of pages allocated to inode ``long swapped`` the change in number of pages swapped from inode **Description** We have to calculate the free blocks since the mm can drop undirtied hole pages behind our back. But normally info->alloced == inode->i_mapping->nrpages + info->swapped So mm freed is info->alloced - (inode->i_mapping->nrpages + info->swapped) **Return** true if swapped was incremented from 0, for shmem_writeout().h](jM)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjDubj)}(hhh](j)}(h(``struct inode *inode`` inode to recalc h](j)}(h``struct inode *inode``h]jS)}(hjih]hstruct inode *inode}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjcubj)}(hhh]jM)}(hinode to recalch]hinode to recalc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~hMhjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhj~hMhj`ubj)}(hB``long alloced`` the change in number of pages allocated to inode h](j)}(h``long alloced``h]jS)}(hjh]h long alloced}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh]jM)}(h0the change in number of pages allocated to inodeh]h0the change in number of pages allocated to inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj`ubj)}(hB``long swapped`` the change in number of pages swapped from inode h](j)}(h``long swapped``h]jS)}(hjh]h long swapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh]jM)}(h0the change in number of pages swapped from inodeh]h0the change in number of pages swapped from inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj`ubeh}(h]h ]h"]h$]h&]uh1jhjDubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjDubjM)}(h`We have to calculate the free blocks since the mm can drop undirtied hole pages behind our back.h]h`We have to calculate the free blocks since the mm can drop undirtied hole pages behind our back.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjDubjM)}(hBut normally info->alloced == inode->i_mapping->nrpages + info->swapped So mm freed is info->alloced - (inode->i_mapping->nrpages + info->swapped)h]hBut normally info->alloced == inode->i_mapping->nrpages + info->swapped So mm freed is info->alloced - (inode->i_mapping->nrpages + info->swapped)}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjDubjM)}(h **Return**h]j)}(hjLh]hReturn}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjDubjM)}(h=true if swapped was incremented from 0, for shmem_writeout().h]h=true if swapped was incremented from 0, for shmem_writeout().}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hshmem_writeout (C function)c.shmem_writeouthNtauh1hhjhhhNhNubh)}(hhh](h)}(h_int shmem_writeout (struct swap_io_ctx *ctx, struct folio *folio, struct list_head *folio_list)h]h)}(h^int shmem_writeout(struct swap_io_ctx *ctx, struct folio *folio, struct list_head *folio_list)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM@ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM@ubh)}(hshmem_writeouth]j)}(hshmem_writeouth]hshmem_writeout}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM@ubj )}(hL(struct swap_io_ctx *ctx, struct folio *folio, struct list_head *folio_list)h](j )}(hstruct swap_io_ctx *ctxh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h swap_io_ctxh]h swap_io_ctx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.shmem_writeoutasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hctxh]hctx}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj@hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj<ubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j)}(hfolioh]hfolio}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj`modnameN classnameNjpjs)}jv]jc.shmem_writeoutasbuh1hhj<ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj<ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct list_head *folio_listh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h list_headh]h list_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.shmem_writeoutasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h folio_listh]h folio_list}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM@ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM@ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM@hjhhubj4)}(hhh]jM)}(hWrite the folio to swaph]hWrite the folio to swap}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM@hj.hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM@ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjIjHjIjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct swap_io_ctx *ctx`` swap I/O context ``struct folio *folio`` The folio to write ``struct list_head *folio_list`` list to put back folios on split **Description** Move the folio from the page cache to the swap cache.h](jM)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMDhjMubj)}(hhh](j)}(h-``struct swap_io_ctx *ctx`` swap I/O context h](j)}(h``struct swap_io_ctx *ctx``h]jS)}(hjrh]hstruct swap_io_ctx *ctx}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjpubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMAhjlubj)}(hhh]jM)}(hswap I/O contexth]hswap I/O context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMAhjubah}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jhjhMAhjiubj)}(h+``struct folio *folio`` The folio to write h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMBhjubj)}(hhh]jM)}(hThe folio to writeh]hThe folio to write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMBhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMBhjiubj)}(hB``struct list_head *folio_list`` list to put back folios on split h](j)}(h ``struct list_head *folio_list``h]jS)}(hjh]hstruct list_head *folio_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMChjubj)}(hhh]jM)}(h list to put back folios on splith]h list to put back folios on split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjiubeh}(h]h ]h"]h$]h&]uh1jhjMubjM)}(h**Description**h]j)}(hjh]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMEhjMubjM)}(h5Move the folio from the page cache to the swap cache.h]h5Move the folio from the page cache to the swap cache.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMDhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hshmem_get_folio (C function)c.shmem_get_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(htint shmem_get_folio (struct inode *inode, pgoff_t index, loff_t write_end, struct folio **foliop, enum sgp_type sgp)h]h)}(hsint shmem_get_folio(struct inode *inode, pgoff_t index, loff_t write_end, struct folio **foliop, enum sgp_type sgp)h](j)}(hinth]hint}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM0 ubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhjrhM0 ubh)}(hshmem_get_folioh]j)}(hshmem_get_folioh]hshmem_get_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj`hhhjrhM0 ubj )}(h`(struct inode *inode, pgoff_t index, loff_t write_end, struct folio **foliop, enum sgp_type sgp)h](j )}(hstruct inode *inodeh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.shmem_get_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hinodeh]hinode}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.shmem_get_folioasbuh1hhjubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hindexh]hindex}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hloff_t write_endh](h)}(hhh]j)}(hloff_th]hloff_t}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj`modnameN classnameNjpjs)}jv]jc.shmem_get_folioasbuh1hhjWubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h write_endh]h write_end}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct folio **folioph](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.shmem_get_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioph]hfoliop}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum sgp_type sgph](j5)}(hjh]henum}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hsgp_typeh]hsgp_type}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@modnameN classnameNjpjs)}jv]jc.shmem_get_folioasbuh1hhjubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsgph]hsgp}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hj`hhhjrhM0 ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj\hhhjrhM0 ubah}(h]jWah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjrhM0 hjYhhubj4)}(hhh]jM)}(hfind, and lock a shmem folio.h]hfind, and lock a shmem folio.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM0 hjhhubah}(h]h ]h"]h$]h&]uh1j3hjYhhhjrhM0 ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct inode *inode`` inode to search ``pgoff_t index`` the page index. ``loff_t write_end`` end of a write, could extend inode size ``struct folio **foliop`` pointer to the folio if found ``enum sgp_type sgp`` SGP_* flags to control behavior **Description** Looks up the page cache entry at **inode** & **index**. If a folio is present, it is returned locked with an increased refcount. If the caller modifies data in the folio, it must call folio_mark_dirty() before unlocking the folio to ensure that the folio is not reclaimed. There is no need to reserve space before calling folio_mark_dirty(). When no folio is found, the behavior depends on **sgp**: - for SGP_READ, ***foliop** is ``NULL`` and 0 is returned - for SGP_NOALLOC, ***foliop** is ``NULL`` and -ENOENT is returned - for all other flags a new folio is allocated, inserted into the page cache and returned locked in **foliop**. **Context** May sleep. **Return** 0 if successful, else a negative error code.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM4 hjubj)}(hhh](j)}(h(``struct inode *inode`` inode to search h](j)}(h``struct inode *inode``h]jS)}(hjh]hstruct inode *inode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM1 hjubj)}(hhh]jM)}(hinode to searchh]hinode to search}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM1 hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM1 hjubj)}(h"``pgoff_t index`` the page index. h](j)}(h``pgoff_t index``h]jS)}(hjh]h pgoff_t index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM2 hjubj)}(hhh]jM)}(hthe page index.h]hthe page index.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#hM2 hj$ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj#hM2 hjubj)}(h=``loff_t write_end`` end of a write, could extend inode size h](j)}(h``loff_t write_end``h]jS)}(hjGh]hloff_t write_end}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjEubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM3 hjAubj)}(hhh]jM)}(h'end of a write, could extend inode sizeh]h'end of a write, could extend inode size}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj\hM3 hj]ubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhj\hM3 hjubj)}(h8``struct folio **foliop`` pointer to the folio if found h](j)}(h``struct folio **foliop``h]jS)}(hjh]hstruct folio **foliop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM4 hjzubj)}(hhh]jM)}(hpointer to the folio if foundh]hpointer to the folio if found}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM4 hjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhjhM4 hjubj)}(h6``enum sgp_type sgp`` SGP_* flags to control behavior h](j)}(h``enum sgp_type sgp``h]jS)}(hjh]henum sgp_type sgp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM5 hjubj)}(hhh]jM)}(hSGP_* flags to control behaviorh]hSGP_* flags to control behavior}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM5 hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM5 hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM7 hjubjM)}(hLooks up the page cache entry at **inode** & **index**. If a folio is present, it is returned locked with an increased refcount.h](h!Looks up the page cache entry at }(hj hhhNhNubj)}(h **inode**h]hinode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh & }(hj hhhNhNubj)}(h **index**h]hindex}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhK. If a folio is present, it is returned locked with an increased refcount.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM6 hjubjM)}(hIf the caller modifies data in the folio, it must call folio_mark_dirty() before unlocking the folio to ensure that the folio is not reclaimed. There is no need to reserve space before calling folio_mark_dirty().h]hIf the caller modifies data in the folio, it must call folio_mark_dirty() before unlocking the folio to ensure that the folio is not reclaimed. There is no need to reserve space before calling folio_mark_dirty().}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM9 hjubj)}(hhh]j)}(hX(When no folio is found, the behavior depends on **sgp**: - for SGP_READ, ***foliop** is ``NULL`` and 0 is returned - for SGP_NOALLOC, ***foliop** is ``NULL`` and -ENOENT is returned - for all other flags a new folio is allocated, inserted into the page cache and returned locked in **foliop**. h](j)}(h8When no folio is found, the behavior depends on **sgp**:h](h0When no folio is found, the behavior depends on }(hjShhhNhNubj)}(h**sgp**h]hsgp}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubh:}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMA hjOubj)}(hhh]jaW)}(hhh](j/)}(h7for SGP_READ, ***foliop** is ``NULL`` and 0 is returnedh]jM)}(hj|h](hfor SGP_READ, }(hj~hhhNhNubj)}(h ***foliop**h]h*foliop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh is }(hj~hhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~ubh and 0 is returned}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM> hjzubah}(h]h ]h"]h$]h&]uh1j/hjwubj/)}(h@for SGP_NOALLOC, ***foliop** is ``NULL`` and -ENOENT is returnedh]jM)}(hjh](hfor SGP_NOALLOC, }(hjhhhNhNubj)}(h ***foliop**h]h*foliop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is }(hjhhhNhNubjS)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh and -ENOENT is returned}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM? hjubah}(h]h ]h"]h$]h&]uh1j/hjwubj/)}(hnfor all other flags a new folio is allocated, inserted into the page cache and returned locked in **foliop**. h]jM)}(hmfor all other flags a new folio is allocated, inserted into the page cache and returned locked in **foliop**.h](hbfor all other flags a new folio is allocated, inserted into the page cache and returned locked in }(hjhhhNhNubj)}(h **foliop**h]hfoliop}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM@ hjubah}(h]h ]h"]h$]h&]uh1j/hjwubeh}(h]h ]h"]h$]h&]jWjWuh1j`WhjhM> hjtubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjshMA hjLubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Context**h]j)}(hj7 h]hContext}(hj9 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5 ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMC hjubjM)}(h May sleep.h]h May sleep.}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMD hjubjM)}(h **Return**h]j)}(hj^ h]hReturn}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMF hjubjM)}(h,0 if successful, else a negative error code.h]h,0 if successful, else a negative error code.}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chME hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$shmem_kernel_file_setup (C function)c.shmem_kernel_file_setuphNtauh1hhjhhhNhNubh)}(hhh](h)}(hXstruct file * shmem_kernel_file_setup (const char *name, loff_t size, vma_flags_t flags)h]h)}(hVstruct file *shmem_kernel_file_setup(const char *name, loff_t size, vma_flags_t flags) h](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj hhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubh)}(hhh]j)}(hfileh]hfile}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jlshmem_kernel_file_setupsbc.shmem_kernel_file_setupasbuh1hhj hhhj hMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj hhhj hMubh)}(hshmem_kernel_file_setuph]j)}(hj h]hshmem_kernel_file_setup}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhj hMubj )}(h2(const char *name, loff_t size, vma_flags_t flags)h](j )}(hconst char *nameh](j5)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hj* hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hcharh]hchar}(hj8 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjF hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hjT hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hnameh]hname}(hja hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(h loff_t sizeh](h)}(hhh]j)}(hloff_th]hloff_t}(hj} hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjz ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]j c.shmem_kernel_file_setupasbuh1hhjv ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv ubj)}(hsizeh]hsize}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hvma_flags_t flagsh](h)}(hhh]j)}(h vma_flags_th]h vma_flags_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]j c.shmem_kernel_file_setupasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hflagsh]hflags}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhj hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hMhj hhubj4)}(hhh]jM)}(hXCget an unlinked file living in tmpfs which must be kernel internal. There will be NO LSM permission checks against the underlying inode. So users of this interface must do LSM checks at a higher layer. The users are the big_key and shm implementations. LSM checks are provided at the key or shm level rather than the inode.h]hXCget an unlinked file living in tmpfs which must be kernel internal. There will be NO LSM permission checks against the underlying inode. So users of this interface must do LSM checks at a higher layer. The users are the big_key and shm implementations. LSM checks are provided at the key or shm level rather than the inode.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj3 jHj3 jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const char *name`` name for dentry (to be seen in /proc//maps) ``loff_t size`` size to be set for the file ``vma_flags_t flags`` VMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh](jM)}(h**Parameters**h]j)}(hj= h]h Parameters}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj; ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj7 ubj)}(hhh](j)}(hF``const char *name`` name for dentry (to be seen in /proc//maps) h](j)}(h``const char *name``h]jS)}(hj\ h]hconst char *name}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZ ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjV ubj)}(hhh]jM)}(h0name for dentry (to be seen in /proc//maps)h]h0name for dentry (to be seen in /proc//maps)}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjq hMhjr ubah}(h]h ]h"]h$]h&]uh1jhjV ubeh}(h]h ]h"]h$]h&]uh1jhjq hMhjS ubj)}(h,``loff_t size`` size to be set for the file h](j)}(h``loff_t size``h]jS)}(hj h]h loff_t size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj ubj)}(hhh]jM)}(hsize to be set for the fileh]hsize to be set for the file}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjS ubj)}(h[``vma_flags_t flags`` VMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh](j)}(h``vma_flags_t flags``h]jS)}(hj h]hvma_flags_t flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj ubj)}(hhh]jM)}(hEVMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh]hEVMA_NORESERVE_BIT suppresses pre-accounting of the entire object size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhjS ubeh}(h]h ]h"]h$]h&]uh1jhj7 ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hshmem_file_setup (C function)c.shmem_file_setuphNtauh1hhjhhhNhNubh)}(hhh](h)}(hQstruct file * shmem_file_setup (const char *name, loff_t size, vma_flags_t flags)h]h)}(hOstruct file *shmem_file_setup(const char *name, loff_t size, vma_flags_t flags)h](j5)}(hj8h]hstruct}(hj( hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj$ hhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMubj)}(h h]h }(hj6 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ hhhj5 hMubh)}(hhh]j)}(hfileh]hfile}(hjG hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjI modnameN classnameNjpjs)}jv]jy)}jlshmem_file_setupsbc.shmem_file_setupasbuh1hhj$ hhhj5 hMubj)}(h h]h }(hjh hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ hhhj5 hMubjF )}(hjI h]h*}(hjv hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj$ hhhj5 hMubh)}(hshmem_file_setuph]j)}(hje h]hshmem_file_setup}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj$ hhhj5 hMubj )}(h2(const char *name, loff_t size, vma_flags_t flags)h](j )}(hconst char *nameh](j5)}(hjh]hconst}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj 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 ubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hnameh]hname}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(h loff_t sizeh](h)}(hhh]j)}(hloff_th]hloff_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jc c.shmem_file_setupasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hsizeh]hsize}(hj. hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hvma_flags_t flagsh](h)}(hhh]j)}(h vma_flags_th]h vma_flags_t}(hjJ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjL modnameN classnameNjpjs)}jv]jc c.shmem_file_setupasbuh1hhjC ubj)}(h h]h }(hjh hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC ubj)}(hflagsh]hflags}(hjv hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hj$ hhhj5 hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj hhhj5 hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj5 hMhj hhubj4)}(hhh]jM)}(h$get an unlinked file living in tmpfsh]h$get an unlinked file living in tmpfs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj5 hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const char *name`` name for dentry (to be seen in /proc//maps) ``loff_t size`` size to be set for the file ``vma_flags_t flags`` VMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj ubj)}(hhh](j)}(hF``const char *name`` name for dentry (to be seen in /proc//maps) h](j)}(h``const char *name``h]jS)}(hj h]hconst char *name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj ubj)}(hhh]jM)}(h0name for dentry (to be seen in /proc//maps)h]h0name for dentry (to be seen in /proc//maps)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubj)}(h,``loff_t size`` size to be set for the file h](j)}(h``loff_t size``h]jS)}(hjh]h loff_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh]jM)}(hsize to be set for the fileh]hsize to be set for the file}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/hMhj ubj)}(h[``vma_flags_t flags`` VMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh](j)}(h``vma_flags_t flags``h]jS)}(hjSh]hvma_flags_t flags}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjMubj)}(hhh]jM)}(hEVMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh]hEVMA_NORESERVE_BIT suppresses pre-accounting of the entire object size}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&shmem_file_setup_with_mnt (C function)c.shmem_file_setup_with_mnthNtauh1hhjhhhNhNubh)}(hhh](h)}(hpstruct file * shmem_file_setup_with_mnt (struct vfsmount *mnt, const char *name, loff_t size, vma_flags_t flags)h]h)}(hnstruct file *shmem_file_setup_with_mnt(struct vfsmount *mnt, const char *name, loff_t size, vma_flags_t flags)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j)}(hfileh]hfile}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlshmem_file_setup_with_mntsbc.shmem_file_setup_with_mntasbuh1hhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhMubh)}(hshmem_file_setup_with_mnth]j)}(hjh]hshmem_file_setup_with_mnt}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(hH(struct vfsmount *mnt, const char *name, loff_t size, vma_flags_t flags)h](j )}(hstruct vfsmount *mnth](j5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(hvfsmounth]hvfsmount}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]jc.shmem_file_setup_with_mntasbuh1hhj#ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hmnth]hmnt}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst char *nameh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hnameh]hname}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h loff_t sizeh](h)}(hhh]j)}(hloff_th]hloff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.shmem_file_setup_with_mntasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hvma_flags_t flagsh](h)}(hhh]j)}(h vma_flags_th]h vma_flags_t}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjAmodnameN classnameNjpjs)}jv]jc.shmem_file_setup_with_mntasbuh1hhj8ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hflagsh]hflags}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h$get an unlinked file living in tmpfsh]h$get an unlinked file living in tmpfs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX0**Parameters** ``struct vfsmount *mnt`` the tmpfs mount where the file will be created ``const char *name`` name for dentry (to be seen in /proc//maps) ``loff_t size`` size to be set for the file ``vma_flags_t flags`` VMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh](j)}(hH``struct vfsmount *mnt`` the tmpfs mount where the file will be created h](j)}(h``struct vfsmount *mnt``h]jS)}(hjh]hstruct vfsmount *mnt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh]jM)}(h.the tmpfs mount where the file will be createdh]h.the tmpfs mount where the file will be created}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hF``const char *name`` name for dentry (to be seen in /proc//maps) h](j)}(h``const char *name``h]jS)}(hjh]hconst char *name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj ubj)}(hhh]jM)}(h0name for dentry (to be seen in /proc//maps)h]h0name for dentry (to be seen in /proc//maps)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj$hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhjubj)}(h,``loff_t size`` size to be set for the file h](j)}(h``loff_t size``h]jS)}(hjHh]h loff_t size}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjBubj)}(hhh]jM)}(hsize to be set for the fileh]hsize to be set for the file}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj]hMhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj]hMhjubj)}(h[``vma_flags_t flags`` VMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh](j)}(h``vma_flags_t flags``h]jS)}(hjh]hvma_flags_t flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhj{ubj)}(hhh]jM)}(hEVMA_NORESERVE_BIT suppresses pre-accounting of the entire object sizeh]hEVMA_NORESERVE_BIT suppresses pre-accounting of the entire object size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hshmem_zero_setup (C function)c.shmem_zero_setuphNtauh1hhjhhhNhNubh)}(hhh](h)}(h1int shmem_zero_setup (struct vm_area_struct *vma)h]h)}(h0int shmem_zero_setup(struct vm_area_struct *vma)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hshmem_zero_setuph]j)}(hshmem_zero_setuph]hshmem_zero_setup}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(struct vm_area_struct *vma)h]j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]jy)}jljsbc.shmem_zero_setupasbuh1hhjubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjdhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h setup a shared anonymous mappingh]h setup a shared anonymous mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct vm_area_struct *vma`` the vma to be mmapped is prepared by do_mmap **Return** 0 on success, or errorh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh]j)}(hL``struct vm_area_struct *vma`` the vma to be mmapped is prepared by do_mmap h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubj)}(hhh]jM)}(h,the vma to be mmapped is prepared by do_mmaph]h,the vma to be mmapped is prepared by do_mmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubjM)}(h0 on success, or errorh]h0 on success, or error}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"shmem_zero_setup_desc (C function)c.shmem_zero_setup_deschNtauh1hhjhhhNhNubh)}(hhh](h)}(h5int shmem_zero_setup_desc (struct vm_area_desc *desc)h]h)}(h4int shmem_zero_setup_desc(struct vm_area_desc *desc)h](j)}(hinth]hint}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM$ubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhjjhM$ubh)}(hshmem_zero_setup_desch]j)}(hshmem_zero_setup_desch]hshmem_zero_setup_desc}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1hhjXhhhjjhM$ubj )}(h(struct vm_area_desc *desc)h]j )}(hstruct vm_area_desc *desch](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vm_area_desch]h vm_area_desc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.shmem_zero_setup_descasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdesch]hdesc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjXhhhjjhM$ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjThhhjjhM$ubah}(h]jOah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjjhM$hjQhhubj4)}(hhh]jM)}(hKsame as shmem_zero_setup, but determined by VMA descriptor for convenience.h]hKsame as shmem_zero_setup, but determined by VMA descriptor for convenience.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM$hjhhubah}(h]h ]h"]h$]h&]uh1j3hjQhhhjjhM$ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj4jHj4jIjJjKuh1hhhhjhNhNubj)}(ha**Parameters** ``struct vm_area_desc *desc`` Describes VMA **Return** 0 on success, or errorh](jM)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM(hj8ubj)}(hhh]j)}(h,``struct vm_area_desc *desc`` Describes VMA h](j)}(h``struct vm_area_desc *desc``h]jS)}(hj]h]hstruct vm_area_desc *desc}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM&hjWubj)}(hhh]jM)}(h Describes VMAh]h Describes VMA}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjrhM&hjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjrhM&hjTubah}(h]h ]h"]h$]h&]uh1jhj8ubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM(hj8ubjM)}(h0 on success, or errorh]h0 on success, or error}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM'hj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!shmem_read_folio_gfp (C function)c.shmem_read_folio_gfphNtauh1hhjhhhNhNubh)}(hhh](h)}(h]struct folio * shmem_read_folio_gfp (struct address_space *mapping, pgoff_t index, gfp_t gfp)h]h)}(h[struct folio *shmem_read_folio_gfp(struct address_space *mapping, pgoff_t index, gfp_t gfp)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM7ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM7ubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlshmem_read_folio_gfpsbc.shmem_read_folio_gfpasbuh1hhjhhhjhM7ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM7ubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhM7ubh)}(hshmem_read_folio_gfph]j)}(hjh]hshmem_read_folio_gfp}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM7ubj )}(h9(struct address_space *mapping, pgoff_t index, gfp_t gfp)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjWhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubh)}(hhh]j)}(h address_spaceh]h address_space}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwmodnameN classnameNjpjs)}jv]jc.shmem_read_folio_gfpasbuh1hhjSubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSubj)}(hmappingh]hmapping}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(h pgoff_t indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.shmem_read_folio_gfpasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hindexh]hindex}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.shmem_read_folio_gfpasbuh1hhj ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hgfph]hgfp}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjOubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM7ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM7ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM7hjhhubj4)}(hhh]jM)}(hread_folio() method: which does not suit tmpfs, since it may have pages in swapcache, and needs to find those for itself; although drivers/gpu/drm i915 and ttm rely upon this support. i915_gem_object_get_pages_gtt() mixes __GFP_NORETRY | __GFP_NOWARN in with the mapping_gfp_mask(), to avoid OOMing the machine unnecessarily.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM;hjubj)}(hhh](j)}(h<``struct address_space *mapping`` the folio's address_space h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM8hjubj)}(hhh]jM)}(hthe folio's address_spaceh]hthe folio’s address_space}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM8hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM8hjubj)}(h"``pgoff_t index`` the folio index h](j)}(h``pgoff_t index``h]jS)}(hjh]h pgoff_t index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM9hjubj)}(hhh]jM)}(hthe folio indexh]hthe folio index}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM9hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM9hjubj)}(h<``gfp_t gfp`` the page allocator flags to use if allocating h](j)}(h ``gfp_t gfp``h]jS)}(hjh]h gfp_t gfp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM:hjubj)}(hhh]jM)}(h-the page allocator flags to use if allocatingh]h-the page allocator flags to use if allocating}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj0hM:hj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hM:hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjVh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM<hjubjM)}(hXiThis behaves as a tmpfs "read_cache_page_gfp(mapping, index, gfp)", with any new page allocations done using the specified allocation flags. But read_cache_page_gfp() uses the ->read_folio() method: which does not suit tmpfs, since it may have pages in swapcache, and needs to find those for itself; although drivers/gpu/drm i915 and ttm rely upon this support.h]hXmThis behaves as a tmpfs “read_cache_page_gfp(mapping, index, gfp)”, with any new page allocations done using the specified allocation flags. But read_cache_page_gfp() uses the ->read_folio() method: which does not suit tmpfs, since it may have pages in swapcache, and needs to find those for itself; although drivers/gpu/drm i915 and ttm rely upon this support.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chM;hjubjM)}(hi915_gem_object_get_pages_gtt() mixes __GFP_NORETRY | __GFP_NOWARN in with the mapping_gfp_mask(), to avoid OOMing the machine unnecessarily.h]hi915_gem_object_get_pages_gtt() mixes __GFP_NORETRY | __GFP_NOWARN in with the mapping_gfp_mask(), to avoid OOMing the machine unnecessarily.}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhK/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:124: ./mm/shmem.chMAhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$migrate_vma_split_folio (C function)c.migrate_vma_split_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hJint migrate_vma_split_folio (struct folio *folio, struct page *fault_page)h]h)}(hIint migrate_vma_split_folio(struct folio *folio, struct page *fault_page)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKLubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKLubh)}(hmigrate_vma_split_folioh]j)}(hmigrate_vma_split_folioh]hmigrate_vma_split_folio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKLubj )}(h.(struct folio *folio, struct page *fault_page)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.migrate_vma_split_folioasbuh1hhjubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj3hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *fault_pageh](j5)}(hj8h]hstruct}(hjYhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjUubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubh)}(hhh]j)}(hpageh]hpage}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjymodnameN classnameNjpjs)}jv]j!c.migrate_vma_split_folioasbuh1hhjUubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjUubj)}(h fault_pageh]h fault_page}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhKLubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKLubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKLhjhhubj4)}(hhh]jM)}(h$Helper function to split a THP folioh]h$Helper function to split a THP folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKLhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKLubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX<**Parameters** ``struct folio *folio`` the folio to split ``struct page *fault_page`` struct page associated with the fault if any **Description** If **folio** is not the folio containing **fault_page**, the caller must hold a reference on **folio**. The helper consumes that reference. Returns 0 on successh](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKPhjubj)}(hhh](j)}(h+``struct folio *folio`` the folio to split h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKMhjubj)}(hhh]jM)}(hthe folio to splith]hthe folio to split}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj0hKMhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hKMhjubj)}(hI``struct page *fault_page`` struct page associated with the fault if any h](j)}(h``struct page *fault_page``h]jS)}(hjTh]hstruct page *fault_page}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjRubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKNhjNubj)}(hhh]jM)}(h,struct page associated with the fault if anyh]h,struct page associated with the fault if any}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjihKNhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihKNhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKPhjubjM)}(hIf **folio** is not the folio containing **fault_page**, the caller must hold a reference on **folio**. The helper consumes that reference.h](hIf }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is not the folio containing }(hjhhhNhNubj)}(h**fault_page**h]h fault_page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh&, the caller must hold a reference on }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh%. The helper consumes that reference.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKOhjubjM)}(hReturns 0 on successh]hReturns 0 on success}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chKRhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmigrate_vma_setup (C function)c.migrate_vma_setuphNtauh1hhjhhhNhNubh)}(hhh](h)}(h0int migrate_vma_setup (struct migrate_vma *args)h]h)}(h/int migrate_vma_setup(struct migrate_vma *args)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj'hMubh)}(hmigrate_vma_setuph]j)}(hmigrate_vma_setuph]hmigrate_vma_setup}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj'hMubj )}(h(struct migrate_vma *args)h]j )}(hstruct migrate_vma *argsh](j5)}(hj8h]hstruct}(hjVhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjRubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubh)}(hhh]j)}(h migrate_vmah]h migrate_vma}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjvmodnameN classnameNjpjs)}jv]jy)}jlj<sbc.migrate_vma_setupasbuh1hhjRubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjRubj)}(hargsh]hargs}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjNubah}(h]h ]h"]h$]h&]jjuh1j hjhhhj'hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj'hMubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj'hMhjhhubj4)}(hhh]jM)}(h$prepare to migrate a range of memoryh]h$prepare to migrate a range of memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj'hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX **Parameters** ``struct migrate_vma *args`` contains the vma, start, and pfns arrays for the migration **Return** negative errno on failures, 0 when 0 or more pages were migrated without an error. **Description** Prepare to migrate a range of memory virtual address range by collecting all the pages backing each virtual address in the range, saving them inside the src array. Then lock those pages and unmap them. Once the pages are locked and unmapped, check whether each page is pinned or not. Pages that aren't pinned have the MIGRATE_PFN_MIGRATE flag set (by this function) in the corresponding src array entry. Then restores any pages that are pinned, by remapping and unlocking those pages. The caller should then allocate destination memory and copy source memory to it for all those entries (ie with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set). Once these are allocated and copied, the caller must update each corresponding entry in the dst array with the pfn value of the destination page and with MIGRATE_PFN_VALID. Destination pages must be locked via lock_page(). Note that the caller does not have to migrate all the pages that are marked with MIGRATE_PFN_MIGRATE flag in src array unless this is a migration from device memory to system memory. If the caller cannot migrate a device page back to system memory, then it must return VM_FAULT_SIGBUS, which has severe consequences for the userspace process, so it must be avoided if at all possible. For empty entries inside CPU page table (pte_none() or pmd_none() is true) we do set MIGRATE_PFN_MIGRATE flag inside the corresponding source array thus allowing the caller to allocate device memory for those unbacked virtual addresses. For this the caller simply has to allocate device memory and properly set the destination entry like for regular migration. Note that this can still fail, and thus inside the device driver you must check if the migration was successful for those entries after calling migrate_vma_pages(), just like for regular migration. After that, the callers must call migrate_vma_pages() to go over each entry in the src array that has the MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set. If the corresponding entry in dst array has MIGRATE_PFN_VALID flag set, then migrate_vma_pages() to migrate struct page information from the source struct page to the destination struct page. If it fails to migrate the struct page information, then it clears the MIGRATE_PFN_MIGRATE flag in the src array. At this point all successfully migrated pages have an entry in the src array with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set and the dst array entry with MIGRATE_PFN_VALID flag set. Once migrate_vma_pages() returns the caller may inspect which pages were successfully migrated, and which were not. Successfully migrated pages will have the MIGRATE_PFN_MIGRATE flag set for their src array entry. It is safe to update device page table after migrate_vma_pages() because both destination and source page are still locked, and the mmap_lock is held in read mode (hence no one can unmap the range being migrated). Once the caller is done cleaning up things and updating its page table (if it chose to do so, this is not an obligation) it finally calls migrate_vma_finalize() to update the CPU page table to point to new pages for successfully migrated pages or otherwise restore the CPU page table to point to the original source pages.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh]j)}(hX``struct migrate_vma *args`` contains the vma, start, and pfns arrays for the migration h](j)}(h``struct migrate_vma *args``h]jS)}(hjh]hstruct migrate_vma *args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh]jM)}(h:contains the vma, start, and pfns arrays for the migrationh]h:contains the vma, start, and pfns arrays for the migration}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMhj0ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/hMhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hjUh]hReturn}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hRnegative errno on failures, 0 when 0 or more pages were migrated without an error.h]hRnegative errno on failures, 0 when 0 or more pages were migrated without an error.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(h**Description**h]j)}(hj|h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hXPrepare to migrate a range of memory virtual address range by collecting all the pages backing each virtual address in the range, saving them inside the src array. Then lock those pages and unmap them. Once the pages are locked and unmapped, check whether each page is pinned or not. Pages that aren't pinned have the MIGRATE_PFN_MIGRATE flag set (by this function) in the corresponding src array entry. Then restores any pages that are pinned, by remapping and unlocking those pages.h]hXPrepare to migrate a range of memory virtual address range by collecting all the pages backing each virtual address in the range, saving them inside the src array. Then lock those pages and unmap them. Once the pages are locked and unmapped, check whether each page is pinned or not. Pages that aren’t pinned have the MIGRATE_PFN_MIGRATE flag set (by this function) in the corresponding src array entry. Then restores any pages that are pinned, by remapping and unlocking those pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hXThe caller should then allocate destination memory and copy source memory to it for all those entries (ie with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set). Once these are allocated and copied, the caller must update each corresponding entry in the dst array with the pfn value of the destination page and with MIGRATE_PFN_VALID. Destination pages must be locked via lock_page().h]hXThe caller should then allocate destination memory and copy source memory to it for all those entries (ie with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set). Once these are allocated and copied, the caller must update each corresponding entry in the dst array with the pfn value of the destination page and with MIGRATE_PFN_VALID. Destination pages must be locked via lock_page().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hXNote that the caller does not have to migrate all the pages that are marked with MIGRATE_PFN_MIGRATE flag in src array unless this is a migration from device memory to system memory. If the caller cannot migrate a device page back to system memory, then it must return VM_FAULT_SIGBUS, which has severe consequences for the userspace process, so it must be avoided if at all possible.h]hXNote that the caller does not have to migrate all the pages that are marked with MIGRATE_PFN_MIGRATE flag in src array unless this is a migration from device memory to system memory. If the caller cannot migrate a device page back to system memory, then it must return VM_FAULT_SIGBUS, which has severe consequences for the userspace process, so it must be avoided if at all possible.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hX0For empty entries inside CPU page table (pte_none() or pmd_none() is true) we do set MIGRATE_PFN_MIGRATE flag inside the corresponding source array thus allowing the caller to allocate device memory for those unbacked virtual addresses. For this the caller simply has to allocate device memory and properly set the destination entry like for regular migration. Note that this can still fail, and thus inside the device driver you must check if the migration was successful for those entries after calling migrate_vma_pages(), just like for regular migration.h]hX0For empty entries inside CPU page table (pte_none() or pmd_none() is true) we do set MIGRATE_PFN_MIGRATE flag inside the corresponding source array thus allowing the caller to allocate device memory for those unbacked virtual addresses. For this the caller simply has to allocate device memory and properly set the destination entry like for regular migration. Note that this can still fail, and thus inside the device driver you must check if the migration was successful for those entries after calling migrate_vma_pages(), just like for regular migration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hXAfter that, the callers must call migrate_vma_pages() to go over each entry in the src array that has the MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set. If the corresponding entry in dst array has MIGRATE_PFN_VALID flag set, then migrate_vma_pages() to migrate struct page information from the source struct page to the destination struct page. If it fails to migrate the struct page information, then it clears the MIGRATE_PFN_MIGRATE flag in the src array.h]hXAfter that, the callers must call migrate_vma_pages() to go over each entry in the src array that has the MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set. If the corresponding entry in dst array has MIGRATE_PFN_VALID flag set, then migrate_vma_pages() to migrate struct page information from the source struct page to the destination struct page. If it fails to migrate the struct page information, then it clears the MIGRATE_PFN_MIGRATE flag in the src array.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hAt this point all successfully migrated pages have an entry in the src array with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set and the dst array entry with MIGRATE_PFN_VALID flag set.h]hAt this point all successfully migrated pages have an entry in the src array with MIGRATE_PFN_VALID and MIGRATE_PFN_MIGRATE flag set and the dst array entry with MIGRATE_PFN_VALID flag set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hOnce migrate_vma_pages() returns the caller may inspect which pages were successfully migrated, and which were not. Successfully migrated pages will have the MIGRATE_PFN_MIGRATE flag set for their src array entry.h]hOnce migrate_vma_pages() returns the caller may inspect which pages were successfully migrated, and which were not. Successfully migrated pages will have the MIGRATE_PFN_MIGRATE flag set for their src array entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hIt is safe to update device page table after migrate_vma_pages() because both destination and source page are still locked, and the mmap_lock is held in read mode (hence no one can unmap the range being migrated).h]hIt is safe to update device page table after migrate_vma_pages() because both destination and source page are still locked, and the mmap_lock is held in read mode (hence no one can unmap the range being migrated).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(hXBOnce the caller is done cleaning up things and updating its page table (if it chose to do so, this is not an obligation) it finally calls migrate_vma_finalize() to update the CPU page table to point to new pages for successfully migrated pages or otherwise restore the CPU page table to point to the original source pages.h]hXBOnce the caller is done cleaning up things and updating its page table (if it chose to do so, this is not an obligation) it finally calls migrate_vma_finalize() to update the CPU page table to point to new pages for successfully migrated pages or otherwise restore the CPU page table to point to the original source pages.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h-migrate_vma_insert_huge_pmd_page (C function)"c.migrate_vma_insert_huge_pmd_pagehNtauh1hhjhhhNhNubh)}(hhh](h)}(hint migrate_vma_insert_huge_pmd_page (struct migrate_vma *migrate, unsigned long addr, struct page *page, unsigned long *src, pmd_t *pmdp)h]h)}(hint migrate_vma_insert_huge_pmd_page(struct migrate_vma *migrate, unsigned long addr, struct page *page, unsigned long *src, pmd_t *pmdp)h](j)}(hinth]hint}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5hhhjGhMubh)}(h migrate_vma_insert_huge_pmd_pageh]j)}(h migrate_vma_insert_huge_pmd_pageh]h migrate_vma_insert_huge_pmd_page}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](jjeh"]h$]h&]jjuh1hhj5hhhjGhMubj )}(he(struct migrate_vma *migrate, unsigned long addr, struct page *page, unsigned long *src, pmd_t *pmdp)h](j )}(hstruct migrate_vma *migrateh](j5)}(hj8h]hstruct}(hjvhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubh)}(hhh]j)}(h migrate_vmah]h migrate_vma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj\sb"c.migrate_vma_insert_huge_pmd_pageasbuh1hhjrubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjrubj)}(hmigrateh]hmigrate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(hunsigned long addrh](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)}(haddrh]haddr}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj9hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj5ubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubh)}(hhh]j)}(hpageh]hpage}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjYmodnameN classnameNjpjs)}jv]j"c.migrate_vma_insert_huge_pmd_pageasbuh1hhj5ubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj5ubj)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(hunsigned long *srch](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&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubj )}(h pmd_t *pmdph](h)}(hhh]j)}(hpmd_th]hpmd_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]j"c.migrate_vma_insert_huge_pmd_pageasbuh1hhjubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj6hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpmdph]hpmdp}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjnubeh}(h]h ]h"]h$]h&]jjuh1j hj5hhhjGhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj1hhhjGhMubah}(h]j,ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjGhMhj.hhubj4)}(hhh]jM)}(hInsert a huge folio into **migrate->vma->vm_mm** at **addr**. folio is already allocated as a part of the migration process with large page.h](hInsert a huge folio into }(hjmhhhNhNubj)}(h**migrate->vma->vm_mm**h]hmigrate->vma->vm_mm}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh at }(hjmhhhNhNubj)}(h**addr**h]haddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubhP. folio is already allocated as a part of the migration process with large page.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjjhhubah}(h]h ]h"]h$]h&]uh1j3hj.hhhjGhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct migrate_vma *migrate`` migrate_vma arguments ``unsigned long addr`` address where the folio will be inserted ``struct page *page`` page to be inserted at **addr** ``unsigned long *src`` src pfn which is being migrated ``pmd_t *pmdp`` pointer to the pmd **Description** **page** needs to be initialized and setup after it's allocated. The code bits here follow closely the code in __do_huge_pmd_anonymous_page(). This API does not support THP zero pages.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh](j)}(h6``struct migrate_vma *migrate`` migrate_vma arguments h](j)}(h``struct migrate_vma *migrate``h]jS)}(hjh]hstruct migrate_vma *migrate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh]jM)}(hmigrate_vma argumentsh]hmigrate_vma arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h@``unsigned long addr`` address where the folio will be inserted h](j)}(h``unsigned long addr``h]jS)}(hj h]hunsigned long addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh]jM)}(h(address where the folio will be insertedh]h(address where the folio will be inserted}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMhj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(h6``struct page *page`` page to be inserted at **addr** h](j)}(h``struct page *page``h]jS)}(hjDh]hstruct page *page}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjBubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj>ubj)}(hhh]jM)}(hpage to be inserted at **addr**h](hpage to be inserted at }(hj]hhhNhNubj)}(h**addr**h]haddr}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jLhjYhMhjZubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhjYhMhjubj)}(h7``unsigned long *src`` src pfn which is being migrated h](j)}(h``unsigned long *src``h]jS)}(hjh]hunsigned long *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh]jM)}(hsrc pfn which is being migratedh]hsrc pfn which is being migrated}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h#``pmd_t *pmdp`` pointer to the pmd h](j)}(h``pmd_t *pmdp``h]jS)}(hjh]h pmd_t *pmdp}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubj)}(hhh]jM)}(hpointer to the pmdh]hpointer to the pmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubjM)}(h**page** needs to be initialized and setup after it's allocated. The code bits here follow closely the code in __do_huge_pmd_anonymous_page(). This API does not support THP zero pages.h](j)}(h**page**h]hpage}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh needs to be initialized and setup after it’s allocated. The code bits here follow closely the code in __do_huge_pmd_anonymous_page(). This API does not support THP zero pages.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!migrate_device_pages (C function)c.migrate_device_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hbvoid migrate_device_pages (unsigned long *src_pfns, unsigned long *dst_pfns, unsigned long npages)h]h)}(havoid migrate_device_pages(unsigned long *src_pfns, unsigned long *dst_pfns, unsigned long npages)h](j)}(hvoidh]hvoid}(hjR hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMubj)}(h h]h }(hja hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN hhhj` hMubh)}(hmigrate_device_pagesh]j)}(hmigrate_device_pagesh]hmigrate_device_pages}(hjs hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjN hhhj` hMubj )}(hH(unsigned long *src_pfns, unsigned long *dst_pfns, unsigned long npages)h](j )}(hunsigned long *src_pfnsh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hsrc_pfnsh]hsrc_pfns}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long *dst_pfnsh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hlongh]hlong}(hj !hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj%!hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(hdst_pfnsh]hdst_pfns}(hj2!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned long npagesh](j)}(hunsignedh]hunsigned}(hjK!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG!ubj)}(h h]h }(hjY!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG!ubj)}(hlongh]hlong}(hjg!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG!ubj)}(h h]h }(hju!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG!ubj)}(hnpagesh]hnpages}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjN hhhj` hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjJ hhhj` hMubah}(h]jE ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj` hMhjG hhubj4)}(hhh]jM)}(h+migrate meta-data from src page to dst pageh]h+migrate meta-data from src page to dst page}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj!hhubah}(h]h ]h"]h$]h&]uh1j3hjG hhhj` hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!jHj!jIjJjKuh1hhhhjhNhNubj)}(hX{**Parameters** ``unsigned long *src_pfns`` src_pfns returned from migrate_device_range() ``unsigned long *dst_pfns`` array of pfns allocated by the driver to migrate memory to ``unsigned long npages`` number of pages in the range **Description** Equivalent to migrate_vma_pages(). This is called to migrate struct page meta-data from source struct page to destination.h](jM)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj!ubj)}(hhh](j)}(hJ``unsigned long *src_pfns`` src_pfns returned from migrate_device_range() h](j)}(h``unsigned long *src_pfns``h]jS)}(hj!h]hunsigned long *src_pfns}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj!ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj!ubj)}(hhh]jM)}(h-src_pfns returned from migrate_device_range()h]h-src_pfns returned from migrate_device_range()}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj"hMhj!ubj)}(hW``unsigned long *dst_pfns`` array of pfns allocated by the driver to migrate memory to h](j)}(h``unsigned long *dst_pfns``h]jS)}(hj'"h]hunsigned long *dst_pfns}(hj)"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%"ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj!"ubj)}(hhh]jM)}(h:array of pfns allocated by the driver to migrate memory toh]h:array of pfns allocated by the driver to migrate memory to}(hj@"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<"hMhj="ubah}(h]h ]h"]h$]h&]uh1jhj!"ubeh}(h]h ]h"]h$]h&]uh1jhj<"hMhj!ubj)}(h6``unsigned long npages`` number of pages in the range h](j)}(h``unsigned long npages``h]jS)}(hj`"h]hunsigned long npages}(hjb"hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj^"ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhjZ"ubj)}(hhh]jM)}(hnumber of pages in the rangeh]hnumber of pages in the range}(hjy"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhju"hMhjv"ubah}(h]h ]h"]h$]h&]uh1jhjZ"ubeh}(h]h ]h"]h$]h&]uh1jhju"hMhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!ubjM)}(h**Description**h]j)}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj!ubjM)}(hzEquivalent to migrate_vma_pages(). This is called to migrate struct page meta-data from source struct page to destination.h]hzEquivalent to migrate_vma_pages(). This is called to migrate struct page meta-data from source struct page to destination.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmigrate_vma_pages (C function)c.migrate_vma_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(h4void migrate_vma_pages (struct migrate_vma *migrate)h]h)}(h3void migrate_vma_pages(struct migrate_vma *migrate)h](j)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj"hMubh)}(hmigrate_vma_pagesh]j)}(hmigrate_vma_pagesh]hmigrate_vma_pages}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj"hhhj"hMubj )}(h(struct migrate_vma *migrate)h]j )}(hstruct migrate_vma *migrateh](j5)}(hj8h]hstruct}(hj#hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj*#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(h migrate_vmah]h migrate_vma}(hj;#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8#ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=#modnameN classnameNjpjs)}jv]jy)}jlj#sbc.migrate_vma_pagesasbuh1hhj#ubj)}(h h]h }(hj[#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hji#hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hmigrateh]hmigrate}(hjv#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj#ubah}(h]h ]h"]h$]h&]jjuh1j hj"hhhj"hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj"hhhj"hMubah}(h]j"ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj"hMhj"hhubj4)}(hhh]jM)}(h+migrate meta-data from src page to dst pageh]h+migrate meta-data from src page to dst page}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj#hhubah}(h]h ]h"]h$]h&]uh1j3hj"hhhj"hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj#jHj#jIjJjKuh1hhhhjhNhNubj)}(hX!**Parameters** ``struct migrate_vma *migrate`` migrate struct containing all migration information **Description** This migrates struct page meta-data from source struct page to destination struct page. This effectively finishes the migration from source page to the destination page.h](jM)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj#ubj)}(hhh]j)}(hT``struct migrate_vma *migrate`` migrate struct containing all migration information h](j)}(h``struct migrate_vma *migrate``h]jS)}(hj#h]hstruct migrate_vma *migrate}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj#ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj#ubj)}(hhh]jM)}(h3migrate struct containing all migration informationh]h3migrate struct containing all migration information}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubjM)}(h**Description**h]j)}(hj$h]h Description}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj#ubjM)}(hThis migrates struct page meta-data from source struct page to destination struct page. This effectively finishes the migration from source page to the destination page.h]hThis migrates struct page meta-data from source struct page to destination struct page. This effectively finishes the migration from source page to the destination page.}(hj2$hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!migrate_vma_finalize (C function)c.migrate_vma_finalizehNtauh1hhjhhhNhNubh)}(hhh](h)}(h7void migrate_vma_finalize (struct migrate_vma *migrate)h]h)}(h6void migrate_vma_finalize(struct migrate_vma *migrate)h](j)}(hvoidh]hvoid}(hja$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]$hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMRubj)}(h h]h }(hjp$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]$hhhjo$hMRubh)}(hmigrate_vma_finalizeh]j)}(hmigrate_vma_finalizeh]hmigrate_vma_finalize}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~$ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj]$hhhjo$hMRubj )}(h(struct migrate_vma *migrate)h]j )}(hstruct migrate_vma *migrateh](j5)}(hj8h]hstruct}(hj$hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubh)}(hhh]j)}(h migrate_vmah]h migrate_vma}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj$modnameN classnameNjpjs)}jv]jy)}jlj$sbc.migrate_vma_finalizeasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubjF )}(hjI h]h*}(hj$hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj$ubj)}(hmigrateh]hmigrate}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubah}(h]h ]h"]h$]h&]jjuh1j hj]$hhhjo$hMRubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjY$hhhjo$hMRubah}(h]jT$ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjo$hMRhjV$hhubj4)}(hhh]jM)}(hrestore CPU page table entryh]hrestore CPU page table entry}(hj!%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMRhj%hhubah}(h]h ]h"]h$]h&]uh1j3hjV$hhhjo$hMRubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj9%jHj9%jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct migrate_vma *migrate`` migrate struct containing all migration information **Description** This replaces the special migration pte entry with either a mapping to the new page if migration was successful for that page, or to the original page otherwise. This also unlocks the pages and puts them back on the lru, or drops the extra refcount, for device pages.h](jM)}(h**Parameters**h]j)}(hjC%h]h Parameters}(hjE%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA%ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMVhj=%ubj)}(hhh]j)}(hT``struct migrate_vma *migrate`` migrate struct containing all migration information h](j)}(h``struct migrate_vma *migrate``h]jS)}(hjb%h]hstruct migrate_vma *migrate}(hjd%hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`%ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMShj\%ubj)}(hhh]jM)}(h3migrate struct containing all migration informationh]h3migrate struct containing all migration information}(hj{%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjw%hMShjx%ubah}(h]h ]h"]h$]h&]uh1jhj\%ubeh}(h]h ]h"]h$]h&]uh1jhjw%hMShjY%ubah}(h]h ]h"]h$]h&]uh1jhj=%ubjM)}(h**Description**h]j)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMUhj=%ubjM)}(hThis replaces the special migration pte entry with either a mapping to the new page if migration was successful for that page, or to the original page otherwise.h]hThis replaces the special migration pte entry with either a mapping to the new page if migration was successful for that page, or to the original page otherwise.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMThj=%ubjM)}(hiThis also unlocks the pages and puts them back on the lru, or drops the extra refcount, for device pages.h]hiThis also unlocks the pages and puts them back on the lru, or drops the extra refcount, for device pages.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMXhj=%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!migrate_device_range (C function)c.migrate_device_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(h]int migrate_device_range (unsigned long *src_pfns, unsigned long start, unsigned long npages)h]h)}(h\int migrate_device_range(unsigned long *src_pfns, unsigned long start, unsigned long npages)h](j)}(hinth]hint}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMtubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%hhhj%hMtubh)}(hmigrate_device_rangeh]j)}(hmigrate_device_rangeh]hmigrate_device_range}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj%hhhj%hMtubj )}(hD(unsigned long *src_pfns, unsigned long start, unsigned long npages)h](j )}(hunsigned long *src_pfnsh](j)}(hunsignedh]hunsigned}(hj.&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*&ubj)}(h h]h }(hj<&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*&ubj)}(hlongh]hlong}(hjJ&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*&ubj)}(h h]h }(hjX&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*&ubjF )}(hjI h]h*}(hjf&hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj*&ubj)}(hsrc_pfnsh]hsrc_pfns}(hjs&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&&ubj )}(hunsigned long starth](j)}(hunsignedh]hunsigned}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hlongh]hlong}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hstarth]hstart}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&&ubj )}(hunsigned long npagesh](j)}(hunsignedh]hunsigned}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hlongh]hlong}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hnpagesh]hnpages}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj&&ubeh}(h]h ]h"]h$]h&]jjuh1j hj%hhhj%hMtubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj%hhhj%hMtubah}(h]j%ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj%hMthj%hhubj4)}(hhh]jM)}(h-migrate device private pfns to normal memory.h]h-migrate device private pfns to normal memory.}(hj?'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMthj<'hhubah}(h]h ]h"]h$]h&]uh1j3hj%hhhj%hMtubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjW'jHjW'jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long *src_pfns`` array large enough to hold migrating source device private pfns. ``unsigned long start`` starting pfn in the range to migrate. ``unsigned long npages`` number of pages to migrate. **Description** migrate_vma_setup() is similar in concept to migrate_vma_setup() except that instead of looking up pages based on virtual address mappings a range of device pfns that should be migrated to system memory is used instead. This is useful when a driver needs to free device memory but doesn't know the virtual mappings of every page that may be in device memory. For example this is often the case when a driver is being unloaded or unbound from a device. Like migrate_vma_setup() this function will take a reference and lock any migrating pages that aren't free before unmapping them. Drivers may then allocate destination pages and start copying data from the device to CPU memory before calling migrate_device_pages().h](jM)}(h**Parameters**h]j)}(hja'h]h Parameters}(hjc'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_'ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMxhj['ubj)}(hhh](j)}(h]``unsigned long *src_pfns`` array large enough to hold migrating source device private pfns. h](j)}(h``unsigned long *src_pfns``h]jS)}(hj'h]hunsigned long *src_pfns}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj~'ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMuhjz'ubj)}(hhh]jM)}(h@array large enough to hold migrating source device private pfns.h]h@array large enough to hold migrating source device private pfns.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'hMuhj'ubah}(h]h ]h"]h$]h&]uh1jhjz'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMuhjw'ubj)}(h>``unsigned long start`` starting pfn in the range to migrate. h](j)}(h``unsigned long start``h]jS)}(hj'h]hunsigned long start}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj'ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMvhj'ubj)}(hhh]jM)}(h%starting pfn in the range to migrate.h]h%starting pfn in the range to migrate.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'hMvhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hMvhjw'ubj)}(h5``unsigned long npages`` number of pages to migrate. h](j)}(h``unsigned long npages``h]jS)}(hj'h]hunsigned long npages}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj'ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMwhj'ubj)}(hhh]jM)}(hnumber of pages to migrate.h]hnumber of pages to migrate.}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(hMwhj(ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj(hMwhjw'ubeh}(h]h ]h"]h$]h&]uh1jhj['ubjM)}(h**Description**h]j)}(hj-(h]h Description}(hj/(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+(ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMyhj['ubjM)}(hmigrate_vma_setup() is similar in concept to migrate_vma_setup() except that instead of looking up pages based on virtual address mappings a range of device pfns that should be migrated to system memory is used instead.h]hmigrate_vma_setup() is similar in concept to migrate_vma_setup() except that instead of looking up pages based on virtual address mappings a range of device pfns that should be migrated to system memory is used instead.}(hjC(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMxhj['ubjM)}(hThis is useful when a driver needs to free device memory but doesn't know the virtual mappings of every page that may be in device memory. For example this is often the case when a driver is being unloaded or unbound from a device.h]hThis is useful when a driver needs to free device memory but doesn’t know the virtual mappings of every page that may be in device memory. For example this is often the case when a driver is being unloaded or unbound from a device.}(hjR(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chM|hj['ubjM)}(hX Like migrate_vma_setup() this function will take a reference and lock any migrating pages that aren't free before unmapping them. Drivers may then allocate destination pages and start copying data from the device to CPU memory before calling migrate_device_pages().h]hX Like migrate_vma_setup() this function will take a reference and lock any migrating pages that aren’t free before unmapping them. Drivers may then allocate destination pages and start copying data from the device to CPU memory before calling migrate_device_pages().}(hja(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj['ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h migrate_device_pfns (C function)c.migrate_device_pfnshNtauh1hhjhhhNhNubh)}(hhh](h)}(hGint migrate_device_pfns (unsigned long *src_pfns, unsigned long npages)h]h)}(hFint migrate_device_pfns(unsigned long *src_pfns, unsigned long npages)h](j)}(hinth]hint}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(hhhj(hMubh)}(hmigrate_device_pfnsh]j)}(hmigrate_device_pfnsh]hmigrate_device_pfns}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj(hhhj(hMubj )}(h/(unsigned long *src_pfns, unsigned long npages)h](j )}(hunsigned long *src_pfnsh](j)}(hunsignedh]hunsigned}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hlongh]hlong}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF )}(hjI h]h*}(hj)hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(ubj)}(hsrc_pfnsh]hsrc_pfns}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj(ubj )}(hunsigned long npagesh](j)}(hunsignedh]hunsigned}(hj+)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj')ubj)}(h h]h }(hj9)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj')ubj)}(hlongh]hlong}(hjG)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj')ubj)}(h h]h }(hjU)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj')ubj)}(hnpagesh]hnpages}(hjc)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj')ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj(ubeh}(h]h ]h"]h$]h&]jjuh1j hj(hhhj(hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj(hhhj(hMubah}(h]j(ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj(hMhj(hhubj4)}(hhh]jM)}(h-migrate device private pfns to normal memory.h]h-migrate device private pfns to normal memory.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj)hhubah}(h]h ]h"]h$]h&]uh1j3hj(hhhj(hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj)jHj)jIjJjKuh1hhhhjhNhNubj)}(hX#**Parameters** ``unsigned long *src_pfns`` pre-populated array of source device private pfns to migrate. ``unsigned long npages`` number of pages to migrate. **Description** Similar to migrate_device_range() but supports non-contiguous pre-populated array of device pages to migrate.h](jM)}(h**Parameters**h]j)}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj)ubj)}(hhh](j)}(hZ``unsigned long *src_pfns`` pre-populated array of source device private pfns to migrate. h](j)}(h``unsigned long *src_pfns``h]jS)}(hj)h]hunsigned long *src_pfns}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj)ubj)}(hhh]jM)}(h=pre-populated array of source device private pfns to migrate.h]h=pre-populated array of source device private pfns to migrate.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)hMhj)ubj)}(h5``unsigned long npages`` number of pages to migrate. h](j)}(h``unsigned long npages``h]jS)}(hj*h]hunsigned long npages}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj*ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj*ubj)}(hhh]jM)}(hnumber of pages to migrate.h]hnumber of pages to migrate.}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj)ubeh}(h]h ]h"]h$]h&]uh1jhj)ubjM)}(h**Description**h]j)}(hjB*h]h Description}(hjD*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@*ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj)ubjM)}(hmSimilar to migrate_device_range() but supports non-contiguous pre-populated array of device pages to migrate.h]hmSimilar to migrate_device_range() but supports non-contiguous pre-populated array of device pages to migrate.}(hjX*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:125: ./mm/migrate_device.chMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubjK)}(hA#kernel-doc:: mm/nommu.c (duplicates kernel-doc from other files)h]hA#kernel-doc:: mm/nommu.c (duplicates kernel-doc from other files)}hjn*sbah}(h]h ]h"]h$]h&]jjuh1jJhjhhhhhK~ubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hwp_walk (C struct) c.wp_walkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hwp_walkh]h)}(hstruct wp_walkh](j5)}(hj8h]hstruct}(hj*hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj*hhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*hhhj*hKubh)}(hwp_walkh]j)}(hj*h]hwp_walk}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj*hhhj*hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj*hhhj*hKubah}(h]j*ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj*hKhj*hhubj4)}(hhh]jM)}(h+Private struct for pagetable walk callbacksh]h+Private struct for pagetable walk callbacks}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK hj*hhubah}(h]h ]h"]h$]h&]uh1j3hj*hhhj*hKubeh}(h]h ](jAstructeh"]h$]h&]jFjAjGj*jHj*jIjJjKuh1hhhhjhNhNubj)}(hXw**Definition**:: struct wp_walk { struct mmu_notifier_range range; unsigned long tlbflush_start; unsigned long tlbflush_end; unsigned long total; }; **Members** ``range`` Range for mmu notifiers ``tlbflush_start`` Address of first modified pte ``tlbflush_end`` Address of last modified pte + 1 ``total`` Total number of modified ptesh](jM)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh:}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj*ubj )}(hstruct wp_walk { struct mmu_notifier_range range; unsigned long tlbflush_start; unsigned long tlbflush_end; unsigned long total; };h]hstruct wp_walk { struct mmu_notifier_range range; unsigned long tlbflush_start; unsigned long tlbflush_end; unsigned long total; };}hj+sbah}(h]h ]h"]h$]h&]jjuh1j h[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj*ubjM)}(h **Members**h]j)}(hj%+h]hMembers}(hj'+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#+ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj*ubj)}(hhh](j)}(h"``range`` Range for mmu notifiers h](j)}(h ``range``h]jS)}(hjD+h]hrange}(hjF+hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjB+ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK hj>+ubj)}(hhh]jM)}(hRange for mmu notifiersh]hRange for mmu notifiers}(hj]+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjY+hK hjZ+ubah}(h]h ]h"]h$]h&]uh1jhj>+ubeh}(h]h ]h"]h$]h&]uh1jhjY+hK hj;+ubj)}(h1``tlbflush_start`` Address of first modified pte h](j)}(h``tlbflush_start``h]jS)}(hj}+h]htlbflush_start}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj{+ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhjw+ubj)}(hhh]jM)}(hAddress of first modified pteh]hAddress of first modified pte}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+hKhj+ubah}(h]h ]h"]h$]h&]uh1jhjw+ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj;+ubj)}(h2``tlbflush_end`` Address of last modified pte + 1 h](j)}(h``tlbflush_end``h]jS)}(hj+h]h tlbflush_end}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj+ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj+ubj)}(hhh]jM)}(h Address of last modified pte + 1h]h Address of last modified pte + 1}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+hKhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj;+ubj)}(h'``total`` Total number of modified ptesh](j)}(h ``total``h]jS)}(hj+h]htotal}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj+ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj+ubj)}(hhh]jM)}(hTotal number of modified ptesh]hTotal number of modified ptes}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj,ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj,hKhj;+ubeh}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hwp_pte (C function)c.wp_ptehNtauh1hhjhhhNhNubh)}(hhh](h)}(hTint wp_pte (pte_t *pte, unsigned long addr, unsigned long end, struct mm_walk *walk)h]h)}(hSint wp_pte(pte_t *pte, unsigned long addr, unsigned long end, struct mm_walk *walk)h](j)}(hinth]hint}(hjI,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE,hhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKubj)}(h h]h }(hjX,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE,hhhjW,hKubh)}(hwp_pteh]j)}(hwp_pteh]hwp_pte}(hjj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf,ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjE,hhhjW,hKubj )}(hI(pte_t *pte, unsigned long addr, unsigned long end, struct mm_walk *walk)h](j )}(h pte_t *pteh](h)}(hhh]j)}(hpte_th]hpte_t}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj,modnameN classnameNjpjs)}jv]jy)}jljl,sbc.wp_pteasbuh1hhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubjF )}(hjI h]h*}(hj,hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj,ubj)}(hpteh]hpte}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj~,ubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(hlongh]hlong}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(haddrh]haddr}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj~,ubj )}(hunsigned long endh](j)}(hunsignedh]hunsigned}(hj.-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*-ubj)}(h h]h }(hj<-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*-ubj)}(hlongh]hlong}(hjJ-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*-ubj)}(h h]h }(hjX-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*-ubj)}(hendh]hend}(hjf-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj~,ubj )}(hstruct mm_walk *walkh](j5)}(hj8h]hstruct}(hj-hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj{-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{-ubh)}(hhh]j)}(hmm_walkh]hmm_walk}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj-modnameN classnameNjpjs)}jv]j,c.wp_pteasbuh1hhj{-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{-ubjF )}(hjI h]h*}(hj-hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj{-ubj)}(hwalkh]hwalk}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj~,ubeh}(h]h ]h"]h$]h&]jjuh1j hjE,hhhjW,hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjA,hhhjW,hKubah}(h]j<,ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjW,hKhj>,hhubj4)}(hhh]jM)}(hWrite-protect a pteh]hWrite-protect a pte}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj-hhubah}(h]h ]h"]h$]h&]uh1j3hj>,hhhjW,hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj.jHj.jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``pte_t *pte`` Pointer to the pte ``unsigned long addr`` The start of protecting virtual address ``unsigned long end`` The end of protecting virtual address ``struct mm_walk *walk`` pagetable walk callback argument **Description** The function write-protects a pte and records the range in virtual address space of touched ptes for efficient range TLB flushes.h](jM)}(h**Parameters**h]j)}(hj".h]h Parameters}(hj$.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj .ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj.ubj)}(hhh](j)}(h"``pte_t *pte`` Pointer to the pte h](j)}(h``pte_t *pte``h]jS)}(hjA.h]h pte_t *pte}(hjC.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?.ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj;.ubj)}(hhh]jM)}(hPointer to the pteh]hPointer to the pte}(hjZ.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjV.hKhjW.ubah}(h]h ]h"]h$]h&]uh1jhj;.ubeh}(h]h ]h"]h$]h&]uh1jhjV.hKhj8.ubj)}(h?``unsigned long addr`` The start of protecting virtual address h](j)}(h``unsigned long addr``h]jS)}(hjz.h]hunsigned long addr}(hj|.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjx.ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhjt.ubj)}(hhh]jM)}(h'The start of protecting virtual addressh]h'The start of protecting virtual address}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1jhjt.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj8.ubj)}(h<``unsigned long end`` The end of protecting virtual address h](j)}(h``unsigned long end``h]jS)}(hj.h]hunsigned long end}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj.ubj)}(hhh]jM)}(h%The end of protecting virtual addressh]h%The end of protecting virtual address}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj.hKhj.ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj.hKhj8.ubj)}(h:``struct mm_walk *walk`` pagetable walk callback argument h](j)}(h``struct mm_walk *walk``h]jS)}(hj.h]hstruct mm_walk *walk}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj.ubj)}(hhh]jM)}(h pagetable walk callback argumenth]h pagetable walk callback argument}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hKhj/ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj/hKhj8.ubeh}(h]h ]h"]h$]h&]uh1jhj.ubjM)}(h**Description**h]j)}(hj'/h]h Description}(hj)/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%/ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj.ubjM)}(hThe function write-protects a pte and records the range in virtual address space of touched ptes for efficient range TLB flushes.h]hThe function write-protects a pte and records the range in virtual address space of touched ptes for efficient range TLB flushes.}(hj=/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hclean_walk (C struct) c.clean_walkhNtauh1hhjhhhNhNubh)}(hhh](h)}(h clean_walkh]h)}(hstruct clean_walkh](j5)}(hj8h]hstruct}(hjl/hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjh/hhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK$ubj)}(h h]h }(hjz/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh/hhhjy/hK$ubh)}(h clean_walkh]j)}(hjf/h]h clean_walk}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjh/hhhjy/hK$ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjd/hhhjy/hK$ubah}(h]j_/ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjy/hK$hja/hhubj4)}(hhh]jM)}(h1Private struct for the clean_record_pte function.h]h1Private struct for the clean_record_pte function.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK7hj/hhubah}(h]h ]h"]h$]h&]uh1j3hja/hhhjy/hK$ubeh}(h]h ](jAstructeh"]h$]h&]jFjAjGj/jHj/jIjJjKuh1hhhhjhNhNubj)}(hX>**Definition**:: struct clean_walk { struct wp_walk base; pgoff_t bitmap_pgoff; unsigned long *bitmap; pgoff_t start; pgoff_t end; }; **Members** ``base`` struct wp_walk we derive from ``bitmap_pgoff`` Address_space Page offset of the first bit in **bitmap** ``bitmap`` Bitmap with one bit for each page offset in the address_space range covered. ``start`` Address_space page offset of first modified pte relative to **bitmap_pgoff** ``end`` Address_space page offset of last modified pte relative to **bitmap_pgoff**h](jM)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh:}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK;hj/ubj )}(hstruct clean_walk { struct wp_walk base; pgoff_t bitmap_pgoff; unsigned long *bitmap; pgoff_t start; pgoff_t end; };h]hstruct clean_walk { struct wp_walk base; pgoff_t bitmap_pgoff; unsigned long *bitmap; pgoff_t start; pgoff_t end; };}hj/sbah}(h]h ]h"]h$]h&]jjuh1j h[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK=hj/ubjM)}(h **Members**h]j)}(hj/h]hMembers}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKEhj/ubj)}(hhh](j)}(h'``base`` struct wp_walk we derive from h](j)}(h``base``h]jS)}(hj0h]hbase}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK9hj0ubj)}(hhh]jM)}(hstruct wp_walk we derive fromh]hstruct wp_walk we derive from}(hj40hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj00hK9hj10ubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jhj00hK9hj0ubj)}(hJ``bitmap_pgoff`` Address_space Page offset of the first bit in **bitmap** h](j)}(h``bitmap_pgoff``h]jS)}(hjT0h]h bitmap_pgoff}(hjV0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjR0ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK:hjN0ubj)}(hhh]jM)}(h8Address_space Page offset of the first bit in **bitmap**h](h.Address_space Page offset of the first bit in }(hjm0hhhNhNubj)}(h **bitmap**h]hbitmap}(hju0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm0ubeh}(h]h ]h"]h$]h&]uh1jLhji0hK:hjj0ubah}(h]h ]h"]h$]h&]uh1jhjN0ubeh}(h]h ]h"]h$]h&]uh1jhji0hK:hj0ubj)}(hX``bitmap`` Bitmap with one bit for each page offset in the address_space range covered. h](j)}(h ``bitmap``h]jS)}(hj0h]hbitmap}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj0ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj0ubj)}(hhh]jM)}(hLAddress_space page offset of first modified pte relative to **bitmap_pgoff**h](hhj0ubj)}(hS``end`` Address_space page offset of last modified pte relative to **bitmap_pgoff**h](j)}(h``end``h]jS)}(hj1h]hend}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chK?hj1ubj)}(hhh]jM)}(hKAddress_space page offset of last modified pte relative to **bitmap_pgoff**h](h;Address_space page offset of last modified pte relative to }(hj61hhhNhNubj)}(h**bitmap_pgoff**h]h bitmap_pgoff}(hj>1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj61ubeh}(h]h ]h"]h$]h&]uh1jLhj21hK?hj31ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhj21hK?hj0ubeh}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hclean_record_pte (C function)c.clean_record_ptehNtauh1hhjhhhNhNubh)}(hhh](h)}(h^int clean_record_pte (pte_t *pte, unsigned long addr, unsigned long end, struct mm_walk *walk)h]h)}(h]int clean_record_pte(pte_t *pte, unsigned long addr, unsigned long end, struct mm_walk *walk)h](j)}(hinth]hint}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKLubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhj1hKLubh)}(hclean_record_pteh]j)}(hclean_record_pteh]hclean_record_pte}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj1hhhj1hKLubj )}(hI(pte_t *pte, unsigned long addr, unsigned long end, struct mm_walk *walk)h](j )}(h pte_t *pteh](h)}(hhh]j)}(hpte_th]hpte_t}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1modnameN classnameNjpjs)}jv]jy)}jlj1sbc.clean_record_pteasbuh1hhj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubjF )}(hjI h]h*}(hj1hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj1ubj)}(hpteh]hpte}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(h h]h }(hj&2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hlongh]hlong}(hj42hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(h h]h }(hjB2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(haddrh]haddr}(hjP2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubj )}(hunsigned long endh](j)}(hunsignedh]hunsigned}(hji2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje2ubj)}(h h]h }(hjw2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje2ubj)}(hlongh]hlong}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje2ubj)}(hendh]hend}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhje2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubj )}(hstruct mm_walk *walkh](j5)}(hj8h]hstruct}(hj2hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubh)}(hhh]j)}(hmm_walkh]hmm_walk}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj2modnameN classnameNjpjs)}jv]j1c.clean_record_pteasbuh1hhj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubjF )}(hjI h]h*}(hj3hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj2ubj)}(hwalkh]hwalk}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj1ubeh}(h]h ]h"]h$]h&]jjuh1j hj1hhhj1hKLubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj|1hhhj1hKLubah}(h]jw1ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj1hKLhjy1hhubj4)}(hhh]jM)}(h;Clean a pte and record its address space offset in a bitmaph]h;Clean a pte and record its address space offset in a bitmap}(hj;3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKLhj83hhubah}(h]h ]h"]h$]h&]uh1j3hjy1hhhj1hKLubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjS3jHjS3jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``pte_t *pte`` Pointer to the pte ``unsigned long addr`` The start of virtual address to be clean ``unsigned long end`` The end of virtual address to be clean ``struct mm_walk *walk`` pagetable walk callback argument **Description** The function cleans a pte and records the range in virtual address space of touched ptes for efficient TLB flushes. It also records dirty ptes in a bitmap representing page offsets in the address_space, as well as the first and last of the bits touched.h](jM)}(h**Parameters**h]j)}(hj]3h]h Parameters}(hj_3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[3ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKPhjW3ubj)}(hhh](j)}(h"``pte_t *pte`` Pointer to the pte h](j)}(h``pte_t *pte``h]jS)}(hj|3h]h pte_t *pte}(hj~3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjz3ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKNhjv3ubj)}(hhh]jM)}(hPointer to the pteh]hPointer to the pte}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hKNhj3ubah}(h]h ]h"]h$]h&]uh1jhjv3ubeh}(h]h ]h"]h$]h&]uh1jhj3hKNhjs3ubj)}(h@``unsigned long addr`` The start of virtual address to be clean h](j)}(h``unsigned long addr``h]jS)}(hj3h]hunsigned long addr}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKOhj3ubj)}(hhh]jM)}(h(The start of virtual address to be cleanh]h(The start of virtual address to be clean}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3hKOhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj3hKOhjs3ubj)}(h=``unsigned long end`` The end of virtual address to be clean h](j)}(h``unsigned long end``h]jS)}(hj3h]hunsigned long end}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj3ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKPhj3ubj)}(hhh]jM)}(h&The end of virtual address to be cleanh]h&The end of virtual address to be clean}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj4hKPhj4ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jhj4hKPhjs3ubj)}(h:``struct mm_walk *walk`` pagetable walk callback argument h](j)}(h``struct mm_walk *walk``h]jS)}(hj'4h]hstruct mm_walk *walk}(hj)4hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%4ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKQhj!4ubj)}(hhh]jM)}(h pagetable walk callback argumenth]h pagetable walk callback argument}(hj@4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<4hKQhj=4ubah}(h]h ]h"]h$]h&]uh1jhj!4ubeh}(h]h ]h"]h$]h&]uh1jhj<4hKQhjs3ubeh}(h]h ]h"]h$]h&]uh1jhjW3ubjM)}(h**Description**h]j)}(hjb4h]h Description}(hjd4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`4ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKShjW3ubjM)}(hThe function cleans a pte and records the range in virtual address space of touched ptes for efficient TLB flushes. It also records dirty ptes in a bitmap representing page offsets in the address_space, as well as the first and last of the bits touched.h]hThe function cleans a pte and records the range in virtual address space of touched ptes for efficient TLB flushes. It also records dirty ptes in a bitmap representing page offsets in the address_space, as well as the first and last of the bits touched.}(hjx4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKRhjW3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$wp_shared_mapping_range (C function)c.wp_shared_mapping_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hfunsigned long wp_shared_mapping_range (struct address_space *mapping, pgoff_t first_index, pgoff_t nr)h]h)}(heunsigned long wp_shared_mapping_range(struct address_space *mapping, pgoff_t first_index, pgoff_t nr)h](j)}(hunsignedh]hunsigned}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhj4hKubj)}(hlongh]hlong}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhj4hKubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhj4hKubh)}(hwp_shared_mapping_rangeh]j)}(hwp_shared_mapping_rangeh]hwp_shared_mapping_range}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj4hhhj4hKubj )}(h@(struct address_space *mapping, pgoff_t first_index, pgoff_t nr)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj5hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj4ubj)}(h h]h }(hj 5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj 5modnameN classnameNjpjs)}jv]jy)}jlj4sbc.wp_shared_mapping_rangeasbuh1hhj4ubj)}(h h]h }(hj>5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubjF )}(hjI h]h*}(hjL5hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj4ubj)}(hmappingh]hmapping}(hjY5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj4ubj )}(hpgoff_t first_indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hju5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr5ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjw5modnameN classnameNjpjs)}jv]j:5c.wp_shared_mapping_rangeasbuh1hhjn5ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn5ubj)}(h first_indexh]h first_index}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj4ubj )}(h pgoff_t nrh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj5modnameN classnameNjpjs)}jv]j:5c.wp_shared_mapping_rangeasbuh1hhj5ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hnrh]hnr}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj4ubeh}(h]h ]h"]h$]h&]jjuh1j hj4hhhj4hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj4hhhj4hKubah}(h]j4ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj4hKhj4hhubj4)}(hhh]jM)}(h0Write-protect all ptes in an address space rangeh]h0Write-protect all ptes in an address space range}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj6hhubah}(h]h ]h"]h$]h&]uh1j3hj4hhhj4hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj+6jHj+6jIjJjKuh1hhhhjhNhNubj)}(hXE**Parameters** ``struct address_space *mapping`` The address_space we want to write protect ``pgoff_t first_index`` The first page offset in the range ``pgoff_t nr`` Number of incremental page offsets to cover **Note** This function currently skips transhuge page-table entries, since it's intended for dirty-tracking on the PTE level. It will warn on encountering transhuge write-enabled entries, though, and can easily be extended to handle them as well. **Return** The number of ptes actually write-protected. Note that already write-protected ptes are not counted.h](jM)}(h**Parameters**h]j)}(hj56h]h Parameters}(hj76hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj36ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj/6ubj)}(hhh](j)}(hM``struct address_space *mapping`` The address_space we want to write protect h](j)}(h!``struct address_space *mapping``h]jS)}(hjT6h]hstruct address_space *mapping}(hjV6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjR6ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhjN6ubj)}(hhh]jM)}(h*The address_space we want to write protecth]h*The address_space we want to write protect}(hjm6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhji6hKhjj6ubah}(h]h ]h"]h$]h&]uh1jhjN6ubeh}(h]h ]h"]h$]h&]uh1jhji6hKhjK6ubj)}(h;``pgoff_t first_index`` The first page offset in the range h](j)}(h``pgoff_t first_index``h]jS)}(hj6h]hpgoff_t first_index}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj6ubj)}(hhh]jM)}(h"The first page offset in the rangeh]h"The first page offset in the range}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hKhj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhj6hKhjK6ubj)}(h;``pgoff_t nr`` Number of incremental page offsets to cover h](j)}(h``pgoff_t nr``h]jS)}(hj6h]h pgoff_t nr}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj6ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj6ubj)}(hhh]jM)}(h+Number of incremental page offsets to coverh]h+Number of incremental page offsets to cover}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hKhj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhj6hKhjK6ubeh}(h]h ]h"]h$]h&]uh1jhj/6ubjM)}(h**Note**h]j)}(hj7h]hNote}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj/6ubjM)}(hThis function currently skips transhuge page-table entries, since it's intended for dirty-tracking on the PTE level. It will warn on encountering transhuge write-enabled entries, though, and can easily be extended to handle them as well.h]hThis function currently skips transhuge page-table entries, since it’s intended for dirty-tracking on the PTE level. It will warn on encountering transhuge write-enabled entries, though, and can easily be extended to handle them as well.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chKhj/6ubjM)}(h **Return**h]j)}(hj(7h]hReturn}(hj*7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&7ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj/6ubjM)}(hdThe number of ptes actually write-protected. Note that already write-protected ptes are not counted.h]hdThe number of ptes actually write-protected. Note that already write-protected ptes are not counted.}(hj>7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj/6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h.clean_record_shared_mapping_range (C function)#c.clean_record_shared_mapping_rangehNtauh1hhjhhhNhNubh)}(hhh](h)}(hunsigned long clean_record_shared_mapping_range (struct address_space *mapping, pgoff_t first_index, pgoff_t nr, pgoff_t bitmap_pgoff, unsigned long *bitmap, pgoff_t *start, pgoff_t *end)h]h)}(hunsigned long clean_record_shared_mapping_range(struct address_space *mapping, pgoff_t first_index, pgoff_t nr, pgoff_t bitmap_pgoff, unsigned long *bitmap, pgoff_t *start, pgoff_t *end)h](j)}(hunsignedh]hunsigned}(hjm7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji7hhh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMubj)}(h h]h }(hj|7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji7hhhj{7hMubj)}(hlongh]hlong}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji7hhhj{7hMubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji7hhhj{7hMubh)}(h!clean_record_shared_mapping_rangeh]j)}(h!clean_record_shared_mapping_rangeh]h!clean_record_shared_mapping_range}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ](jjeh"]h$]h&]jjuh1hhji7hhhj{7hMubj )}(h(struct address_space *mapping, pgoff_t first_index, pgoff_t nr, pgoff_t bitmap_pgoff, unsigned long *bitmap, pgoff_t *start, pgoff_t *end)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hj7hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubh)}(hhh]j)}(h address_spaceh]h address_space}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7modnameN classnameNjpjs)}jv]jy)}jlj7sb#c.clean_record_shared_mapping_rangeasbuh1hhj7ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubjF )}(hjI h]h*}(hj8hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj7ubj)}(hmappingh]hmapping}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubj )}(hpgoff_t first_indexh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj;8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj88ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=8modnameN classnameNjpjs)}jv]j8#c.clean_record_shared_mapping_rangeasbuh1hhj48ubj)}(h h]h }(hjY8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj48ubj)}(h first_indexh]h first_index}(hjg8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj48ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubj )}(h pgoff_t nrh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]j8#c.clean_record_shared_mapping_rangeasbuh1hhj|8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|8ubj)}(hnrh]hnr}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubj )}(hpgoff_t bitmap_pgoffh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj8modnameN classnameNjpjs)}jv]j8#c.clean_record_shared_mapping_rangeasbuh1hhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(h bitmap_pgoffh]h bitmap_pgoff}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubj )}(hunsigned long *bitmaph](j)}(hunsignedh]hunsigned}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubj)}(hlongh]hlong}(hj,9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubj)}(h h]h }(hj:9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubjF )}(hjI h]h*}(hjH9hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj 9ubj)}(hbitmaph]hbitmap}(hjU9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubj )}(hpgoff_t *starth](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hjq9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjs9modnameN classnameNjpjs)}jv]j8#c.clean_record_shared_mapping_rangeasbuh1hhjj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj9ubjF )}(hjI h]h*}(hj9hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjj9ubj)}(hstarth]hstart}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubj )}(h pgoff_t *endh](h)}(hhh]j)}(hpgoff_th]hpgoff_t}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]j8#c.clean_record_shared_mapping_rangeasbuh1hhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubjF )}(hjI h]h*}(hj9hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj9ubj)}(hendh]hend}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj7ubeh}(h]h ]h"]h$]h&]jjuh1j hji7hhhj{7hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hje7hhhj{7hMubah}(h]j`7ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj{7hMhjb7hhubj4)}(hhh]jM)}(h3Clean and record all ptes in an address space rangeh]h3Clean and record all ptes in an address space range}(hj):hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj&:hhubah}(h]h ]h"]h$]h&]uh1j3hjb7hhhj{7hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjA:jHjA:jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` The address_space we want to clean ``pgoff_t first_index`` The first page offset in the range ``pgoff_t nr`` Number of incremental page offsets to cover ``pgoff_t bitmap_pgoff`` The page offset of the first bit in **bitmap** ``unsigned long *bitmap`` Pointer to a bitmap of at least **nr** bits. The bitmap needs to cover the whole range **first_index**..**first_index** + **nr**. ``pgoff_t *start`` Pointer to number of the first set bit in **bitmap**. is modified as new bits are set by the function. ``pgoff_t *end`` Pointer to the number of the last set bit in **bitmap**. none set. The value is modified as new bits are set by the function. **Description** When this function returns there is no guarantee that a CPU has not already dirtied new ptes. However it will not clean any ptes not reported in the bitmap. The guarantees are as follows: * All ptes dirty when the function starts executing will end up recorded in the bitmap. * All ptes dirtied after that will either remain dirty, be recorded in the bitmap or both. If a caller needs to make sure all dirty ptes are picked up and none additional are added, it first needs to write-protect the address-space range and make sure new writers are blocked in page_mkwrite() or pfn_mkwrite(). And then after a TLB flush following the write-protection pick up all dirty bits. This function currently skips transhuge page-table entries, since it's intended for dirty-tracking on the PTE level. It will warn on encountering transhuge dirty entries, though, and can easily be extended to handle them as well. **Return** The number of dirty ptes actually cleaned.h](jM)}(h**Parameters**h]j)}(hjK:h]h Parameters}(hjM:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI:ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhjE:ubj)}(hhh](j)}(hE``struct address_space *mapping`` The address_space we want to clean h](j)}(h!``struct address_space *mapping``h]jS)}(hjj:h]hstruct address_space *mapping}(hjl:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjh:ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhjd:ubj)}(hhh]jM)}(h"The address_space we want to cleanh]h"The address_space we want to clean}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhjd:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhja:ubj)}(h;``pgoff_t first_index`` The first page offset in the range h](j)}(h``pgoff_t first_index``h]jS)}(hj:h]hpgoff_t first_index}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj:ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj:ubj)}(hhh]jM)}(h"The first page offset in the rangeh]h"The first page offset in the range}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhja:ubj)}(h;``pgoff_t nr`` Number of incremental page offsets to cover h](j)}(h``pgoff_t nr``h]jS)}(hj:h]h pgoff_t nr}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj:ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj:ubj)}(hhh]jM)}(h+Number of incremental page offsets to coverh]h+Number of incremental page offsets to cover}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhja:ubj)}(hH``pgoff_t bitmap_pgoff`` The page offset of the first bit in **bitmap** h](j)}(h``pgoff_t bitmap_pgoff``h]jS)}(hj;h]hpgoff_t bitmap_pgoff}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj;ubj)}(hhh]jM)}(h.The page offset of the first bit in **bitmap**h](h$The page offset of the first bit in }(hj.;hhhNhNubj)}(h **bitmap**h]hbitmap}(hj6;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.;ubeh}(h]h ]h"]h$]h&]uh1jLhj*;hMhj+;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj*;hMhja:ubj)}(h``unsigned long *bitmap`` Pointer to a bitmap of at least **nr** bits. The bitmap needs to cover the whole range **first_index**..**first_index** + **nr**. h](j)}(h``unsigned long *bitmap``h]jS)}(hj\;h]hunsigned long *bitmap}(hj^;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZ;ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhjV;ubj)}(hhh]jM)}(hPointer to a bitmap of at least **nr** bits. The bitmap needs to cover the whole range **first_index**..**first_index** + **nr**.h](h Pointer to a bitmap of at least }(hju;hhhNhNubj)}(h**nr**h]hnr}(hj};hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju;ubh1 bits. The bitmap needs to cover the whole range }(hju;hhhNhNubj)}(h**first_index**h]h first_index}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju;ubh..**first_index** + }(hju;hhhNhNubj)}(h**nr**h]hnr}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju;ubh.}(hju;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhjr;ubah}(h]h ]h"]h$]h&]uh1jhjV;ubeh}(h]h ]h"]h$]h&]uh1jhjq;hMhja:ubj)}(hz``pgoff_t *start`` Pointer to number of the first set bit in **bitmap**. is modified as new bits are set by the function. h](j)}(h``pgoff_t *start``h]jS)}(hj;h]hpgoff_t *start}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj;ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj;ubj)}(hhh]jM)}(hfPointer to number of the first set bit in **bitmap**. is modified as new bits are set by the function.h](h*Pointer to number of the first set bit in }(hj;hhhNhNubj)}(h **bitmap**h]hbitmap}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh2. is modified as new bits are set by the function.}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chMhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhja:ubj)}(h``pgoff_t *end`` Pointer to the number of the last set bit in **bitmap**. none set. The value is modified as new bits are set by the function. h](j)}(h``pgoff_t *end``h]jS)}(hj<h]h pgoff_t *end}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM!hj<ubj)}(hhh]jM)}(h}Pointer to the number of the last set bit in **bitmap**. none set. The value is modified as new bits are set by the function.h](h-Pointer to the number of the last set bit in }(hj1<hhhNhNubj)}(h **bitmap**h]hbitmap}(hj9<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1<ubhF. none set. The value is modified as new bits are set by the function.}(hj1<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM hj.<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj-<hM!hja:ubeh}(h]h ]h"]h$]h&]uh1jhjE:ubjM)}(h**Description**h]j)}(hjf<h]h Description}(hjh<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd<ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM#hjE:ubjM)}(hWhen this function returns there is no guarantee that a CPU has not already dirtied new ptes. However it will not clean any ptes not reported in the bitmap. The guarantees are as follows:h]hWhen this function returns there is no guarantee that a CPU has not already dirtied new ptes. However it will not clean any ptes not reported in the bitmap. The guarantees are as follows:}(hj|<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM"hjE:ubjaW)}(hhh](j/)}(hUAll ptes dirty when the function starts executing will end up recorded in the bitmap.h]jM)}(hUAll ptes dirty when the function starts executing will end up recorded in the bitmap.h]hUAll ptes dirty when the function starts executing will end up recorded in the bitmap.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM&hj<ubah}(h]h ]h"]h$]h&]uh1j/hj<ubj/)}(hYAll ptes dirtied after that will either remain dirty, be recorded in the bitmap or both. h]jM)}(hXAll ptes dirtied after that will either remain dirty, be recorded in the bitmap or both.h]hXAll ptes dirtied after that will either remain dirty, be recorded in the bitmap or both.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM(hj<ubah}(h]h ]h"]h$]h&]uh1j/hj<ubeh}(h]h ]h"]h$]h&]jWjI uh1j`Whj<hM&hjE:ubjM)}(hX.If a caller needs to make sure all dirty ptes are picked up and none additional are added, it first needs to write-protect the address-space range and make sure new writers are blocked in page_mkwrite() or pfn_mkwrite(). And then after a TLB flush following the write-protection pick up all dirty bits.h]hX.If a caller needs to make sure all dirty ptes are picked up and none additional are added, it first needs to write-protect the address-space range and make sure new writers are blocked in page_mkwrite() or pfn_mkwrite(). And then after a TLB flush following the write-protection pick up all dirty bits.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM+hjE:ubjM)}(hThis function currently skips transhuge page-table entries, since it's intended for dirty-tracking on the PTE level. It will warn on encountering transhuge dirty entries, though, and can easily be extended to handle them as well.h]hThis function currently skips transhuge page-table entries, since it’s intended for dirty-tracking on the PTE level. It will warn on encountering transhuge dirty entries, though, and can easily be extended to handle them as well.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM1hjE:ubjM)}(h **Return**h]j)}(hj<h]hReturn}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM6hjE:ubjM)}(h*The number of dirty ptes actually cleaned.h]h*The number of dirty ptes actually cleaned.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jLh[/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:127: ./mm/mapping_dirty_helpers.chM7hjE:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubjK)}(h2#kernel-doc:: mm/memory-failure.c (build warnings)h]h2#kernel-doc:: mm/memory-failure.c (build warnings)}hj=sbah}(h]h ]h"]h$]h&]jjuh1jJhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_addr_in_chunk (C function)c.pcpu_addr_in_chunkhNtauh1hhjhhhNhNubh)}(hhh](h)}(h>bool pcpu_addr_in_chunk (struct pcpu_chunk *chunk, void *addr)h]h)}(h=bool pcpu_addr_in_chunk(struct pcpu_chunk *chunk, void *addr)h](j)}(hj-h]hbool}(hj9=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5=hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKubj)}(h h]h }(hjG=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5=hhhjF=hKubh)}(hpcpu_addr_in_chunkh]j)}(hpcpu_addr_in_chunkh]hpcpu_addr_in_chunk}(hjY=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU=ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj5=hhhjF=hKubj )}(h&(struct pcpu_chunk *chunk, void *addr)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hju=hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjq=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq=ubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]jy)}jlj[=sbc.pcpu_addr_in_chunkasbuh1hhjq=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq=ubjF )}(hjI h]h*}(hj=hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjq=ubj)}(hchunkh]hchunk}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjm=ubj )}(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=ubjF )}(hjI h]h*}(hj>hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj=ubj)}(haddrh]haddr}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjm=ubeh}(h]h ]h"]h$]h&]jjuh1j hj5=hhhjF=hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj1=hhhjF=hKubah}(h]j,=ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjF=hKhj.=hhubj4)}(hhh]jM)}(h.check if the address is served from this chunkh]h.check if the address is served from this chunk}(hj:>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKhj7>hhubah}(h]h ]h"]h$]h&]uh1j3hj.=hhhjF=hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjR>jHjR>jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct pcpu_chunk *chunk`` chunk of interest ``void *addr`` percpu address **Return** True if the address is served from this chunk.h](jM)}(h**Parameters**h]j)}(hj\>h]h Parameters}(hj^>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ>ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKhjV>ubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hj{>h]hstruct pcpu_chunk *chunk}(hj}>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjy>ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKhju>ubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>hKhj>ubah}(h]h ]h"]h$]h&]uh1jhju>ubeh}(h]h ]h"]h$]h&]uh1jhj>hKhjr>ubj)}(h``void *addr`` percpu address h](j)}(h``void *addr``h]jS)}(hj>h]h void *addr}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKhj>ubj)}(hhh]jM)}(hpercpu addressh]hpercpu address}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>hKhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jhj>hKhjr>ubeh}(h]h ]h"]h$]h&]uh1jhjV>ubjM)}(h **Return**h]j)}(hj>h]hReturn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKhjV>ubjM)}(h.True if the address is served from this chunk.h]h.True if the address is served from this chunk.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chKhjV>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"pcpu_check_block_hint (C function)c.pcpu_check_block_hinthNtauh1hhjhhhNhNubh)}(hhh](h)}(hPbool pcpu_check_block_hint (struct pcpu_block_md *block, int bits, size_t align)h]h)}(hObool pcpu_check_block_hint(struct pcpu_block_md *block, int bits, size_t align)h](j)}(hj-h]hbool}(hj4?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0?hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM4ubj)}(h h]h }(hjB?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0?hhhjA?hM4ubh)}(hpcpu_check_block_hinth]j)}(hpcpu_check_block_hinth]hpcpu_check_block_hint}(hjT?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj0?hhhjA?hM4ubj )}(h5(struct pcpu_block_md *block, int bits, size_t align)h](j )}(hstruct pcpu_block_md *blockh](j5)}(hj8h]hstruct}(hjp?hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjl?ubj)}(h h]h }(hj}?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl?ubh)}(hhh]j)}(h pcpu_block_mdh]h pcpu_block_md}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj?modnameN classnameNjpjs)}jv]jy)}jljV?sbc.pcpu_check_block_hintasbuh1hhjl?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl?ubjF )}(hjI h]h*}(hj?hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjl?ubj)}(hblockh]hblock}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjh?ubj )}(hint bitsh](j)}(hinth]hint}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj)}(hbitsh]hbits}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjh?ubj )}(h size_t alignh](h)}(hhh]j)}(hsize_th]hsize_t}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@modnameN classnameNjpjs)}jv]j?c.pcpu_check_block_hintasbuh1hhj@ubj)}(h h]h }(hj8@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(halignh]halign}(hjF@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjh?ubeh}(h]h ]h"]h$]h&]jjuh1j hj0?hhhjA?hM4ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj,?hhhjA?hM4ubah}(h]j'?ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjA?hM4hj)?hhubj4)}(hhh]jM)}(hcheck against the contig hinth]hcheck against the contig hint}(hjp@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM4hjm@hhubah}(h]h ]h"]h$]h&]uh1j3hj)?hhhjA?hM4ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj@jHj@jIjJjKuh1hhhhjhNhNubj)}(hXV**Parameters** ``struct pcpu_block_md *block`` block of interest ``int bits`` size of allocation ``size_t align`` alignment of area (max PAGE_SIZE) **Description** Check to see if the allocation can fit in the block's contig hint. Note, a chunk uses the same hints as a block so this can also check against the chunk's contig hint.h](jM)}(h**Parameters**h]j)}(hj@h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM8hj@ubj)}(hhh](j)}(h2``struct pcpu_block_md *block`` block of interest h](j)}(h``struct pcpu_block_md *block``h]jS)}(hj@h]hstruct pcpu_block_md *block}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM5hj@ubj)}(hhh]jM)}(hblock of interesth]hblock of interest}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hM5hj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM5hj@ubj)}(h ``int bits`` size of allocation h](j)}(h ``int bits``h]jS)}(hj@h]hint bits}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM6hj@ubj)}(hhh]jM)}(hsize of allocationh]hsize of allocation}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hM6hjAubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM6hj@ubj)}(h3``size_t align`` alignment of area (max PAGE_SIZE) h](j)}(h``size_t align``h]jS)}(hj#Ah]h size_t align}(hj%AhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj!Aubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM7hjAubj)}(hhh]jM)}(h!alignment of area (max PAGE_SIZE)h]h!alignment of area (max PAGE_SIZE)}(hjcontig_hint and performs aggregation across blocks to find the next hint. It modifies bit_off and bits in-place to be consumed in the loop.h](jM)}(h**Parameters**h]j)}(hj Ch]h Parameters}(hj ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMghjCubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hj(Ch]hstruct pcpu_chunk *chunk}(hj*ChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj&Cubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMdhj"Cubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hjAChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj=ChMdhj>Cubah}(h]h ]h"]h$]h&]uh1jhj"Cubeh}(h]h ]h"]h$]h&]uh1jhj=ChMdhjCubj)}(h``int *bit_off`` chunk offset h](j)}(h``int *bit_off``h]jS)}(hjaCh]h int *bit_off}(hjcChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_Cubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMehj[Cubj)}(hhh]jM)}(h chunk offseth]h chunk offset}(hjzChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjvChMehjwCubah}(h]h ]h"]h$]h&]uh1jhj[Cubeh}(h]h ]h"]h$]h&]uh1jhjvChMehjCubj)}(h ``int *bits`` size of free area h](j)}(h ``int *bits``h]jS)}(hjCh]h int *bits}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMfhjCubj)}(hhh]jM)}(hsize of free areah]hsize of free area}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjChMfhjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhjChMfhjCubeh}(h]h ]h"]h$]h&]uh1jhjCubjM)}(h**Description**h]j)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhhjCubjM)}(hHelper function for pcpu_for_each_md_free_region. It checks block->contig_hint and performs aggregation across blocks to find the next hint. It modifies bit_off and bits in-place to be consumed in the loop.h]hHelper function for pcpu_for_each_md_free_region. It checks block->contig_hint and performs aggregation across blocks to find the next hint. It modifies bit_off and bits in-place to be consumed in the loop.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMghjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!pcpu_next_fit_region (C function)c.pcpu_next_fit_regionhNtauh1hhjhhhNhNubh)}(hhh](h)}(hhvoid pcpu_next_fit_region (struct pcpu_chunk *chunk, int alloc_bits, int align, int *bit_off, int *bits)h]h)}(hgvoid pcpu_next_fit_region(struct pcpu_chunk *chunk, int alloc_bits, int align, int *bit_off, int *bits)h](j)}(hvoidh]hvoid}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hj)DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhj(DhMubh)}(hpcpu_next_fit_regionh]j)}(hpcpu_next_fit_regionh]hpcpu_next_fit_region}(hj;DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7Dubah}(h]h ](jjeh"]h$]h&]jjuh1hhjDhhhj(DhMubj )}(hN(struct pcpu_chunk *chunk, int alloc_bits, int align, int *bit_off, int *bits)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hjWDhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjSDubj)}(h h]h }(hjdDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSDubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjuDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrDubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjwDmodnameN classnameNjpjs)}jv]jy)}jlj=Dsbc.pcpu_next_fit_regionasbuh1hhjSDubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSDubjF )}(hjI h]h*}(hjDhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjSDubj)}(hchunkh]hchunk}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjSDubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjODubj )}(hint alloc_bitsh](j)}(hinth]hint}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(h alloc_bitsh]h alloc_bits}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjODubj )}(h int alignh](j)}(hinth]hint}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(h h]h }(hj EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubj)}(halignh]halign}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjODubj )}(h int *bit_offh](j)}(hinth]hint}(hj3EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Eubj)}(h h]h }(hjAEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/EubjF )}(hjI h]h*}(hjOEhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj/Eubj)}(hbit_offh]hbit_off}(hj\EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Eubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjODubj )}(h int *bitsh](j)}(hinth]hint}(hjuEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqEubjF )}(hjI h]h*}(hjEhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjqEubj)}(hbitsh]hbits}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqEubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjODubeh}(h]h ]h"]h$]h&]jjuh1j hjDhhhj(DhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjDhhhj(DhMubah}(h]j Dah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj(DhMhjDhhubj4)}(hhh]jM)}(h.finds fit areas for a given allocation requesth]h.finds fit areas for a given allocation request}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjEhhubah}(h]h ]h"]h$]h&]uh1j3hjDhhhj(DhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjEjHjEjIjJjKuh1hhhhjhNhNubj)}(hX!**Parameters** ``struct pcpu_chunk *chunk`` chunk of interest ``int alloc_bits`` size of allocation ``int align`` alignment of area (max PAGE_SIZE) ``int *bit_off`` chunk offset ``int *bits`` size of free area **Description** Finds the next free region that is viable for use with a given size and alignment. This only returns if there is a valid area to be used for this allocation. block->first_free is returned if the allocation request fits within the block to see if the request can be fulfilled prior to the contig hint.h](jM)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjEubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hj Fh]hstruct pcpu_chunk *chunk}(hj FhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjFubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjFubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hj"FhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjFhMhjFubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjFhMhjFubj)}(h&``int alloc_bits`` size of allocation h](j)}(h``int alloc_bits``h]jS)}(hjBFh]hint alloc_bits}(hjDFhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj@Fubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjfirst_free is returned if the allocation request fits within the block to see if the request can be fulfilled prior to the contig hint.h]hX.Finds the next free region that is viable for use with a given size and alignment. This only returns if there is a valid area to be used for this allocation. block->first_free is returned if the allocation request fits within the block to see if the request can be fulfilled prior to the contig hint.}(hj>GhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_mem_zalloc (C function)c.pcpu_mem_zallochNtauh1hhjhhhNhNubh)}(hhh](h)}(h/void * pcpu_mem_zalloc (size_t size, gfp_t gfp)h]h)}(h-void *pcpu_mem_zalloc(size_t size, gfp_t gfp)h](j)}(hvoidh]hvoid}(hjmGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiGhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hj|GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiGhhhj{GhMubjF )}(hjI h]h*}(hjGhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjiGhhhj{GhMubh)}(hpcpu_mem_zalloch]j)}(hpcpu_mem_zalloch]hpcpu_mem_zalloc}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1hhjiGhhhj{GhMubj )}(h(size_t size, gfp_t gfp)h](j )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]jy)}jljGsbc.pcpu_mem_zallocasbuh1hhjGubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hsizeh]hsize}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjGubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjHmodnameN classnameNjpjs)}jv]jGc.pcpu_mem_zallocasbuh1hhjGubj)}(h h]h }(hj"HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubj)}(hgfph]hgfp}(hj0HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjGubeh}(h]h ]h"]h$]h&]jjuh1j hjiGhhhj{GhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjeGhhhj{GhMubah}(h]j`Gah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj{GhMhjbGhhubj4)}(hhh]jM)}(hallocate memoryh]hallocate memory}(hjZHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjWHhhubah}(h]h ]h"]h$]h&]uh1j3hjbGhhhj{GhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjrHjHjrHjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``size_t size`` bytes to allocate ``gfp_t gfp`` allocation flags **Description** Allocate **size** bytes. If **size** is smaller than PAGE_SIZE, kzalloc() is used; otherwise, the equivalent of vzalloc() is used. This is to facilitate passing through whitelisted flags. The returned memory is always zeroed. **Return** Pointer to the allocated area on success, NULL on failure.h](jM)}(h**Parameters**h]j)}(hj|Hh]h Parameters}(hj~HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzHubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjvHubj)}(hhh](j)}(h"``size_t size`` bytes to allocate h](j)}(h``size_t size``h]jS)}(hjHh]h size_t size}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjHubj)}(hhh]jM)}(hbytes to allocateh]hbytes to allocate}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHhMhjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjHubj)}(h``gfp_t gfp`` allocation flags h](j)}(h ``gfp_t gfp``h]jS)}(hjHh]h gfp_t gfp}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjHubj)}(hhh]jM)}(hallocation flagsh]hallocation flags}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHhMhjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjHubeh}(h]h ]h"]h$]h&]uh1jhjvHubjM)}(h**Description**h]j)}(hjIh]h Description}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Iubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjvHubjM)}(hAllocate **size** bytes. If **size** is smaller than PAGE_SIZE, kzalloc() is used; otherwise, the equivalent of vzalloc() is used. This is to facilitate passing through whitelisted flags. The returned memory is always zeroed.h](h Allocate }(hj%IhhhNhNubj)}(h**size**h]hsize}(hj-IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%Iubh bytes. If }(hj%IhhhNhNubj)}(h**size**h]hsize}(hj?IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%Iubh is smaller than PAGE_SIZE, kzalloc() is used; otherwise, the equivalent of vzalloc() is used. This is to facilitate passing through whitelisted flags. The returned memory is always zeroed.}(hj%IhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjvHubjM)}(h **Return**h]j)}(hjZIh]hReturn}(hj\IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXIubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjvHubjM)}(h:Pointer to the allocated area on success, NULL on failure.h]h:Pointer to the allocated area on success, NULL on failure.}(hjpIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjvHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_mem_free (C function)c.pcpu_mem_freehNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid pcpu_mem_free (void *ptr)h]h)}(hvoid pcpu_mem_free(void *ptr)h](j)}(hvoidh]hvoid}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhjIhMubh)}(h pcpu_mem_freeh]j)}(h pcpu_mem_freeh]h pcpu_mem_free}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](jjeh"]h$]h&]jjuh1hhjIhhhjIhMubj )}(h (void *ptr)h]j )}(h void *ptrh](j)}(hvoidh]hvoid}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubjF )}(hjI h]h*}(hjIhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjIubj)}(hptrh]hptr}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjIubah}(h]h ]h"]h$]h&]jjuh1j hjIhhhjIhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjIhhhjIhMubah}(h]jIah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjIhMhjIhhubj4)}(hhh]jM)}(h free memoryh]h free memory}(hj/JhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj,Jhhubah}(h]h ]h"]h$]h&]uh1j3hjIhhhjIhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjGJjHjGJjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``void *ptr`` memory to free **Description** Free **ptr**. **ptr** should have been allocated using pcpu_mem_zalloc().h](jM)}(h**Parameters**h]j)}(hjQJh]h Parameters}(hjSJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOJubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjKJubj)}(hhh]j)}(h``void *ptr`` memory to free h](j)}(h ``void *ptr``h]jS)}(hjpJh]h void *ptr}(hjrJhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnJubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjjJubj)}(hhh]jM)}(hmemory to freeh]hmemory to free}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jhjjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjgJubah}(h]h ]h"]h$]h&]uh1jhjKJubjM)}(h**Description**h]j)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjKJubjM)}(hJFree **ptr**. **ptr** should have been allocated using pcpu_mem_zalloc().h](hFree }(hjJhhhNhNubj)}(h**ptr**h]hptr}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh. }(hjJhhhNhNubj)}(h**ptr**h]hptr}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh4 should have been allocated using pcpu_mem_zalloc().}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjKJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h pcpu_chunk_relocate (C function)c.pcpu_chunk_relocatehNtauh1hhjhhhNhNubh)}(hhh](h)}(h>void pcpu_chunk_relocate (struct pcpu_chunk *chunk, int oslot)h]h)}(h=void pcpu_chunk_relocate(struct pcpu_chunk *chunk, int oslot)h](j)}(hvoidh]hvoid}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hj#KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKhhhj"KhMubh)}(hpcpu_chunk_relocateh]j)}(hpcpu_chunk_relocateh]hpcpu_chunk_relocate}(hj5KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1Kubah}(h]h ](jjeh"]h$]h&]jjuh1hhjKhhhj"KhMubj )}(h%(struct pcpu_chunk *chunk, int oslot)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hjQKhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjMKubj)}(h h]h }(hj^KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMKubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjoKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlKubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjqKmodnameN classnameNjpjs)}jv]jy)}jlj7Ksbc.pcpu_chunk_relocateasbuh1hhjMKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMKubjF )}(hjI h]h*}(hjKhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjMKubj)}(hchunkh]hchunk}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMKubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjIKubj )}(h int osloth](j)}(hinth]hint}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj)}(hosloth]hoslot}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjIKubeh}(h]h ]h"]h$]h&]jjuh1j hjKhhhj"KhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj Khhhj"KhMubah}(h]jKah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj"KhMhj Khhubj4)}(hhh]jM)}(h'put chunk in the appropriate chunk sloth]h'put chunk in the appropriate chunk slot}(hj LhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjLhhubah}(h]h ]h"]h$]h&]uh1j3hj Khhhj"KhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!LjHj!LjIjJjKuh1hhhhjhNhNubj)}(hXt**Parameters** ``struct pcpu_chunk *chunk`` chunk of interest ``int oslot`` the previous slot it was on **Description** This function is called after an allocation or free changed **chunk**. New slot according to the changed state is determined and **chunk** is moved to the slot. Note that the reserved chunk is never put on chunk slots. **Context** pcpu_lock.h](jM)}(h**Parameters**h]j)}(hj+Lh]h Parameters}(hj-LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)Lubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM#hj%Lubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hjJLh]hstruct pcpu_chunk *chunk}(hjLLhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHLubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjDLubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hjcLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_LhM hj`Lubah}(h]h ]h"]h$]h&]uh1jhjDLubeh}(h]h ]h"]h$]h&]uh1jhj_LhM hjALubj)}(h*``int oslot`` the previous slot it was on h](j)}(h ``int oslot``h]jS)}(hjLh]h int oslot}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjLubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM!hj}Lubj)}(hhh]jM)}(hthe previous slot it was onh]hthe previous slot it was on}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhM!hjLubah}(h]h ]h"]h$]h&]uh1jhj}Lubeh}(h]h ]h"]h$]h&]uh1jhjLhM!hjALubeh}(h]h ]h"]h$]h&]uh1jhj%LubjM)}(h**Description**h]j)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM#hj%LubjM)}(hThis function is called after an allocation or free changed **chunk**. New slot according to the changed state is determined and **chunk** is moved to the slot. Note that the reserved chunk is never put on chunk slots.h](hcontig_hint. chunk_md->contig_hint may be off by up to a page, but it will never be more than the available space. If the contig hint is contained in one block, it will be accurate.h](jM)}(h**Parameters**h]j)}(hj"Wh]h Parameters}(hj$WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Wubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjWubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hjAWh]hstruct pcpu_chunk *chunk}(hjCWhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?Wubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj;Wubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hjZWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVWhMhjWWubah}(h]h ]h"]h$]h&]uh1jhj;Wubeh}(h]h ]h"]h$]h&]uh1jhjVWhMhj8Wubj)}(h``int bit_off`` chunk offset h](j)}(h``int bit_off``h]jS)}(hjzWh]h int bit_off}(hj|WhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxWubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjtWubj)}(hhh]jM)}(h chunk offseth]h chunk offset}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jhjtWubeh}(h]h ]h"]h$]h&]uh1jhjWhMhj8Wubj)}(h``int bits`` size of request h](j)}(h ``int bits``h]jS)}(hjWh]hint bits}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjWubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjWubj)}(hhh]jM)}(hsize of requesth]hsize of request}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjWhMhj8Wubeh}(h]h ]h"]h$]h&]uh1jhjWubjM)}(h**Description**h]j)}(hjWh]h Description}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjWubjM)}(hUpdates metadata for the allocation path. This avoids a blind block refresh by making use of the block contig hints. If this fails, it scans forward and backward to determine the extent of the free area. This is capped at the boundary of blocks.h]hUpdates metadata for the allocation path. This avoids a blind block refresh by making use of the block contig hints. If this fails, it scans forward and backward to determine the extent of the free area. This is capped at the boundary of blocks.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjWubjM)}(hXuA chunk update is triggered if a page becomes free, a block becomes free, or the free spans across blocks. This tradeoff is to minimize iterating over the block metadata to update chunk_md->contig_hint. chunk_md->contig_hint may be off by up to a page, but it will never be more than the available space. If the contig hint is contained in one block, it will be accurate.h]hXuA chunk update is triggered if a page becomes free, a block becomes free, or the free spans across blocks. This tradeoff is to minimize iterating over the block metadata to update chunk_md->contig_hint. chunk_md->contig_hint may be off by up to a page, but it will never be more than the available space. If the contig hint is contained in one block, it will be accurate.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_is_populated (C function)c.pcpu_is_populatedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hWbool pcpu_is_populated (struct pcpu_chunk *chunk, int bit_off, int bits, int *next_off)h]h)}(hVbool pcpu_is_populated(struct pcpu_chunk *chunk, int bit_off, int bits, int *next_off)h](j)}(hj-h]hbool}(hjBXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>XhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM%ubj)}(h h]h }(hjPXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>XhhhjOXhM%ubh)}(hpcpu_is_populatedh]j)}(hpcpu_is_populatedh]hpcpu_is_populated}(hjbXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^Xubah}(h]h ](jjeh"]h$]h&]jjuh1hhj>XhhhjOXhM%ubj )}(h@(struct pcpu_chunk *chunk, int bit_off, int bits, int *next_off)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hj~XhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjzXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzXubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjXmodnameN classnameNjpjs)}jv]jy)}jljdXsbc.pcpu_is_populatedasbuh1hhjzXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzXubjF )}(hjI h]h*}(hjXhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjzXubj)}(hchunkh]hchunk}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjvXubj )}(h int bit_offh](j)}(hinth]hint}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj)}(hbit_offh]hbit_off}(hj YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjvXubj )}(hint bitsh](j)}(hinth]hint}(hj%YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Yubj)}(h h]h }(hj3YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Yubj)}(hbitsh]hbits}(hjAYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Yubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjvXubj )}(h int *next_offh](j)}(hinth]hint}(hjZYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVYubj)}(h h]h }(hjhYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVYubjF )}(hjI h]h*}(hjvYhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjVYubj)}(hnext_offh]hnext_off}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVYubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjvXubeh}(h]h ]h"]h$]h&]jjuh1j hj>XhhhjOXhM%ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj:XhhhjOXhM%ubah}(h]j5Xah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjOXhM%hj7Xhhubj4)}(hhh]jM)}(h%determines if the region is populatedh]h%determines if the region is populated}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM%hjYhhubah}(h]h ]h"]h$]h&]uh1j3hj7XhhhjOXhM%ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjYjHjYjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct pcpu_chunk *chunk`` chunk of interest ``int bit_off`` chunk offset ``int bits`` size of area ``int *next_off`` return value for the next offset to start searching **Description** For atomic allocations, check if the backing pages are populated. **Return** Bool if the backing pages are populated. next_index is to skip over unpopulated blocks in pcpu_find_block_fit.h](jM)}(h**Parameters**h]j)}(hjYh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM)hjYubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hjYh]hstruct pcpu_chunk *chunk}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjYubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM&hjYubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhM&hjZubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjZhM&hjYubj)}(h``int bit_off`` chunk offset h](j)}(h``int bit_off``h]jS)}(hj'Zh]h int bit_off}(hj)ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj%Zubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM'hj!Zubj)}(hhh]jM)}(h chunk offseth]h chunk offset}(hj@ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjfirst_free. This is an attempt to fill the allocation prior to breaking the contig hint. The allocation and boundary maps are updated accordingly if it confirms a valid free area. **Return** Allocated addr offset in **chunk** on success. -1 if no matching area is found.h](jM)}(h**Parameters**h]j)}(hj_h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj_ubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hj_h]hstruct pcpu_chunk *chunk}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj_ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj_ubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj `hMhj `ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj `hMhj_ubj)}(h7``int alloc_bits`` size of request in allocation units h](j)}(h``int alloc_bits``h]jS)}(hj0`h]hint alloc_bits}(hj2`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj.`ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj*`ubj)}(hhh]jM)}(h#size of request in allocation unitsh]h#size of request in allocation units}(hjI`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjE`hMhjF`ubah}(h]h ]h"]h$]h&]uh1jhj*`ubeh}(h]h ]h"]h$]h&]uh1jhjE`hMhj_ubj)}(h3``size_t align`` alignment of area (max PAGE_SIZE) h](j)}(h``size_t align``h]jS)}(hji`h]h size_t align}(hjk`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjg`ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjc`ubj)}(hhh]jM)}(h!alignment of area (max PAGE_SIZE)h]h!alignment of area (max PAGE_SIZE)}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~`hMhj`ubah}(h]h ]h"]h$]h&]uh1jhjc`ubeh}(h]h ]h"]h$]h&]uh1jhj~`hMhj_ubj)}(h)``int start`` bit_off to start searching h](j)}(h ``int start``h]jS)}(hj`h]h int start}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj`ubj)}(hhh]jM)}(hbit_off to start searchingh]hbit_off to start searching}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj`hMhj`ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj`hMhj_ubeh}(h]h ]h"]h$]h&]uh1jhj_ubjM)}(h**Description**h]j)}(hj`h]h Description}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj_ubjM)}(hXThis function takes in a **start** offset to begin searching to fit an allocation of **alloc_bits** with alignment **align**. It needs to scan the allocation map because if it fits within the block's contig hint, **start** will be block->first_free. This is an attempt to fill the allocation prior to breaking the contig hint. The allocation and boundary maps are updated accordingly if it confirms a valid free area.h](hThis function takes in a }(hj`hhhNhNubj)}(h **start**h]hstart}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh3 offset to begin searching to fit an allocation of }(hj`hhhNhNubj)}(h**alloc_bits**h]h alloc_bits}(hj ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh with alignment }(hj`hhhNhNubj)}(h **align**h]halign}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh\. It needs to scan the allocation map because if it fits within the block’s contig hint, }(hj`hhhNhNubj)}(h **start**h]hstart}(hj1ahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubh will be block->first_free. This is an attempt to fill the allocation prior to breaking the contig hint. The allocation and boundary maps are updated accordingly if it confirms a valid free area.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj_ubjM)}(h **Return**h]j)}(hjLah]hReturn}(hjNahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJaubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj_ubjM)}(hOAllocated addr offset in **chunk** on success. -1 if no matching area is found.h](hAllocated addr offset in }(hjbahhhNhNubj)}(h **chunk**h]hchunk}(hjjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbaubh- on success. -1 if no matching area is found.}(hjbahhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_free_area (C function)c.pcpu_free_areahNtauh1hhjhhhNhNubh)}(hhh](h)}(h6int pcpu_free_area (struct pcpu_chunk *chunk, int off)h]h)}(h5int pcpu_free_area(struct pcpu_chunk *chunk, int off)h](j)}(hinth]hint}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjahMubh)}(hpcpu_free_areah]j)}(hpcpu_free_areah]hpcpu_free_area}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ](jjeh"]h$]h&]jjuh1hhjahhhjahMubj )}(h#(struct pcpu_chunk *chunk, int off)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hjahhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjaubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjbmodnameN classnameNjpjs)}jv]jy)}jljasbc.pcpu_free_areaasbuh1hhjaubj)}(h h]h }(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubjF )}(hjI h]h*}(hj,bhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjaubj)}(hchunkh]hchunk}(hj9bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubj )}(hint offh](j)}(hinth]hint}(hjRbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNbubj)}(h h]h }(hj`bhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNbubj)}(hoffh]hoff}(hjnbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNbubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubeh}(h]h ]h"]h$]h&]jjuh1j hjahhhjahMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjahhhjahMubah}(h]jaah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjahMhjahhubj4)}(hhh]jM)}(hfrees the corresponding offseth]hfrees the corresponding offset}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbhhubah}(h]h ]h"]h$]h&]uh1j3hjahhhjahMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjbjHjbjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct pcpu_chunk *chunk`` chunk of interest ``int off`` addr offset into chunk **Description** This function determines the size of an allocation to free using the boundary bitmap and clears the allocation map. **Return** Number of freed bytes.h](jM)}(h**Parameters**h]j)}(hjbh]h Parameters}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbubj)}(hhh](j)}(h/``struct pcpu_chunk *chunk`` chunk of interest h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hjbh]hstruct pcpu_chunk *chunk}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjbubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbubj)}(hhh]jM)}(hchunk of interesth]hchunk of interest}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjbhMhjbubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhjbhMhjbubj)}(h#``int off`` addr offset into chunk h](j)}(h ``int off``h]jS)}(hjch]hint off}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjcubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj cubj)}(hhh]jM)}(haddr offset into chunkh]haddr offset into chunk}(hj+chhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj'chMhj(cubah}(h]h ]h"]h$]h&]uh1jhj cubeh}(h]h ]h"]h$]h&]uh1jhj'chMhjbubeh}(h]h ]h"]h$]h&]uh1jhjbubjM)}(h**Description**h]j)}(hjMch]h Description}(hjOchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKcubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbubjM)}(hsThis function determines the size of an allocation to free using the boundary bitmap and clears the allocation map.h]hsThis function determines the size of an allocation to free using the boundary bitmap and clears the allocation map.}(hjcchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbubjM)}(h **Return**h]j)}(hjtch]hReturn}(hjvchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrcubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbubjM)}(hNumber of freed bytes.h]hNumber of freed bytes.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#pcpu_alloc_first_chunk (C function)c.pcpu_alloc_first_chunkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hQstruct pcpu_chunk * pcpu_alloc_first_chunk (unsigned long tmp_addr, int map_size)h]h)}(hOstruct pcpu_chunk *pcpu_alloc_first_chunk(unsigned long tmp_addr, int map_size)h](j5)}(hj8h]hstruct}(hjchhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjchhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM;ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjchM;ubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjcmodnameN classnameNjpjs)}jv]jy)}jlpcpu_alloc_first_chunksbc.pcpu_alloc_first_chunkasbuh1hhjchhhjchM;ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjchM;ubjF )}(hjI h]h*}(hjdhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjchhhjchM;ubh)}(hpcpu_alloc_first_chunkh]j)}(hjch]hpcpu_alloc_first_chunk}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]jjuh1hhjchhhjchM;ubj )}(h&(unsigned long tmp_addr, int map_size)h](j )}(hunsigned long tmp_addrh](j)}(hunsignedh]hunsigned}(hj3dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/dubj)}(h h]h }(hjAdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/dubj)}(hlongh]hlong}(hjOdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/dubj)}(h h]h }(hj]dhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/dubj)}(htmp_addrh]htmp_addr}(hjkdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/dubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj+dubj )}(h int map_sizeh](j)}(hinth]hint}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(h h]h }(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(hmap_sizeh]hmap_size}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj+dubeh}(h]h ]h"]h$]h&]jjuh1j hjchhhjchM;ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjchhhjchM;ubah}(h]jcah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjchM;hjchhubj4)}(hhh]jM)}(h)creates chunks that serve the first chunkh]h)creates chunks that serve the first chunk}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM;hjdhhubah}(h]h ]h"]h$]h&]uh1j3hjchhhjchM;ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjdjHjdjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``unsigned long tmp_addr`` the start of the region served ``int map_size`` size of the region served **Description** This is responsible for creating the chunks that serve the first chunk. The base_addr is page aligned down of **tmp_addr** while the region end is page aligned up. Offsets are kept track of to determine the region served. All this is done to appease the bitmap allocator in avoiding partial blocks. **Return** Chunk serving the region at **tmp_addr** of **map_size**.h](jM)}(h**Parameters**h]j)}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM?hjdubj)}(hhh](j)}(h:``unsigned long tmp_addr`` the start of the region served h](j)}(h``unsigned long tmp_addr``h]jS)}(hj eh]hunsigned long tmp_addr}(hj ehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj eubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM<hjeubj)}(hhh]jM)}(hthe start of the region servedh]hthe start of the region served}(hj$ehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ehM<hj!eubah}(h]h ]h"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]uh1jhj ehM<hjeubj)}(h+``int map_size`` size of the region served h](j)}(h``int map_size``h]jS)}(hjDeh]h int map_size}(hjFehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjBeubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM=hj>eubj)}(hhh]jM)}(hsize of the region servedh]hsize of the region served}(hj]ehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYehM=hjZeubah}(h]h ]h"]h$]h&]uh1jhj>eubeh}(h]h ]h"]h$]h&]uh1jhjYehM=hjeubeh}(h]h ]h"]h$]h&]uh1jhjdubjM)}(h**Description**h]j)}(hjeh]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}eubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM?hjdubjM)}(hX,This is responsible for creating the chunks that serve the first chunk. The base_addr is page aligned down of **tmp_addr** while the region end is page aligned up. Offsets are kept track of to determine the region served. All this is done to appease the bitmap allocator in avoiding partial blocks.h](hoThis is responsible for creating the chunks that serve the first chunk. The base_addr is page aligned down of }(hjehhhNhNubj)}(h **tmp_addr**h]htmp_addr}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubh while the region end is page aligned up. Offsets are kept track of to determine the region served. All this is done to appease the bitmap allocator in avoiding partial blocks.}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM>hjdubjM)}(h **Return**h]j)}(hjeh]hReturn}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMChjdubjM)}(h9Chunk serving the region at **tmp_addr** of **map_size**.h](hChunk serving the region at }(hjehhhNhNubj)}(h **tmp_addr**h]htmp_addr}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubh of }(hjehhhNhNubj)}(h **map_size**h]hmap_size}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubh.}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMDhjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!pcpu_chunk_populated (C function)c.pcpu_chunk_populatedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hRvoid pcpu_chunk_populated (struct pcpu_chunk *chunk, int page_start, int page_end)h]h)}(hQvoid pcpu_chunk_populated(struct pcpu_chunk *chunk, int page_start, int page_end)h](j)}(hvoidh]hvoid}(hj!fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hj0fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfhhhj/fhMubh)}(hpcpu_chunk_populatedh]j)}(hpcpu_chunk_populatedh]hpcpu_chunk_populated}(hjBfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>fubah}(h]h ](jjeh"]h$]h&]jjuh1hhjfhhhj/fhMubj )}(h8(struct pcpu_chunk *chunk, int page_start, int page_end)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hj^fhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjZfubj)}(h h]h }(hjkfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZfubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hj|fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyfubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj~fmodnameN classnameNjpjs)}jv]jy)}jljDfsbc.pcpu_chunk_populatedasbuh1hhjZfubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZfubjF )}(hjI h]h*}(hjfhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjZfubj)}(hchunkh]hchunk}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZfubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVfubj )}(hint page_starth](j)}(hinth]hint}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubj)}(h page_starth]h page_start}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVfubj )}(h int page_endh](j)}(hinth]hint}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hpage_endh]hpage_end}(hj!ghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVfubeh}(h]h ]h"]h$]h&]jjuh1j hjfhhhj/fhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjfhhhj/fhMubah}(h]jfah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/fhMhjfhhubj4)}(hhh]jM)}(hpost-population bookkeepingh]hpost-population bookkeeping}(hjKghhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjHghhubah}(h]h ]h"]h$]h&]uh1j3hjfhhhj/fhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjcgjHjcgjIjJjKuh1hhhhjhNhNubj)}(hXQ**Parameters** ``struct pcpu_chunk *chunk`` pcpu_chunk which got populated ``int page_start`` the start page ``int page_end`` the end page **Description** Pages in [**page_start**,**page_end**) have been populated to **chunk**. Update the bookkeeping information accordingly. Must be called after each successful population.h](jM)}(h**Parameters**h]j)}(hjmgh]h Parameters}(hjoghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkgubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjggubj)}(hhh](j)}(h<``struct pcpu_chunk *chunk`` pcpu_chunk which got populated h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hjgh]hstruct pcpu_chunk *chunk}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjgubj)}(hhh]jM)}(hpcpu_chunk which got populatedh]hpcpu_chunk which got populated}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjghMhjgubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjghMhjgubj)}(h"``int page_start`` the start page h](j)}(h``int page_start``h]jS)}(hjgh]hint page_start}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjgubj)}(hhh]jM)}(hthe start pageh]hthe start page}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjghMhjgubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjghMhjgubj)}(h``int page_end`` the end page h](j)}(h``int page_end``h]jS)}(hjgh]h int page_end}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjgubj)}(hhh]jM)}(h the end pageh]h the end page}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhMhjhubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjhhMhjgubeh}(h]h ]h"]h$]h&]uh1jhjggubjM)}(h**Description**h]j)}(hj9hh]h Description}(hj;hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7hubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjggubjM)}(hPages in [**page_start**,**page_end**) have been populated to **chunk**. Update the bookkeeping information accordingly. Must be called after each successful population.h](h Pages in [}(hjOhhhhNhNubj)}(h**page_start**h]h page_start}(hjWhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOhubh&,**page_end**) have been populated to }(hjOhhhhNhNubj)}(h **chunk**h]hchunk}(hjihhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOhubhd. Update the bookkeeping information accordingly. Must be called after each successful population.}(hjOhhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjggubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#pcpu_chunk_depopulated (C function)c.pcpu_chunk_depopulatedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hTvoid pcpu_chunk_depopulated (struct pcpu_chunk *chunk, int page_start, int page_end)h]h)}(hSvoid pcpu_chunk_depopulated(struct pcpu_chunk *chunk, int page_start, int page_end)h](j)}(hvoidh]hvoid}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjhhMubh)}(hpcpu_chunk_depopulatedh]j)}(hpcpu_chunk_depopulatedh]hpcpu_chunk_depopulated}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhhjhhMubj )}(h8(struct pcpu_chunk *chunk, int page_start, int page_end)h](j )}(hstruct pcpu_chunk *chunkh](j5)}(hj8h]hstruct}(hjhhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjhmodnameN classnameNjpjs)}jv]jy)}jljhsbc.pcpu_chunk_depopulatedasbuh1hhjhubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubjF )}(hjI h]h*}(hj+ihhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhubj)}(hchunkh]hchunk}(hj8ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(hint page_starth](j)}(hinth]hint}(hjQihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMiubj)}(h h]h }(hj_ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMiubj)}(h page_starth]h page_start}(hjmihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMiubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubj )}(h int page_endh](j)}(hinth]hint}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubj)}(hpage_endh]hpage_end}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjhubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhhjhhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhhjhhMubah}(h]jhah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhhMhjhhhubj4)}(hhh]jM)}(hpost-depopulation bookkeepingh]hpost-depopulation bookkeeping}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjihhubah}(h]h ]h"]h$]h&]uh1j3hjhhhhjhhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjijHjijIjJjKuh1hhhhjhNhNubj)}(hXX**Parameters** ``struct pcpu_chunk *chunk`` pcpu_chunk which got depopulated ``int page_start`` the start page ``int page_end`` the end page **Description** Pages in [**page_start**,**page_end**) have been depopulated from **chunk**. Update the bookkeeping information accordingly. Must be called after each successful depopulation.h](jM)}(h**Parameters**h]j)}(hjih]h Parameters}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjiubj)}(hhh](j)}(h>``struct pcpu_chunk *chunk`` pcpu_chunk which got depopulated h](j)}(h``struct pcpu_chunk *chunk``h]jS)}(hj jh]hstruct pcpu_chunk *chunk}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj jubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjjubj)}(hhh]jM)}(h pcpu_chunk which got depopulatedh]h pcpu_chunk which got depopulated}(hj&jhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj"jhMhj#jubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhj"jhMhjjubj)}(h"``int page_start`` the start page h](j)}(h``int page_start``h]jS)}(hjFjh]hint page_start}(hjHjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjDjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj@jubj)}(hhh]jM)}(hthe start pageh]hthe start page}(hj_jhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[jhMhj\jubah}(h]h ]h"]h$]h&]uh1jhj@jubeh}(h]h ]h"]h$]h&]uh1jhj[jhMhjjubj)}(h``int page_end`` the end page h](j)}(h``int page_end``h]jS)}(hjjh]h int page_end}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}jubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjyjubj)}(hhh]jM)}(h the end pageh]h the end page}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjjhMhjjubah}(h]h ]h"]h$]h&]uh1jhjyjubeh}(h]h ]h"]h$]h&]uh1jhjjhMhjjubeh}(h]h ]h"]h$]h&]uh1jhjiubjM)}(h**Description**h]j)}(hjjh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjiubjM)}(hPages in [**page_start**,**page_end**) have been depopulated from **chunk**. Update the bookkeeping information accordingly. Must be called after each successful depopulation.h](h Pages in [}(hjjhhhNhNubj)}(h**page_start**h]h page_start}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh*,**page_end**) have been depopulated from }(hjjhhhNhNubj)}(h **chunk**h]hchunk}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubhe. Update the bookkeeping information accordingly. Must be called after each successful depopulation.}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#pcpu_chunk_addr_search (C function)c.pcpu_chunk_addr_searchhNtauh1hhjhhhNhNubh)}(hhh](h)}(h7struct pcpu_chunk * pcpu_chunk_addr_search (void *addr)h]h)}(h5struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)h](j5)}(hj8h]hstruct}(hj#khhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjkhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM1ubj)}(h h]h }(hj1khhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhj0khM1ubh)}(hhh]j)}(h pcpu_chunkh]h pcpu_chunk}(hjBkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?kubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjDkmodnameN classnameNjpjs)}jv]jy)}jlpcpu_chunk_addr_searchsbc.pcpu_chunk_addr_searchasbuh1hhjkhhhj0khM1ubj)}(h h]h }(hjckhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhj0khM1ubjF )}(hjI h]h*}(hjqkhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjkhhhj0khM1ubh)}(hpcpu_chunk_addr_searchh]j)}(hj`kh]hpcpu_chunk_addr_search}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~kubah}(h]h ](jjeh"]h$]h&]jjuh1hhjkhhhj0khM1ubj )}(h (void *addr)h]j )}(h void *addrh](j)}(hvoidh]hvoid}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubjF )}(hjI h]h*}(hjkhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjkubj)}(haddrh]haddr}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjkubah}(h]h ]h"]h$]h&]jjuh1j hjkhhhj0khM1ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjkhhhj0khM1ubah}(h]jkah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj0khM1hjkhhubj4)}(hhh]jM)}(h,determine chunk containing specified addressh]h,determine chunk containing specified address}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM1hjkhhubah}(h]h ]h"]h$]h&]uh1j3hjkhhhj0khM1ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjljHjljIjJjKuh1hhhhjhNhNubj)}(hX!**Parameters** ``void *addr`` address for which the chunk needs to be determined. **Description** This is an internal function that handles all but static allocations. Static percpu address values should never be passed into the allocator. **Return** The address of the found chunk.h](jM)}(h**Parameters**h]j)}(hjlh]h Parameters}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM5hj lubj)}(hhh]j)}(hC``void *addr`` address for which the chunk needs to be determined. h](j)}(h``void *addr``h]jS)}(hj1lh]h void *addr}(hj3lhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/lubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM2hj+lubj)}(hhh]jM)}(h3address for which the chunk needs to be determined.h]h3address for which the chunk needs to be determined.}(hjJlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjFlhM2hjGlubah}(h]h ]h"]h$]h&]uh1jhj+lubeh}(h]h ]h"]h$]h&]uh1jhjFlhM2hj(lubah}(h]h ]h"]h$]h&]uh1jhj lubjM)}(h**Description**h]j)}(hjllh]h Description}(hjnlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjlubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM4hj lubjM)}(hThis is an internal function that handles all but static allocations. Static percpu address values should never be passed into the allocator.h]hThis is an internal function that handles all but static allocations. Static percpu address values should never be passed into the allocator.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM3hj lubjM)}(h **Return**h]j)}(hjlh]hReturn}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM6hj lubjM)}(hThe address of the found chunk.h]hThe address of the found chunk.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM7hj lubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_alloc (C function) c.pcpu_allochNtauh1hhjhhhNhNubh)}(hhh](h)}(hPvoid __percpu * pcpu_alloc (size_t size, size_t align, bool reserved, gfp_t gfp)h]h)}(hNvoid __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, gfp_t gfp)h](j)}(hvoidh]hvoid}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhjlhMubh__percpu}(hjlhhhNhNubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhjlhMubjF )}(hjI h]h*}(hjmhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjlhhhjlhMubh)}(h pcpu_alloch]j)}(h pcpu_alloch]h pcpu_alloc}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ](jjeh"]h$]h&]jjuh1hhjlhhhjlhMubj )}(h5(size_t size, size_t align, bool reserved, gfp_t gfp)h](j )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj7mhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4mubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9mmodnameN classnameNjpjs)}jv]jy)}jljmsb c.pcpu_allocasbuh1hhj0mubj)}(h h]h }(hjWmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0mubj)}(hsizeh]hsize}(hjemhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0mubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,mubj )}(h size_t alignh](h)}(hhh]j)}(hsize_th]hsize_t}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~mubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmmodnameN classnameNjpjs)}jv]jSm c.pcpu_allocasbuh1hhjzmubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzmubj)}(halignh]halign}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzmubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,mubj )}(h bool reservedh](j)}(hj-h]hbool}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj)}(h h]h }(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj)}(hreservedh]hreserved}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,mubj )}(h gfp_t gfph](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmmodnameN classnameNjpjs)}jv]jSm c.pcpu_allocasbuh1hhjmubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj)}(hgfph]hgfp}(hj)nhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj,mubeh}(h]h ]h"]h$]h&]jjuh1j hjlhhhjlhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjlhhhjlhMubah}(h]jlah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjlhMhjlhhubj4)}(hhh]jM)}(hthe percpu allocatorh]hthe percpu allocator}(hjSnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjPnhhubah}(h]h ]h"]h$]h&]uh1j3hjlhhhjlhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjknjHjknjIjJjKuh1hhhhjhNhNubj)}(hX"**Parameters** ``size_t size`` size of area to allocate in bytes ``size_t align`` alignment of area (max PAGE_SIZE) ``bool reserved`` allocate from the reserved chunk if available ``gfp_t gfp`` allocation flags **Description** Allocate percpu area of **size** bytes aligned at **align**. If **gfp** doesn't allow blocking, the allocation is atomic. If **gfp** has __GFP_NOWARN then no warning will be triggered on invalid or failed allocation requests. **Return** Percpu pointer to the allocated area on success, NULL on failure.h](jM)}(h**Parameters**h]j)}(hjunh]h Parameters}(hjwnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsnubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjonubj)}(hhh](j)}(h2``size_t size`` size of area to allocate in bytes h](j)}(h``size_t size``h]jS)}(hjnh]h size_t size}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjnubj)}(hhh]jM)}(h!size of area to allocate in bytesh]h!size of area to allocate in bytes}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnhMhjnubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjnhMhjnubj)}(h3``size_t align`` alignment of area (max PAGE_SIZE) h](j)}(h``size_t align``h]jS)}(hjnh]h size_t align}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjnubj)}(hhh]jM)}(h!alignment of area (max PAGE_SIZE)h]h!alignment of area (max PAGE_SIZE)}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjnhMhjnubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjnhMhjnubj)}(h@``bool reserved`` allocate from the reserved chunk if available h](j)}(h``bool reserved``h]jS)}(hjoh]h bool reserved}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjoubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjoubj)}(hhh]jM)}(h-allocate from the reserved chunk if availableh]h-allocate from the reserved chunk if available}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjohMhjoubah}(h]h ]h"]h$]h&]uh1jhjoubeh}(h]h ]h"]h$]h&]uh1jhjohMhjnubj)}(h``gfp_t gfp`` allocation flags h](j)}(h ``gfp_t gfp``h]jS)}(hj?oh]h gfp_t gfp}(hjAohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj=oubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhj9oubj)}(hhh]jM)}(hallocation flagsh]hallocation flags}(hjXohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjTohMhjUoubah}(h]h ]h"]h$]h&]uh1jhj9oubeh}(h]h ]h"]h$]h&]uh1jhjTohMhjnubeh}(h]h ]h"]h$]h&]uh1jhjonubjM)}(h**Description**h]j)}(hjzoh]h Description}(hj|ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxoubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjonubjM)}(hAllocate percpu area of **size** bytes aligned at **align**. If **gfp** doesn't allow blocking, the allocation is atomic. If **gfp** has __GFP_NOWARN then no warning will be triggered on invalid or failed allocation requests.h](hAllocate percpu area of }(hjohhhNhNubj)}(h**size**h]hsize}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh bytes aligned at }(hjohhhNhNubj)}(h **align**h]halign}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh. If }(hjohhhNhNubj)}(h**gfp**h]hgfp}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh8 doesn’t allow blocking, the allocation is atomic. If }(hjohhhNhNubj)}(h**gfp**h]hgfp}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh] has __GFP_NOWARN then no warning will be triggered on invalid or failed allocation requests.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjonubjM)}(h **Return**h]j)}(hjoh]hReturn}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjonubjM)}(hAPercpu pointer to the allocated area on success, NULL on failure.h]hAPercpu pointer to the allocated area on success, NULL on failure.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMhjonubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hpcpu_balance_free (C function)c.pcpu_balance_freehNtauh1hhjhhhNhNubh)}(hhh](h)}(h(void pcpu_balance_free (bool empty_only)h]h)}(h'void pcpu_balance_free(bool empty_only)h](j)}(hvoidh]hvoid}(hj.phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*phhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMubj)}(h h]h }(hj=phhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*phhhjxubj)}(hhh]jM)}(haddress to testh]haddress to test}(hj]xhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjYxhM hjZxubah}(h]h ]h"]h$]h&]uh1jhj>xubeh}(h]h ]h"]h$]h&]uh1jhjYxhM hj;xubah}(h]h ]h"]h$]h&]uh1jhjxubjM)}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}xubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjxubjM)}(hTest whether **addr** belongs to in-kernel static percpu area. Module static percpu areas are not considered. For those, use is_module_percpu_address().h](h Test whether }(hjxhhhNhNubj)}(h**addr**h]haddr}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh belongs to in-kernel static percpu area. Module static percpu areas are not considered. For those, use is_module_percpu_address().}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjxubjM)}(h **Return**h]j)}(hjxh]hReturn}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjxubjM)}(hO``true`` if **addr** is from in-kernel static percpu area, ``false`` otherwise.h](jS)}(h``true``h]htrue}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxubh if }(hjxhhhNhNubj)}(h**addr**h]haddr}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh' is from in-kernel static percpu area, }(hjxhhhNhNubjS)}(h ``false``h]hfalse}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxubh otherwise.}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h per_cpu_ptr_to_phys (C function)c.per_cpu_ptr_to_physhNtauh1hhjhhhNhNubh)}(hhh](h)}(h,phys_addr_t per_cpu_ptr_to_phys (void *addr)h]h)}(h+phys_addr_t per_cpu_ptr_to_phys(void *addr)h](h)}(hhh]j)}(h phys_addr_th]h phys_addr_t}(hj2yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/yubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj4ymodnameN classnameNjpjs)}jv]jy)}jlper_cpu_ptr_to_physsbc.per_cpu_ptr_to_physasbuh1hhj+yhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM$ ubj)}(h h]h }(hjTyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+yhhhjSyhM$ ubh)}(hper_cpu_ptr_to_physh]j)}(hjPyh]hper_cpu_ptr_to_phys}(hjfyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbyubah}(h]h ](jjeh"]h$]h&]jjuh1hhj+yhhhjSyhM$ ubj )}(h (void *addr)h]j )}(h void *addrh](j)}(hvoidh]hvoid}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}yubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}yubjF )}(hjI h]h*}(hjyhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj}yubj)}(haddrh]haddr}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}yubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjyyubah}(h]h ]h"]h$]h&]jjuh1j hj+yhhhjSyhM$ ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj'yhhhjSyhM$ ubah}(h]j"yah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjSyhM$ hj$yhhubj4)}(hhh]jM)}(h5convert translated percpu address to physical addressh]h5convert translated percpu address to physical address}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM$ hjyhhubah}(h]h ]h"]h$]h&]uh1j3hj$yhhhjSyhM$ ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjyjHjyjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``void *addr`` the address to be converted to physical address **Description** Given **addr** which is dereferenceable address obtained via one of percpu access macros, this function translates it into its physical address. The caller is responsible for ensuring **addr** stays valid until this function finishes. percpu allocator has special setup for the first chunk, which currently supports either embedding in linear address space or vmalloc mapping, and, from the second one, the backing allocator (currently either vm or km) provides translation. The addr can be translated simply without checking if it falls into the first chunk. But the current code reflects better how percpu allocator actually works, and the verification can discover both bugs in percpu allocator itself and per_cpu_ptr_to_phys() callers. So we keep current code. **Return** The physical address for **addr**.h](jM)}(h**Parameters**h]j)}(hjyh]h Parameters}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM( hjyubj)}(hhh]j)}(h?``void *addr`` the address to be converted to physical address h](j)}(h``void *addr``h]jS)}(hjzh]h void *addr}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjzubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM% hjzubj)}(hhh]jM)}(h/the address to be converted to physical addressh]h/the address to be converted to physical address}(hj.zhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*zhM% hj+zubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhj*zhM% hj zubah}(h]h ]h"]h$]h&]uh1jhjyubjM)}(h**Description**h]j)}(hjPzh]h Description}(hjRzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNzubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM' hjyubjM)}(hGiven **addr** which is dereferenceable address obtained via one of percpu access macros, this function translates it into its physical address. The caller is responsible for ensuring **addr** stays valid until this function finishes.h](hGiven }(hjfzhhhNhNubj)}(h**addr**h]haddr}(hjnzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfzubh which is dereferenceable address obtained via one of percpu access macros, this function translates it into its physical address. The caller is responsible for ensuring }(hjfzhhhNhNubj)}(h**addr**h]haddr}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfzubh* stays valid until this function finishes.}(hjfzhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM& hjyubjM)}(hpercpu allocator has special setup for the first chunk, which currently supports either embedding in linear address space or vmalloc mapping, and, from the second one, the backing allocator (currently either vm or km) provides translation.h]hpercpu allocator has special setup for the first chunk, which currently supports either embedding in linear address space or vmalloc mapping, and, from the second one, the backing allocator (currently either vm or km) provides translation.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM+ hjyubjM)}(hX!The addr can be translated simply without checking if it falls into the first chunk. But the current code reflects better how percpu allocator actually works, and the verification can discover both bugs in percpu allocator itself and per_cpu_ptr_to_phys() callers. So we keep current code.h]hX!The addr can be translated simply without checking if it falls into the first chunk. But the current code reflects better how percpu allocator actually works, and the verification can discover both bugs in percpu allocator itself and per_cpu_ptr_to_phys() callers. So we keep current code.}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM0 hjyubjM)}(h **Return**h]j)}(hjzh]hReturn}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM6 hjyubjM)}(h"The physical address for **addr**.h](hThe physical address for }(hjzhhhNhNubj)}(h**addr**h]haddr}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubh.}(hjzhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM7 hjyubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"pcpu_alloc_alloc_info (C function)c.pcpu_alloc_alloc_infohNtauh1hhjhhhNhNubh)}(hhh](h)}(hLstruct pcpu_alloc_info * pcpu_alloc_alloc_info (int nr_groups, int nr_units)h]h)}(hJstruct pcpu_alloc_info *pcpu_alloc_alloc_info(int nr_groups, int nr_units)h](j5)}(hj8h]hstruct}(hj{hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj {hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMg ubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj {hhhj{hMg ubh)}(hhh]j)}(hpcpu_alloc_infoh]hpcpu_alloc_info}(hj/{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,{ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj1{modnameN classnameNjpjs)}jv]jy)}jlpcpu_alloc_alloc_infosbc.pcpu_alloc_alloc_infoasbuh1hhj {hhhj{hMg ubj)}(h h]h }(hjP{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj {hhhj{hMg ubjF )}(hjI h]h*}(hj^{hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj {hhhj{hMg ubh)}(hpcpu_alloc_alloc_infoh]j)}(hjM{h]hpcpu_alloc_alloc_info}(hjo{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk{ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj {hhhj{hMg ubj )}(h(int nr_groups, int nr_units)h](j )}(h int nr_groupsh](j)}(hinth]hint}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h nr_groupsh]h nr_groups}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{ubj )}(h int nr_unitsh](j)}(hinth]hint}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hnr_unitsh]hnr_units}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj{ubeh}(h]h ]h"]h$]h&]jjuh1j hj {hhhj{hMg ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj{hhhj{hMg ubah}(h]j{ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj{hMg hj{hhubj4)}(hhh]jM)}(hallocate percpu allocation infoh]hallocate percpu allocation info}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMg hj|hhubah}(h]h ]h"]h$]h&]uh1j3hj{hhhj{hMg ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj|jHj|jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int nr_groups`` the number of groups ``int nr_units`` the number of units **Description** Allocate ai which is large enough for **nr_groups** groups containing **nr_units** units. The returned ai's groups[0].cpu_map points to the cpu_map array which is long enough for **nr_units** and filled with NR_CPUS. It's the caller's responsibility to initialize cpu_map pointer of other groups. **Return** Pointer to the allocated pcpu_alloc_info on success, NULL on failure.h](jM)}(h**Parameters**h]j)}(hj'|h]h Parameters}(hj)|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%|ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMk hj!|ubj)}(hhh](j)}(h'``int nr_groups`` the number of groups h](j)}(h``int nr_groups``h]jS)}(hjF|h]h int nr_groups}(hjH|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjD|ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMh hj@|ubj)}(hhh]jM)}(hthe number of groupsh]hthe number of groups}(hj_|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[|hMh hj\|ubah}(h]h ]h"]h$]h&]uh1jhj@|ubeh}(h]h ]h"]h$]h&]uh1jhj[|hMh hj=|ubj)}(h%``int nr_units`` the number of units h](j)}(h``int nr_units``h]jS)}(hj|h]h int nr_units}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj}|ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMi hjy|ubj)}(hhh]jM)}(hthe number of unitsh]hthe number of units}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj|hMi hj|ubah}(h]h ]h"]h$]h&]uh1jhjy|ubeh}(h]h ]h"]h$]h&]uh1jhj|hMi hj=|ubeh}(h]h ]h"]h$]h&]uh1jhj!|ubjM)}(h**Description**h]j)}(hj|h]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMk hj!|ubjM)}(hX*Allocate ai which is large enough for **nr_groups** groups containing **nr_units** units. The returned ai's groups[0].cpu_map points to the cpu_map array which is long enough for **nr_units** and filled with NR_CPUS. It's the caller's responsibility to initialize cpu_map pointer of other groups.h](h&Allocate ai which is large enough for }(hj|hhhNhNubj)}(h **nr_groups**h]h nr_groups}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubh groups containing }(hj|hhhNhNubj)}(h **nr_units**h]hnr_units}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubhd units. The returned ai’s groups[0].cpu_map points to the cpu_map array which is long enough for }(hj|hhhNhNubj)}(h **nr_units**h]hnr_units}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubhn and filled with NR_CPUS. It’s the caller’s responsibility to initialize cpu_map pointer of other groups.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMj hj!|ubjM)}(h **Return**h]j)}(hj}h]hReturn}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMp hj!|ubjM)}(hEPointer to the allocated pcpu_alloc_info on success, NULL on failure.h]hEPointer to the allocated pcpu_alloc_info on success, NULL on failure.}(hj-}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMq hj!|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!pcpu_free_alloc_info (C function)c.pcpu_free_alloc_infohNtauh1hhjhhhNhNubh)}(hhh](h)}(h6void pcpu_free_alloc_info (struct pcpu_alloc_info *ai)h]h)}(h5void pcpu_free_alloc_info(struct pcpu_alloc_info *ai)h](j)}(hvoidh]hvoid}(hj\}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX}hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM ubj)}(h h]h }(hjk}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX}hhhjj}hM ubh)}(hpcpu_free_alloc_infoh]j)}(hpcpu_free_alloc_infoh]hpcpu_free_alloc_info}(hj}}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy}ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjX}hhhjj}hM ubj )}(h(struct pcpu_alloc_info *ai)h]j )}(hstruct pcpu_alloc_info *aih](j5)}(hj8h]hstruct}(hj}hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj}ubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubh)}(hhh]j)}(hpcpu_alloc_infoh]hpcpu_alloc_info}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj}modnameN classnameNjpjs)}jv]jy)}jlj}sbc.pcpu_free_alloc_infoasbuh1hhj}ubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubjF )}(hjI h]h*}(hj}hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj}ubj)}(haih]hai}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj}ubah}(h]h ]h"]h$]h&]jjuh1j hjX}hhhjj}hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjT}hhhjj}hM ubah}(h]jO}ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjj}hM hjQ}hhubj4)}(hhh]jM)}(hfree percpu allocation infoh]hfree percpu allocation info}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~hhubah}(h]h ]h"]h$]h&]uh1j3hjQ}hhhjj}hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj4~jHj4~jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct pcpu_alloc_info *ai`` pcpu_alloc_info to free **Description** Free **ai** which was allocated by pcpu_alloc_alloc_info().h](jM)}(h**Parameters**h]j)}(hj>~h]h Parameters}(hj@~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<~ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj8~ubj)}(hhh]j)}(h7``struct pcpu_alloc_info *ai`` pcpu_alloc_info to free h](j)}(h``struct pcpu_alloc_info *ai``h]jS)}(hj]~h]hstruct pcpu_alloc_info *ai}(hj_~hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[~ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjW~ubj)}(hhh]jM)}(hpcpu_alloc_info to freeh]hpcpu_alloc_info to free}(hjv~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjr~hM hjs~ubah}(h]h ]h"]h$]h&]uh1jhjW~ubeh}(h]h ]h"]h$]h&]uh1jhjr~hM hjT~ubah}(h]h ]h"]h$]h&]uh1jhj8~ubjM)}(h**Description**h]j)}(hj~h]h Description}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj8~ubjM)}(h;Free **ai** which was allocated by pcpu_alloc_alloc_info().h](hFree }(hj~hhhNhNubj)}(h**ai**h]hai}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh0 which was allocated by pcpu_alloc_alloc_info().}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj8~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!pcpu_dump_alloc_info (C function)c.pcpu_dump_alloc_infohNtauh1hhjhhhNhNubh)}(hhh](h)}(hMvoid pcpu_dump_alloc_info (const char *lvl, const struct pcpu_alloc_info *ai)h]h)}(hLvoid pcpu_dump_alloc_info(const char *lvl, const struct pcpu_alloc_info *ai)h](j)}(hvoidh]hvoid}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM ubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~hhhj~hM ubh)}(hpcpu_dump_alloc_infoh]j)}(hpcpu_dump_alloc_infoh]hpcpu_dump_alloc_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj~hhhj~hM ubj )}(h3(const char *lvl, const struct pcpu_alloc_info *ai)h](j )}(hconst char *lvlh](j5)}(hjh]hconst}(hj,hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hcharh]hchar}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF )}(hjI h]h*}(hjchhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(ubj)}(hlvlh]hlvl}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubj )}(h const struct pcpu_alloc_info *aih](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpcpu_alloc_infoh]hpcpu_alloc_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.pcpu_dump_alloc_infoasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(haih]hai}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj$ubeh}(h]h ]h"]h$]h&]jjuh1j hj~hhhj~hM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj~hhhj~hM ubah}(h]j~ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj~hM hj~hhubj4)}(hhh]jM)}(h+print out information about pcpu_alloc_infoh]h+print out information about pcpu_alloc_info}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj$hhubah}(h]h ]h"]h$]h&]uh1j3hj~hhhj~hM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj?jHj?jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``const char *lvl`` loglevel ``const struct pcpu_alloc_info *ai`` allocation info to dump **Description** Print out information about **ai** using loglevel **lvl**.h](jM)}(h**Parameters**h]j)}(hjIh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjCubj)}(hhh](j)}(h``const char *lvl`` loglevel h](j)}(h``const char *lvl``h]jS)}(hjhh]hconst char *lvl}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjfubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjbubj)}(hhh]jM)}(hloglevelh]hloglevel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj}hM hj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj}hM hj_ubj)}(h=``const struct pcpu_alloc_info *ai`` allocation info to dump h](j)}(h$``const struct pcpu_alloc_info *ai``h]jS)}(hjh]h const struct pcpu_alloc_info *ai}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(hallocation info to dumph]hallocation info to dump}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hj_ubeh}(h]h ]h"]h$]h&]uh1jhjCubjM)}(h**Description**h]j)}(hj܀h]h Description}(hjހhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjڀubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjCubjM)}(h:Print out information about **ai** using loglevel **lvl**.h](hPrint out information about }(hjhhhNhNubj)}(h**ai**h]hai}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh using loglevel }(hjhhhNhNubj)}(h**lvl**h]hlvl}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjCubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#pcpu_setup_first_chunk (C function)c.pcpu_setup_first_chunkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hOvoid pcpu_setup_first_chunk (const struct pcpu_alloc_info *ai, void *base_addr)h]h)}(hNvoid pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, void *base_addr)h](j)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM ubj)}(h h]h }(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjShM ubh)}(hpcpu_setup_first_chunkh]j)}(hpcpu_setup_first_chunkh]hpcpu_setup_first_chunk}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubah}(h]h ](jjeh"]h$]h&]jjuh1hhjAhhhjShM ubj )}(h3(const struct pcpu_alloc_info *ai, void *base_addr)h](j )}(h const struct pcpu_alloc_info *aih](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj~ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubh)}(hhh]j)}(hpcpu_alloc_infoh]hpcpu_alloc_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljhsbc.pcpu_setup_first_chunkasbuh1hhj~ubj)}(h h]h }(hjہhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj~ubj)}(haih]hai}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubj )}(hvoid *base_addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjF )}(hjI h]h*}(hj+hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(h base_addrh]h base_addr}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjzubeh}(h]h ]h"]h$]h&]jjuh1j hjAhhhjShM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj=hhhjShM ubah}(h]j8ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjShM hj:hhubj4)}(hhh]jM)}(h!initialize the first percpu chunkh]h!initialize the first percpu chunk}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj_hhubah}(h]h ]h"]h$]h&]uh1j3hj:hhhjShM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjzjHjzjIjJjKuh1hhhhjhNhNubj)}(hXz **Parameters** ``const struct pcpu_alloc_info *ai`` pcpu_alloc_info describing how to percpu area is shaped ``void *base_addr`` mapped address **Description** Initialize the first percpu chunk which contains the kernel static percpu area. This function is to be called from arch percpu area setup path. **ai** contains all information necessary to initialize the first chunk and prime the dynamic percpu allocator. **ai->static_size** is the size of static percpu area. **ai->reserved_size**, if non-zero, specifies the amount of bytes to reserve after the static area in the first chunk. This reserves the first chunk such that it's available only through reserved percpu allocation. This is primarily used to serve module percpu static areas on architectures where the addressing model has limited offset range for symbol relocations to guarantee module percpu symbols fall inside the relocatable range. **ai->dyn_size** determines the number of bytes available for dynamic allocation in the first chunk. The area between **ai->static_size** + **ai->reserved_size** + **ai->dyn_size** and **ai->unit_size** is unused. **ai->unit_size** specifies unit size and must be aligned to PAGE_SIZE and equal to or larger than **ai->static_size** + **ai->reserved_size** + **ai->dyn_size**. **ai->atom_size** is the allocation atom size and used as alignment for vm areas. **ai->alloc_size** is the allocation size and always multiple of **ai->atom_size**. This is larger than **ai->atom_size** if **ai->unit_size** is larger than **ai->atom_size**. **ai->nr_groups** and **ai->groups** describe virtual memory layout of percpu areas. Units which should be colocated are put into the same group. Dynamic VM areas will be allocated according to these groupings. If **ai->nr_groups** is zero, a single group containing all units is assumed. The caller should have mapped the first chunk at **base_addr** and copied static data to each unit. The first chunk will always contain a static and a dynamic region. However, the static region is not managed by any chunk. If the first chunk also contains a reserved region, it is served by two chunks - one for the reserved region and one for the dynamic region. They share the same vm, but use offset regions in the area allocation map. The chunk serving the dynamic region is circulated in the chunk slots and available for dynamic allocation like any other chunk.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubj)}(hhh](j)}(h]``const struct pcpu_alloc_info *ai`` pcpu_alloc_info describing how to percpu area is shaped h](j)}(h$``const struct pcpu_alloc_info *ai``h]jS)}(hjh]h const struct pcpu_alloc_info *ai}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(h7pcpu_alloc_info describing how to percpu area is shapedh]h7pcpu_alloc_info describing how to percpu area is shaped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h#``void *base_addr`` mapped address h](j)}(h``void *base_addr``h]jS)}(hj܂h]hvoid *base_addr}(hjނhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjڂubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjւubj)}(hhh]jM)}(hmapped addressh]hmapped address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjւubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhj~ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(hInitialize the first percpu chunk which contains the kernel static percpu area. This function is to be called from arch percpu area setup path.h]hInitialize the first percpu chunk which contains the kernel static percpu area. This function is to be called from arch percpu area setup path.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(ho**ai** contains all information necessary to initialize the first chunk and prime the dynamic percpu allocator.h](j)}(h**ai**h]hai}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubhi contains all information necessary to initialize the first chunk and prime the dynamic percpu allocator.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(h6**ai->static_size** is the size of static percpu area.h](j)}(h**ai->static_size**h]hai->static_size}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh# is the size of static percpu area.}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(hX**ai->reserved_size**, if non-zero, specifies the amount of bytes to reserve after the static area in the first chunk. This reserves the first chunk such that it's available only through reserved percpu allocation. This is primarily used to serve module percpu static areas on architectures where the addressing model has limited offset range for symbol relocations to guarantee module percpu symbols fall inside the relocatable range.h](j)}(h**ai->reserved_size**h]hai->reserved_size}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubhX, if non-zero, specifies the amount of bytes to reserve after the static area in the first chunk. This reserves the first chunk such that it’s available only through reserved percpu allocation. This is primarily used to serve module percpu static areas on architectures where the addressing model has limited offset range for symbol relocations to guarantee module percpu symbols fall inside the relocatable range.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(h**ai->dyn_size** determines the number of bytes available for dynamic allocation in the first chunk. The area between **ai->static_size** + **ai->reserved_size** + **ai->dyn_size** and **ai->unit_size** is unused.h](j)}(h**ai->dyn_size**h]h ai->dyn_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhg determines the number of bytes available for dynamic allocation in the first chunk. The area between }(hjhhhNhNubj)}(h**ai->static_size**h]hai->static_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h**ai->reserved_size**h]hai->reserved_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h**ai->dyn_size**h]h ai->dyn_size}(hj̓hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**ai->unit_size**h]h ai->unit_size}(hj߃hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is unused.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(h**ai->unit_size** specifies unit size and must be aligned to PAGE_SIZE and equal to or larger than **ai->static_size** + **ai->reserved_size** + **ai->dyn_size**.h](j)}(h**ai->unit_size**h]h ai->unit_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhR specifies unit size and must be aligned to PAGE_SIZE and equal to or larger than }(hjhhhNhNubj)}(h**ai->static_size**h]hai->static_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h**ai->reserved_size**h]hai->reserved_size}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh + }(hjhhhNhNubj)}(h**ai->dyn_size**h]h ai->dyn_size}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(hQ**ai->atom_size** is the allocation atom size and used as alignment for vm areas.h](j)}(h**ai->atom_size**h]h ai->atom_size}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh@ is the allocation atom size and used as alignment for vm areas.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(h**ai->alloc_size** is the allocation size and always multiple of **ai->atom_size**. This is larger than **ai->atom_size** if **ai->unit_size** is larger than **ai->atom_size**.h](j)}(h**ai->alloc_size**h]hai->alloc_size}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh/ is the allocation size and always multiple of }(hjhhhhNhNubj)}(h**ai->atom_size**h]h ai->atom_size}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh. This is larger than }(hjhhhhNhNubj)}(h**ai->atom_size**h]h ai->atom_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh if }(hjhhhhNhNubj)}(h**ai->unit_size**h]h ai->unit_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh is larger than }(hjhhhhNhNubj)}(h**ai->atom_size**h]h ai->atom_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(hX#**ai->nr_groups** and **ai->groups** describe virtual memory layout of percpu areas. Units which should be colocated are put into the same group. Dynamic VM areas will be allocated according to these groupings. If **ai->nr_groups** is zero, a single group containing all units is assumed.h](j)}(h**ai->nr_groups**h]h ai->nr_groups}(hjфhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̈́ubh and }(hj̈́hhhNhNubj)}(h**ai->groups**h]h ai->groups}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̈́ubh describe virtual memory layout of percpu areas. Units which should be colocated are put into the same group. Dynamic VM areas will be allocated according to these groupings. If }(hj̈́hhhNhNubj)}(h**ai->nr_groups**h]h ai->nr_groups}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj̈́ubh9 is zero, a single group containing all units is assumed.}(hj̈́hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(hcThe caller should have mapped the first chunk at **base_addr** and copied static data to each unit.h](h1The caller should have mapped the first chunk at }(hjhhhNhNubj)}(h **base_addr**h]h base_addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh% and copied static data to each unit.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubjM)}(hXThe first chunk will always contain a static and a dynamic region. However, the static region is not managed by any chunk. If the first chunk also contains a reserved region, it is served by two chunks - one for the reserved region and one for the dynamic region. They share the same vm, but use offset regions in the area allocation map. The chunk serving the dynamic region is circulated in the chunk slots and available for dynamic allocation like any other chunk.h]hXThe first chunk will always contain a static and a dynamic region. However, the static region is not managed by any chunk. If the first chunk also contains a reserved region, it is served by two chunks - one for the reserved region and one for the dynamic region. They share the same vm, but use offset regions in the area allocation map. The chunk serving the dynamic region is circulated in the chunk slots and available for dynamic allocation like any other chunk.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"pcpu_build_alloc_info (C function)c.pcpu_build_alloc_infohNtauh1hhjhhhNhNubh)}(hhh](h)}(hstruct pcpu_alloc_info * pcpu_build_alloc_info (size_t reserved_size, size_t dyn_size, size_t atom_size, pcpu_fc_cpu_distance_fn_t cpu_distance_fn)h]h)}(hstruct pcpu_alloc_info *pcpu_build_alloc_info(size_t reserved_size, size_t dyn_size, size_t atom_size, pcpu_fc_cpu_distance_fn_t cpu_distance_fn)h](j5)}(hj8h]hstruct}(hj^hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjZhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM ubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjkhM ubh)}(hhh]j)}(hpcpu_alloc_infoh]hpcpu_alloc_info}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlpcpu_build_alloc_infosbc.pcpu_build_alloc_infoasbuh1hhjZhhhjkhM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhjkhM ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjZhhhjkhM ubh)}(hpcpu_build_alloc_infoh]j)}(hjh]hpcpu_build_alloc_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjZhhhjkhM ubj )}(hd(size_t reserved_size, size_t dyn_size, size_t atom_size, pcpu_fc_cpu_distance_fn_t cpu_distance_fn)h](j )}(hsize_t reserved_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjۅhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj؅ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj݅modnameN classnameNjpjs)}jv]jc.pcpu_build_alloc_infoasbuh1hhjԅubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԅubj)}(h reserved_sizeh]h reserved_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԅubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjЅubj )}(hsize_t dyn_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj%modnameN classnameNjpjs)}jv]jc.pcpu_build_alloc_infoasbuh1hhjubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdyn_sizeh]hdyn_size}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjЅubj )}(hsize_t atom_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmmodnameN classnameNjpjs)}jv]jc.pcpu_build_alloc_infoasbuh1hhjdubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj)}(h atom_sizeh]h atom_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjЅubj )}(h)pcpu_fc_cpu_distance_fn_t cpu_distance_fnh](h)}(hhh]j)}(hpcpu_fc_cpu_distance_fn_th]hpcpu_fc_cpu_distance_fn_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.pcpu_build_alloc_infoasbuh1hhjubj)}(h h]h }(hjцhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpu_distance_fnh]hcpu_distance_fn}(hj߆hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjЅubeh}(h]h ]h"]h$]h&]jjuh1j hjZhhhjkhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjVhhhjkhM ubah}(h]jQah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjkhM hjShhubj4)}(hhh]jM)}(h3build alloc_info considering distances between CPUsh]h3build alloc_info considering distances between CPUs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjShhhjkhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj!jHj!jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``size_t reserved_size`` the size of reserved percpu area in bytes ``size_t dyn_size`` minimum free size for dynamic allocation in bytes ``size_t atom_size`` allocation atom size ``pcpu_fc_cpu_distance_fn_t cpu_distance_fn`` callback to determine distance between cpus, optional **Description** This function determines grouping of units, their mappings to cpus and other parameters considering needed percpu size, allocation atom size and distances between CPUs. Groups are always multiples of atom size and CPUs which are of LOCAL_DISTANCE both ways are grouped together and share space for units in the same group. The returned configuration is guaranteed to have CPUs on different nodes on different groups and >=75% usage of allocated virtual address space. **Return** On success, pointer to the new allocation_info is returned. On failure, ERR_PTR value is returned.h](jM)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj%ubj)}(hhh](j)}(hC``size_t reserved_size`` the size of reserved percpu area in bytes h](j)}(h``size_t reserved_size``h]jS)}(hjJh]hsize_t reserved_size}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjHubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjDubj)}(hhh]jM)}(h)the size of reserved percpu area in bytesh]h)the size of reserved percpu area in bytes}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_hM hj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj_hM hjAubj)}(hF``size_t dyn_size`` minimum free size for dynamic allocation in bytes h](j)}(h``size_t dyn_size``h]jS)}(hjh]hsize_t dyn_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj}ubj)}(hhh]jM)}(h1minimum free size for dynamic allocation in bytesh]h1minimum free size for dynamic allocation in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhM hjAubj)}(h*``size_t atom_size`` allocation atom size h](j)}(h``size_t atom_size``h]jS)}(hjh]hsize_t atom_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(hallocation atom sizeh]hallocation atom size}(hjՇhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjчhM hj҇ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjчhM hjAubj)}(hd``pcpu_fc_cpu_distance_fn_t cpu_distance_fn`` callback to determine distance between cpus, optional h](j)}(h-``pcpu_fc_cpu_distance_fn_t cpu_distance_fn``h]jS)}(hjh]h)pcpu_fc_cpu_distance_fn_t cpu_distance_fn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(h5callback to determine distance between cpus, optionalh]h5callback to determine distance between cpus, optional}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hM hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hM hjAubeh}(h]h ]h"]h$]h&]uh1jhj%ubjM)}(h**Description**h]j)}(hj0h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj%ubjM)}(hThis function determines grouping of units, their mappings to cpus and other parameters considering needed percpu size, allocation atom size and distances between CPUs.h]hThis function determines grouping of units, their mappings to cpus and other parameters considering needed percpu size, allocation atom size and distances between CPUs.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj%ubjM)}(hX+Groups are always multiples of atom size and CPUs which are of LOCAL_DISTANCE both ways are grouped together and share space for units in the same group. The returned configuration is guaranteed to have CPUs on different nodes on different groups and >=75% usage of allocated virtual address space.h]hX+Groups are always multiples of atom size and CPUs which are of LOCAL_DISTANCE both ways are grouped together and share space for units in the same group. The returned configuration is guaranteed to have CPUs on different nodes on different groups and >=75% usage of allocated virtual address space.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj%ubjM)}(h **Return**h]j)}(hjfh]hReturn}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj%ubjM)}(hcOn success, pointer to the new allocation_info is returned. On failure, ERR_PTR value is returned.h]hcOn success, pointer to the new allocation_info is returned. On failure, ERR_PTR value is returned.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#pcpu_embed_first_chunk (C function)c.pcpu_embed_first_chunkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hint pcpu_embed_first_chunk (size_t reserved_size, size_t dyn_size, size_t atom_size, pcpu_fc_cpu_distance_fn_t cpu_distance_fn, pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn)h]h)}(hint pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size, size_t atom_size, pcpu_fc_cpu_distance_fn_t cpu_distance_fn, pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(hpcpu_embed_first_chunkh]j)}(hpcpu_embed_first_chunkh]hpcpu_embed_first_chunk}(hj̈hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjȈubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(h(size_t reserved_size, size_t dyn_size, size_t atom_size, pcpu_fc_cpu_distance_fn_t cpu_distance_fn, pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn)h](j )}(hsize_t reserved_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljΈsbc.pcpu_embed_first_chunkasbuh1hhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h reserved_sizeh]h reserved_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hsize_t dyn_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj7modnameN classnameNjpjs)}jv]jc.pcpu_embed_first_chunkasbuh1hhj.ubj)}(h h]h }(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hdyn_sizeh]hdyn_size}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hsize_t atom_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.pcpu_embed_first_chunkasbuh1hhjvubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubj)}(h atom_sizeh]h atom_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h)pcpu_fc_cpu_distance_fn_t cpu_distance_fnh](h)}(hhh]j)}(hpcpu_fc_cpu_distance_fn_th]hpcpu_fc_cpu_distance_fn_t}(hjʼnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj‰ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjljmodnameN classnameNjpjs)}jv]jc.pcpu_embed_first_chunkasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcpu_distance_fnh]hcpu_distance_fn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h%pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fnh](h)}(hhh]j)}(hpcpu_fc_cpu_to_node_fn_th]hpcpu_fc_cpu_to_node_fn_t}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.pcpu_embed_first_chunkasbuh1hhjubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h cpu_to_nd_fnh]h cpu_to_nd_fn}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h)embed the first percpu chunk into bootmemh]h)embed the first percpu chunk into bootmem}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj`hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj{jHj{jIjJjKuh1hhhhjhNhNubj)}(hXa**Parameters** ``size_t reserved_size`` the size of reserved percpu area in bytes ``size_t dyn_size`` minimum free size for dynamic allocation in bytes ``size_t atom_size`` allocation atom size ``pcpu_fc_cpu_distance_fn_t cpu_distance_fn`` callback to determine distance between cpus, optional ``pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn`` callback to convert cpu to it's node, optional **Description** This is a helper to ease setting up embedded first percpu chunk and can be called where pcpu_setup_first_chunk() is expected. If this function is used to setup the first chunk, it is allocated by calling pcpu_fc_alloc and used as-is without being mapped into vmalloc area. Allocations are always whole multiples of **atom_size** aligned to **atom_size**. This enables the first chunk to piggy back on the linear physical mapping which often uses larger page size. Please note that this can result in very sparse cpu->unit mapping on NUMA machines thus requiring large vmalloc address space. Don't use this allocator if vmalloc space is not orders of magnitude larger than distances between node memory addresses (ie. 32bit NUMA machines). **dyn_size** specifies the minimum dynamic area size. If the needed size is smaller than the minimum or specified unit size, the leftover is returned using pcpu_fc_free. **Return** 0 on success, -errno on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh](j)}(hC``size_t reserved_size`` the size of reserved percpu area in bytes h](j)}(h``size_t reserved_size``h]jS)}(hjh]hsize_t reserved_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(h)the size of reserved percpu area in bytesh]h)the size of reserved percpu area in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hF``size_t dyn_size`` minimum free size for dynamic allocation in bytes h](j)}(h``size_t dyn_size``h]jS)}(hj݊h]hsize_t dyn_size}(hjߊhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjۊubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hj׊ubj)}(hhh]jM)}(h1minimum free size for dynamic allocation in bytesh]h1minimum free size for dynamic allocation in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhj׊ubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h*``size_t atom_size`` allocation atom size h](j)}(h``size_t atom_size``h]jS)}(hjh]hsize_t atom_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(hallocation atom sizeh]hallocation atom size}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+hM hj,ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj+hM hjubj)}(hd``pcpu_fc_cpu_distance_fn_t cpu_distance_fn`` callback to determine distance between cpus, optional h](j)}(h-``pcpu_fc_cpu_distance_fn_t cpu_distance_fn``h]jS)}(hjOh]h)pcpu_fc_cpu_distance_fn_t cpu_distance_fn}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjMubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjIubj)}(hhh]jM)}(h5callback to determine distance between cpus, optionalh]h5callback to determine distance between cpus, optional}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdhM hjeubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjdhM hjubj)}(hY``pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn`` callback to convert cpu to it's node, optional h](j)}(h)``pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn``h]jS)}(hjh]h%pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubj)}(hhh]jM)}(h.callback to convert cpu to it's node, optionalh]h0callback to convert cpu to it’s node, optional}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjËh]h Description}(hjŋhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(h}This is a helper to ease setting up embedded first percpu chunk and can be called where pcpu_setup_first_chunk() is expected.h]h}This is a helper to ease setting up embedded first percpu chunk and can be called where pcpu_setup_first_chunk() is expected.}(hjًhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(hIf this function is used to setup the first chunk, it is allocated by calling pcpu_fc_alloc and used as-is without being mapped into vmalloc area. Allocations are always whole multiples of **atom_size** aligned to **atom_size**.h](hIf this function is used to setup the first chunk, it is allocated by calling pcpu_fc_alloc and used as-is without being mapped into vmalloc area. Allocations are always whole multiples of }(hjhhhNhNubj)}(h **atom_size**h]h atom_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh aligned to }(hjhhhNhNubj)}(h **atom_size**h]h atom_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(hXThis enables the first chunk to piggy back on the linear physical mapping which often uses larger page size. Please note that this can result in very sparse cpu->unit mapping on NUMA machines thus requiring large vmalloc address space. Don't use this allocator if vmalloc space is not orders of magnitude larger than distances between node memory addresses (ie. 32bit NUMA machines).h]hXThis enables the first chunk to piggy back on the linear physical mapping which often uses larger page size. Please note that this can result in very sparse cpu->unit mapping on NUMA machines thus requiring large vmalloc address space. Don’t use this allocator if vmalloc space is not orders of magnitude larger than distances between node memory addresses (ie. 32bit NUMA machines).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(h5**dyn_size** specifies the minimum dynamic area size.h](j)}(h **dyn_size**h]hdyn_size}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh) specifies the minimum dynamic area size.}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(hsIf the needed size is smaller than the minimum or specified unit size, the leftover is returned using pcpu_fc_free.h]hsIf the needed size is smaller than the minimum or specified unit size, the leftover is returned using pcpu_fc_free.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(h **Return**h]j)}(hjXh]hReturn}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubjM)}(h 0 on success, -errno on failure.h]h 0 on success, -errno on failure.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"pcpu_page_first_chunk (C function)c.pcpu_page_first_chunkhNtauh1hhjhhhNhNubh)}(hhh](h)}(hWint pcpu_page_first_chunk (size_t reserved_size, pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn)h]h)}(hVint pcpu_page_first_chunk(size_t reserved_size, pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMu ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMu ubh)}(hpcpu_page_first_chunkh]j)}(hpcpu_page_first_chunkh]hpcpu_page_first_chunk}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMu ubj )}(h=(size_t reserved_size, pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn)h](j )}(hsize_t reserved_sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj݌hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڌubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjߌmodnameN classnameNjpjs)}jv]jy)}jljsbc.pcpu_page_first_chunkasbuh1hhj֌ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֌ubj)}(h reserved_sizeh]h reserved_size}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj֌ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjҌubj )}(h%pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fnh](h)}(hhh]j)}(hpcpu_fc_cpu_to_node_fn_th]hpcpu_fc_cpu_to_node_fn_t}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj)modnameN classnameNjpjs)}jv]jc.pcpu_page_first_chunkasbuh1hhj ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h cpu_to_nd_fnh]h cpu_to_nd_fn}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjҌubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMu ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMu ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMu hjhhubj4)}(hhh]jM)}(h)map the first chunk using PAGE_SIZE pagesh]h)map the first chunk using PAGE_SIZE pages}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMu hjzhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMu ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``size_t reserved_size`` the size of reserved percpu area in bytes ``pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn`` callback to convert cpu to it's node, optional **Description** This is a helper to ease setting up page-remapped first percpu chunk and can be called where pcpu_setup_first_chunk() is expected. This is the basic allocator. Static percpu area is allocated page-by-page into vmalloc area. **Return** 0 on success, -errno on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMy hjubj)}(hhh](j)}(hC``size_t reserved_size`` the size of reserved percpu area in bytes h](j)}(h``size_t reserved_size``h]jS)}(hjh]hsize_t reserved_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMv hjubj)}(hhh]jM)}(h)the size of reserved percpu area in bytesh]h)the size of reserved percpu area in bytes}(hj׍hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjӍhMv hjԍubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjӍhMv hjubj)}(hY``pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn`` callback to convert cpu to it's node, optional h](j)}(h)``pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn``h]jS)}(hjh]h%pcpu_fc_cpu_to_node_fn_t cpu_to_nd_fn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMw hjubj)}(hhh]jM)}(h.callback to convert cpu to it's node, optionalh]h0callback to convert cpu to it’s node, optional}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hMw hj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMw hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj2h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMy hjubjM)}(hThis is a helper to ease setting up page-remapped first percpu chunk and can be called where pcpu_setup_first_chunk() is expected.h]hThis is a helper to ease setting up page-remapped first percpu chunk and can be called where pcpu_setup_first_chunk() is expected.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chMx hjubjM)}(h]This is the basic allocator. Static percpu area is allocated page-by-page into vmalloc area.h]h]This is the basic allocator. Static percpu area is allocated page-by-page into vmalloc area.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM{ hjubjM)}(h **Return**h]j)}(hjhh]hReturn}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM~ hjubjM)}(h 0 on success, -errno on failure.h]h 0 on success, -errno on failure.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:129: ./mm/percpu.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#copy_from_user_nofault (C function)c.copy_from_user_nofaulthNtauh1hhjhhhNhNubh)}(hhh](h)}(hLlong copy_from_user_nofault (void *dst, const void __user *src, size_t size)h]h)}(hKlong copy_from_user_nofault(void *dst, const void __user *src, size_t size)h](j)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKpubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKpubh)}(hcopy_from_user_nofaulth]j)}(hcopy_from_user_nofaulth]hcopy_from_user_nofault}(hjΎhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjʎubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKpubj )}(h0(void *dst, const void __user *src, size_t size)h](j )}(h void *dsth](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdsth]hdst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst void __user *srch](j5)}(hjh]hconst}(hj,hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hvoidh]hvoid}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh__user}(hj(hhhNhNubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF )}(hjI h]h*}(hjuhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj(ubj)}(hsrch]hsrc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljЎsbc.copy_from_user_nofaultasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hj̏hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhKpubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKpubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKphjhhubj4)}(hhh]jM)}(h1safely attempt to read from a user-space locationh]h1safely attempt to read from a user-space location}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKphjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKpubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXV**Parameters** ``void *dst`` pointer to the buffer that shall take the data ``const void __user *src`` address to read from. This must be a user address. ``size_t size`` size of the data chunk **Description** Safely read from user address **src** to the buffer at **dst**. If a kernel fault happens, handle that and return -EFAULT.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKthjubj)}(hhh](j)}(h=``void *dst`` pointer to the buffer that shall take the data h](j)}(h ``void *dst``h]jS)}(hj7h]h void *dst}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKqhj1ubj)}(hhh]jM)}(h.pointer to the buffer that shall take the datah]h.pointer to the buffer that shall take the data}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhKqhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhKqhj.ubj)}(hN``const void __user *src`` address to read from. This must be a user address. h](j)}(h``const void __user *src``h]jS)}(hjph]hconst void __user *src}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKrhjjubj)}(hhh]jM)}(h2address to read from. This must be a user address.h]h2address to read from. This must be a user address.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKrhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhKrhj.ubj)}(h'``size_t size`` size of the data chunk h](j)}(h``size_t size``h]jS)}(hjh]h size_t size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKshjubj)}(hhh]jM)}(hsize of the data chunkh]hsize of the data chunk}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKshjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKshj.ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKuhjubjM)}(hzSafely read from user address **src** to the buffer at **dst**. If a kernel fault happens, handle that and return -EFAULT.h](hSafely read from user address }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to the buffer at }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh<. If a kernel fault happens, handle that and return -EFAULT.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKthjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!copy_to_user_nofault (C function)c.copy_to_user_nofaulthNtauh1hhjhhhNhNubh)}(hhh](h)}(hJlong copy_to_user_nofault (void __user *dst, const void *src, size_t size)h]h)}(hIlong copy_to_user_nofault(void __user *dst, const void *src, size_t size)h](j)}(hlongh]hlong}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhj[hKubh)}(hcopy_to_user_nofaulth]j)}(hcopy_to_user_nofaulth]hcopy_to_user_nofault}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjIhhhj[hKubj )}(h0(void __user *dst, const void *src, size_t size)h](j )}(hvoid __user *dsth](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh__user}(hjhhhNhNubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hdsth]hdst}(hjőhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst void *srch](j5)}(hjh]hconst}(hjޑhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjڑubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڑubj)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڑubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڑubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjڑubj)}(hsrch]hsrc}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjڑubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h size_t sizeh](h)}(hhh]j)}(hsize_th]hsize_t}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@modnameN classnameNjpjs)}jv]jy)}jljpsbc.copy_to_user_nofaultasbuh1hhj7ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hsizeh]hsize}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjIhhhj[hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjEhhhj[hKubah}(h]j@ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj[hKhjBhhubj4)}(hhh]jM)}(h0safely attempt to write to a user-space locationh]h0safely attempt to write to a user-space location}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjBhhhj[hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX/**Parameters** ``void __user *dst`` address to write to ``const void *src`` pointer to the data that shall be written ``size_t size`` size of the data chunk **Description** Safely write to address **dst** from the buffer at **src**. If a kernel fault happens, handle that and return -EFAULT.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubj)}(hhh](j)}(h)``void __user *dst`` address to write to h](j)}(h``void __user *dst``h]jS)}(hjגh]hvoid __user *dst}(hjْhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjՒubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjђubj)}(hhh]jM)}(haddress to write toh]haddress to write to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjђubeh}(h]h ]h"]h$]h&]uh1jhjhKhjΒubj)}(h>``const void *src`` pointer to the data that shall be written h](j)}(h``const void *src``h]jS)}(hjh]hconst void *src}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhj ubj)}(hhh]jM)}(h)pointer to the data that shall be writtenh]h)pointer to the data that shall be written}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%hKhj&ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjΒubj)}(h'``size_t size`` size of the data chunk h](j)}(h``size_t size``h]jS)}(hjIh]h size_t size}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjGubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjCubj)}(hhh]jM)}(hsize of the data chunkh]hsize of the data chunk}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj^hKhj_ubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj^hKhjΒubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubjM)}(hwSafely write to address **dst** from the buffer at **src**. If a kernel fault happens, handle that and return -EFAULT.h](hSafely write to address }(hjhhhNhNubj)}(h**dst**h]hdst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh from the buffer at }(hjhhhNhNubj)}(h**src**h]hsrc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh=. If a kernel fault happens, handle that and return -EFAULT.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&strncpy_from_user_nofault (C function)c.strncpy_from_user_nofaulthNtauh1hhjhhhNhNubh)}(hhh](h)}(hVlong strncpy_from_user_nofault (char *dst, const void __user *unsafe_addr, long count)h]h)}(hUlong strncpy_from_user_nofault(char *dst, const void __user *unsafe_addr, long count)h](j)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubh)}(hstrncpy_from_user_nofaulth]j)}(hstrncpy_from_user_nofaulth]hstrncpy_from_user_nofault}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKubj )}(h7(char *dst, const void __user *unsafe_addr, long count)h](j )}(h char *dsth](j)}(hcharh]hchar}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjF )}(hjI h]h*}(hjFhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj&ubj)}(hdsth]hdst}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj"ubj )}(hconst void __user *unsafe_addrh](j5)}(hjh]hconst}(hjlhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubh__user}(hjhhhhNhNubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhubj)}(h unsafe_addrh]h unsafe_addr}(hj”hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj"ubj )}(h long counth](j)}(hlongh]hlong}(hj۔hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjהubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjהubj)}(hcounth]hcount}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjהubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj"ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]jaW)}(hhh]j/)}(h6Copy a NUL terminated string from unsafe user address.h]jM)}(hj&h]h6Copy a NUL terminated string from unsafe user address.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhj$ubah}(h]h ]h"]h$]h&]uh1j/hj!hhhj5hNubah}(h]h ]h"]h$]h&]jWjWuh1j`Whj5hKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjKjHjKjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``char *dst`` Destination address, in kernel space. This buffer must be at least **count** bytes long. ``const void __user *unsafe_addr`` Unsafe user address. ``long count`` Maximum number of bytes to copy, including the trailing NUL. **Description** Copies a NUL-terminated string from unsafe user address to kernel buffer. On success, returns the length of the string INCLUDING the trailing NUL. If access fails, returns -EFAULT (some data may have been copied and the trailing NUL added). If **count** is smaller than the length of the string, copies **count**-1 bytes, sets the last byte of **dst** buffer to NUL and returns **count**.h](jM)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjOubj)}(hhh](j)}(hh``char *dst`` Destination address, in kernel space. This buffer must be at least **count** bytes long. h](j)}(h ``char *dst``h]jS)}(hjth]h char *dst}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjrubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjnubj)}(hhh]jM)}(hYDestination address, in kernel space. This buffer must be at least **count** bytes long.h](hDDestination address, in kernel space. This buffer must be at least }(hjhhhNhNubj)}(h **count**h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh bytes long.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjhKhjkubj)}(h8``const void __user *unsafe_addr`` Unsafe user address. h](j)}(h"``const void __user *unsafe_addr``h]jS)}(hjh]hconst void __user *unsafe_addr}(hj•hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubj)}(hhh]jM)}(hUnsafe user address.h]hUnsafe user address.}(hjٕhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjՕhKhj֕ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjՕhKhjkubj)}(hL``long count`` Maximum number of bytes to copy, including the trailing NUL. h](j)}(h``long count``h]jS)}(hjh]h long count}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubj)}(hhh]jM)}(h count". On exception (or invalid count), returns 0. Unlike strnlen_user, this can be used from IRQ handler etc. because it disables pagefaults.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubj)}(hhh](j)}(h:``const void __user *unsafe_addr`` The string to measure. h](j)}(h"``const void __user *unsafe_addr``h]jS)}(hj3h]hconst void __user *unsafe_addr}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj1ubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhj-ubj)}(hhh]jM)}(hThe string to measure.h]hThe string to measure.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHhKhjIubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhjHhKhj*ubj)}(h-``long count`` Maximum count (including NUL) h](j)}(h``long count``h]jS)}(hjlh]h long count}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjfubj)}(hhh]jM)}(hMaximum count (including NUL)h]hMaximum count (including NUL)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjhKhj*ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubjM)}(hHGet the size of a NUL-terminated string in user space without pagefault.h]hHGet the size of a NUL-terminated string in user space without pagefault.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubjM)}(h=Returns the size of the string INCLUDING the terminating NUL.h]h=Returns the size of the string INCLUDING the terminating NUL.}(hj̘hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubjM)}(hIf the string is too long, returns a number larger than **count**. User has to check the return value against "> count". On exception (or invalid count), returns 0.h](h8If the string is too long, returns a number larger than }(hjۘhhhNhNubj)}(h **count**h]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjۘubhg. User has to check the return value against “> count”. On exception (or invalid count), returns 0.}(hjۘhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubjM)}(h[Unlike strnlen_user, this can be used from IRQ handler etc. because it disables pagefaults.h]h[Unlike strnlen_user, this can be used from IRQ handler etc. because it disables pagefaults.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:130: ./mm/maccess.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&writeback_throttling_sane (C function)c.writeback_throttling_sanehNtauh1hhjhhhNhNubh)}(hhh](h)}(h8bool writeback_throttling_sane (struct scan_control *sc)h]h)}(h7bool writeback_throttling_sane(struct scan_control *sc)h](j)}(hj-h]hbool}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj8hKubh)}(hwriteback_throttling_saneh]j)}(hwriteback_throttling_saneh]hwriteback_throttling_sane}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ](jjeh"]h$]h&]jjuh1hhj'hhhj8hKubj )}(h(struct scan_control *sc)h]j )}(hstruct scan_control *sch](j5)}(hj8h]hstruct}(hjghhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjcubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubh)}(hhh]j)}(h scan_controlh]h scan_control}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljMsbc.writeback_throttling_saneasbuh1hhjcubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjcubj)}(hsch]hsc}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj_ubah}(h]h ]h"]h$]h&]jjuh1j hj'hhhj8hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj#hhhj8hKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj8hKhj hhubj4)}(hhh]jM)}(h2is the usual dirty throttling mechanism available?h]h2is the usual dirty throttling mechanism available?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj8hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct scan_control *sc`` scan_control in question **Description** The normal page dirty throttling mechanism in balance_dirty_pages() is completely broken with the legacy memcg and direct stalling in shrink_folio_list() is used for throttling instead, which lacks all the niceties such as fairness, adaptive pausing, bandwidth proportional allocation and configurability. This function tests whether the vmscan currently in progress can assume that the normal dirty throttling mechanism is operational.h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKhjubj)}(hhh]j)}(h5``struct scan_control *sc`` scan_control in question h](j)}(h``struct scan_control *sc``h]jS)}(hj+h]hstruct scan_control *sc}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj)ubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKhj%ubj)}(hhh]jM)}(hscan_control in questionh]hscan_control in question}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj@hKhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhj"ubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjfh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKhjubjM)}(hX1The normal page dirty throttling mechanism in balance_dirty_pages() is completely broken with the legacy memcg and direct stalling in shrink_folio_list() is used for throttling instead, which lacks all the niceties such as fairness, adaptive pausing, bandwidth proportional allocation and configurability.h]hX1The normal page dirty throttling mechanism in balance_dirty_pages() is completely broken with the legacy memcg and direct stalling in shrink_folio_list() is used for throttling instead, which lacks all the niceties such as fairness, adaptive pausing, bandwidth proportional allocation and configurability.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKhjubjM)}(hThis function tests whether the vmscan currently in progress can assume that the normal dirty throttling mechanism is operational.h]hThis function tests whether the vmscan currently in progress can assume that the normal dirty throttling mechanism is operational.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hlruvec_lru_size (C function)c.lruvec_lru_sizehNtauh1hhjhhhNhNubh)}(hhh](h)}(hVunsigned long lruvec_lru_size (struct lruvec *lruvec, enum lru_list lru, int zone_idx)h]h)}(hUunsigned long lruvec_lru_size(struct lruvec *lruvec, enum lru_list lru, int zone_idx)h](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMubj)}(h h]h }(hjɚhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjȚhMubj)}(hlongh]hlong}(hjךhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjȚhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjȚhMubh)}(hlruvec_lru_sizeh]j)}(hlruvec_lru_sizeh]hlruvec_lru_size}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjȚhMubj )}(h8(struct lruvec *lruvec, enum lru_list lru, int zone_idx)h](j )}(hstruct lruvec *lruvech](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hlruvech]hlruvec}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj3modnameN classnameNjpjs)}jv]jy)}jljsbc.lruvec_lru_sizeasbuh1hhjubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj_hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hlruvech]hlruvec}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(henum lru_list lruh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hlru_listh]hlru_list}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jMc.lruvec_lru_sizeasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlruh]hlru}(hjϛhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(h int zone_idxh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hzone_idxh]hzone_idx}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjȚhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjȚhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjȚhMhjhhubj4)}(hhh]jM)}(h2Returns the number of pages on the given LRU list.h]h2Returns the number of pages on the given LRU list.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj+hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjȚhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjFjHjFjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct lruvec *lruvec`` lru vector ``enum lru_list lru`` lru to use ``int zone_idx`` zones to consider (use MAX_NR_ZONES - 1 for the whole LRU list)h](jM)}(h**Parameters**h]j)}(hjPh]h Parameters}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjJubj)}(hhh](j)}(h%``struct lruvec *lruvec`` lru vector h](j)}(h``struct lruvec *lruvec``h]jS)}(hjoh]hstruct lruvec *lruvec}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjmubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjiubj)}(hhh]jM)}(h lru vectorh]h lru vector}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(h!``enum lru_list lru`` lru to use h](j)}(h``enum lru_list lru``h]jS)}(hjh]henum lru_list lru}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubj)}(hhh]jM)}(h lru to useh]h lru to use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubj)}(hP``int zone_idx`` zones to consider (use MAX_NR_ZONES - 1 for the whole LRU list)h](j)}(h``int zone_idx``h]jS)}(hjh]h int zone_idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjߜubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjۜubj)}(hhh]jM)}(h?zones to consider (use MAX_NR_ZONES - 1 for the whole LRU list)h]h?zones to consider (use MAX_NR_ZONES - 1 for the whole LRU list)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubah}(h]h ]h"]h$]h&]uh1jhjۜubeh}(h]h ]h"]h$]h&]uh1jhjhMhjfubeh}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hremove_mapping (C function)c.remove_mappinghNtauh1hhjhhhNhNubh)}(hhh](h)}(hHlong remove_mapping (struct address_space *mapping, struct folio *folio)h]h)}(hGlong remove_mapping(struct address_space *mapping, struct folio *folio)h](j)}(hlongh]hlong}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhjIhMubh)}(hremove_mappingh]j)}(hremove_mappingh]hremove_mapping}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubah}(h]h ](jjeh"]h$]h&]jjuh1hhj7hhhjIhMubj )}(h4(struct address_space *mapping, struct folio *folio)h](j )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjxhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubh)}(hhh]j)}(h address_spaceh]h address_space}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj^sbc.remove_mappingasbuh1hhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubjF )}(hjI h]h*}(hjĝhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjtubj)}(hmappingh]hmapping}(hjѝhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jc.remove_mappingasbuh1hhjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj4hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjpubeh}(h]h ]h"]h$]h&]jjuh1j hj7hhhjIhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj3hhhjIhMubah}(h]j.ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjIhMhj0hhubj4)}(hhh]jM)}(h+Attempt to remove a folio from its mapping.h]h+Attempt to remove a folio from its mapping.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjhhhubah}(h]h ]h"]h$]h&]uh1j3hj0hhhjIhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct address_space *mapping`` The address space. ``struct folio *folio`` The folio to remove. **Description** If the folio is dirty, under writeback or if someone else has a ref on it, removal will fail. **Return** The number of pages removed from the mapping. 0 if the folio could not be removed. **Context** The caller should have a single refcount on the folio and hold its lock.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubj)}(hhh](j)}(h5``struct address_space *mapping`` The address space. h](j)}(h!``struct address_space *mapping``h]jS)}(hjh]hstruct address_space *mapping}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubj)}(hhh]jM)}(hThe address space.h]hThe address space.}(hjŞhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjžubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h-``struct folio *folio`` The folio to remove. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjߞubj)}(hhh]jM)}(hThe folio to remove.h]hThe folio to remove.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjߞubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubjM)}(h]If the folio is dirty, under writeback or if someone else has a ref on it, removal will fail.h]h]If the folio is dirty, under writeback or if someone else has a ref on it, removal will fail.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubjM)}(h **Return**h]j)}(hjGh]hReturn}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubjM)}(hSThe number of pages removed from the mapping. 0 if the folio could not be removed.h]hSThe number of pages removed from the mapping. 0 if the folio could not be removed.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubjM)}(h **Context**h]j)}(hjnh]hContext}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubjM)}(hHThe caller should have a single refcount on the folio and hold its lock.h]hHThe caller should have a single refcount on the folio and hold its lock.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_putback_lru (C function)c.folio_putback_lruhNtauh1hhjhhhNhNubh)}(hhh](h)}(h,void folio_putback_lru (struct folio *folio)h]h)}(h+void folio_putback_lru(struct folio *folio)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM-ubj)}(h h]h }(hjŸhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM-ubh)}(hfolio_putback_lruh]j)}(hfolio_putback_lruh]hfolio_putback_lru}(hjԟhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjПubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM-ubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj֟sbc.folio_putback_lruasbuh1hhjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj<hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM-ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM-ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM-hjhhubj4)}(hhh]jM)}(h8Put previously isolated folio onto appropriate LRU list.h]h8Put previously isolated folio onto appropriate LRU list.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM-hjphhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM-ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` Folio to be returned to an LRU list. **Description** Add previously isolated **folio** to appropriate LRU list. The folio may still be unevictable for other reasons. **Context** lru_lock must not be held, interrupts must be enabled.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM1hjubj)}(hhh]j)}(h=``struct folio *folio`` Folio to be returned to an LRU list. h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM.hjubj)}(hhh]jM)}(h$Folio to be returned to an LRU list.h]h$Folio to be returned to an LRU list.}(hj͠hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjɠhM.hjʠubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjɠhM.hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM0hjubjM)}(hpAdd previously isolated **folio** to appropriate LRU list. The folio may still be unevictable for other reasons.h](hAdd previously isolated }(hjhhhNhNubj)}(h **folio**h]hfolio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhO to appropriate LRU list. The folio may still be unevictable for other reasons.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM/hjubjM)}(h **Context**h]j)}(hj(h]hContext}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM2hjubjM)}(h6lru_lock must not be held, interrupts must be enabled.h]h6lru_lock must not be held, interrupts must be enabled.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chM3hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_isolate_lru (C function)c.folio_isolate_lruhNtauh1hhjhhhNhNubh)}(hhh](h)}(h,bool folio_isolate_lru (struct folio *folio)h]h)}(h+bool folio_isolate_lru(struct folio *folio)h](j)}(hj-h]hbool}(hjmhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjihhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMubj)}(h h]h }(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjihhhjzhMubh)}(hfolio_isolate_lruh]j)}(hfolio_isolate_lruh]hfolio_isolate_lru}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjihhhjzhMubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjǡhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjġubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjɡmodnameN classnameNjpjs)}jv]jy)}jljsbc.folio_isolate_lruasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjihhhjzhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjehhhjzhMubah}(h]j`ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjzhMhjbhhubj4)}(hhh]jM)}(h)Try to isolate a folio from its LRU list.h]h)Try to isolate a folio from its LRU list.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj)hhubah}(h]h ]h"]h$]h&]uh1j3hjbhhhjzhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjDjHjDjIjJjKuh1hhhhjhNhNubj)}(hXR**Parameters** ``struct folio *folio`` Folio to isolate from its LRU list. **Description** Isolate a **folio** from an LRU list and adjust the vmstat statistic corresponding to whatever LRU list the folio was on. The folio will have its LRU flag cleared. If it was found on the active list, it will have the Active flag set. If it was found on the unevictable list, it will have the Unevictable flag set. These flags may need to be cleared by the caller before letting the page go. (1) Must be called with an elevated refcount on the folio. This is a fundamental difference from isolate_lru_folios() (which is called without a stable reference). (2) The lru_lock must not be held. (3) Interrupts must be enabled. **Context** **Return** true if the folio was removed from an LRU list. false if the folio was not on an LRU list.h](jM)}(h**Parameters**h]j)}(hjNh]h Parameters}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubj)}(hhh]j)}(h<``struct folio *folio`` Folio to isolate from its LRU list. h](j)}(h``struct folio *folio``h]jS)}(hjmh]hstruct folio *folio}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjgubj)}(hhh]jM)}(h#Folio to isolate from its LRU list.h]h#Folio to isolate from its LRU list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjhMhjdubah}(h]h ]h"]h$]h&]uh1jhjHubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubjM)}(hyIsolate a **folio** from an LRU list and adjust the vmstat statistic corresponding to whatever LRU list the folio was on.h](h Isolate a }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjƢhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf from an LRU list and adjust the vmstat statistic corresponding to whatever LRU list the folio was on.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubjM)}(hXThe folio will have its LRU flag cleared. If it was found on the active list, it will have the Active flag set. If it was found on the unevictable list, it will have the Unevictable flag set. These flags may need to be cleared by the caller before letting the page go.h]hXThe folio will have its LRU flag cleared. If it was found on the active list, it will have the Active flag set. If it was found on the unevictable list, it will have the Unevictable flag set. These flags may need to be cleared by the caller before letting the page go.}(hjߢhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubj/)}(hhh](j/)}(hMust be called with an elevated refcount on the folio. This is a fundamental difference from isolate_lru_folios() (which is called without a stable reference).h]jM)}(hMust be called with an elevated refcount on the folio. This is a fundamental difference from isolate_lru_folios() (which is called without a stable reference).h]hMust be called with an elevated refcount on the folio. This is a fundamental difference from isolate_lru_folios() (which is called without a stable reference).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hThe lru_lock must not be held.h]jM)}(hj h]hThe lru_lock must not be held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj ubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hInterrupts must be enabled. h]jM)}(hInterrupts must be enabled.h]hInterrupts must be enabled.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj"ubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]j>0j?0j@0j!jA0j!uh1j/hjHubjM)}(h **Context**h]j)}(hjCh]hContext}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubjM)}(h **Return**h]j)}(hj[h]hReturn}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubjM)}(hZtrue if the folio was removed from an LRU list. false if the folio was not on an LRU list.h]hZtrue if the folio was removed from an LRU list. false if the folio was not on an LRU list.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*check_move_unevictable_folios (C function)c.check_move_unevictable_folioshNtauh1hhjhhhNhNubh)}(hhh](h)}(h?void check_move_unevictable_folios (struct folio_batch *fbatch)h]h)}(h>void check_move_unevictable_folios(struct folio_batch *fbatch)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hcheck_move_unevictable_foliosh]j)}(hcheck_move_unevictable_foliosh]hcheck_move_unevictable_folios}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h(struct folio_batch *fbatch)h]j )}(hstruct folio_batch *fbatchh](j5)}(hj8h]hstruct}(hjݣhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj٣ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj٣ubh)}(hhh]j)}(h folio_batchh]h folio_batch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljãsbc.check_move_unevictable_foliosasbuh1hhj٣ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj٣ubjF )}(hjI h]h*}(hj)hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj٣ubj)}(hfbatchh]hfbatch}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj٣ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjգubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h2Move evictable folios to appropriate zone lru listh]h2Move evictable folios to appropriate zone lru list}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj]hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjxjHjxjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio_batch *fbatch`` Batch of lru folios to check. **Description** Checks folios for evictability, if an evictable folio is in the unevictable lru list, moves it to the appropriate evictable lru list. This function should be only used for lru folios.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj|ubj)}(hhh]j)}(h=``struct folio_batch *fbatch`` Batch of lru folios to check. h](j)}(h``struct folio_batch *fbatch``h]jS)}(hjh]hstruct folio_batch *fbatch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhjubj)}(hhh]jM)}(hBatch of lru folios to check.h]hBatch of lru folios to check.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj|ubjM)}(h**Description**h]j)}(hjܤh]h Description}(hjޤhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjڤubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj|ubjM)}(hChecks folios for evictability, if an evictable folio is in the unevictable lru list, moves it to the appropriate evictable lru list. This function should be only used for lru folios.h]hChecks folios for evictability, if an evictable folio is in the unevictable lru list, moves it to the appropriate evictable lru list. This function should be only used for lru folios.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhL/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:131: ./mm/vmscan.chMhj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__remove_pages (C function)c.__remove_pageshNtauh1hhjhhhNhNubh)}(hhh](h)}(hvvoid __remove_pages (unsigned long pfn, unsigned long nr_pages, struct vmem_altmap *altmap, struct dev_pagemap *pgmap)h]h)}(huvoid __remove_pages(unsigned long pfn, unsigned long nr_pages, struct vmem_altmap *altmap, struct dev_pagemap *pgmap)h](j)}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMBubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj/hMBubh)}(h__remove_pagesh]j)}(h__remove_pagesh]h__remove_pages}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj/hMBubj )}(hb(unsigned long pfn, unsigned long nr_pages, struct vmem_altmap *altmap, struct dev_pagemap *pgmap)h](j )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hlongh]hlong}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(hunsigned long nr_pagesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hlongh]hlong}(hj˥hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj٥hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnr_pagesh]hnr_pages}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(hstruct vmem_altmap *altmaph](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h vmem_altmaph]h vmem_altmap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj modnameN classnameNjpjs)}jv]jy)}jljDsbc.__remove_pagesasbuh1hhjubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjLhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(haltmaph]haltmap}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubj )}(hstruct dev_pagemap *pgmaph](j5)}(hj8h]hstruct}(hjrhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubh)}(hhh]j)}(h dev_pagemaph]h dev_pagemap}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j:c.__remove_pagesasbuh1hhjnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjnubj)}(hpgmaph]hpgmap}(hjɦhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjVubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj/hMBubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj/hMBubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj/hMBhjhhubj4)}(hhh]jM)}(hremove sections of pagesh]hremove sections of pages}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMBhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj/hMBubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj jHj jIjJjKuh1hhhhjhNhNubj)}(hXj**Parameters** ``unsigned long pfn`` starting pageframe (must be aligned to start of a section) ``unsigned long nr_pages`` number of pages to remove (must be multiple of section size) ``struct vmem_altmap *altmap`` alternative device page map or ``NULL`` if default memmap is used ``struct dev_pagemap *pgmap`` device page map or ``NULL`` if not ZONE_DEVICE **Description** Generic helper function to remove section mappings and sysfs entries for the section of the memory we are removing. Caller needs to make sure that pages are marked reserved and zones are adjust properly by calling offline_pages().h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMFhjubj)}(hhh](j)}(hQ``unsigned long pfn`` starting pageframe (must be aligned to start of a section) h](j)}(h``unsigned long pfn``h]jS)}(hj4h]hunsigned long pfn}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj2ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMChj.ubj)}(hhh]jM)}(h:starting pageframe (must be aligned to start of a section)h]h:starting pageframe (must be aligned to start of a section)}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhMChjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhjIhMChj+ubj)}(hX``unsigned long nr_pages`` number of pages to remove (must be multiple of section size) h](j)}(h``unsigned long nr_pages``h]jS)}(hjmh]hunsigned long nr_pages}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjkubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMDhjgubj)}(hhh]jM)}(hh]h Description}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMHhjubjM)}(hGeneric helper function to remove section mappings and sysfs entries for the section of the memory we are removing. Caller needs to make sure that pages are marked reserved and zones are adjust properly by calling offline_pages().h]hGeneric helper function to remove section mappings and sysfs entries for the section of the memory we are removing. Caller needs to make sure that pages are marked reserved and zones are adjust properly by calling offline_pages().}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMGhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(__add_memory_driver_managed (C function)c.__add_memory_driver_managedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hint __add_memory_driver_managed (int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags, enum mmop online_type)h]h)}(hint __add_memory_driver_managed(int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags, enum mmop online_type)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMlubh)}(h__add_memory_driver_managedh]j)}(h__add_memory_driver_managedh]h__add_memory_driver_managed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMlubj )}(ha(int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags, enum mmop online_type)h](j )}(hint nidh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjΨhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnidh]hnid}(hjܨhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h u64 starth](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.__add_memory_driver_managedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hstarth]hstart}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hu64 sizeh](h)}(hhh]j)}(hu64h]hu64}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjDmodnameN classnameNjpjs)}jv]jc.__add_memory_driver_managedasbuh1hhj;ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj)}(hsizeh]hsize}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hconst char *resource_nameh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h resource_nameh]h resource_name}(hj˩hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hmhp_t mhp_flagsh](h)}(hhh]j)}(hmhp_th]hmhp_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__add_memory_driver_managedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h mhp_flagsh]h mhp_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum mmop online_typeh](j5)}(hjh]henum}(hj,hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj(ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh)}(hhh]j)}(hmmoph]hmmop}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjLmodnameN classnameNjpjs)}jv]jc.__add_memory_driver_managedasbuh1hhj(ubj)}(h h]h }(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h online_typeh]h online_type}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMlubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj{hhhjhMlubah}(h]jvah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMlhjxhhubj4)}(hhh]jM)}(h3add driver-managed memory with explicit online_typeh]h3add driver-managed memory with explicit online_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMlhjhhubah}(h]h ]h"]h$]h&]uh1j3hjxhhhjhMlubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int nid`` NUMA node ID where the memory will be added ``u64 start`` Start physical address of the memory range ``u64 size`` Size of the memory range in bytes ``const char *resource_name`` Resource name in format "System RAM ($DRIVER)" ``mhp_t mhp_flags`` Memory hotplug flags ``enum mmop online_type`` Auto-Online behavior (offline, online, kernel, movable) **Description** Add special, driver-managed memory to the system as system RAM. Such memory is not exposed via the raw firmware-provided memmap as system RAM, instead, it is detected and added by a driver - during cold boot, after a reboot, and after kexec. Reasons why this memory should not be used for the initial memmap of a kexec kernel or for placing kexec images: - The booting kernel is in charge of determining how this memory will be used (e.g., use persistent memory as system RAM) - Coordination with a hypervisor is required before this memory can be used (e.g., inaccessible parts). For this memory, no entries in /sys/firmware/memmap ("raw firmware-provided memory map") are created. Also, the created memory resource is flagged with IORESOURCE_SYSRAM_DRIVER_MANAGED, so in-kernel users can special-case this memory as well (esp., not place kexec images onto it). The resource_name (visible via /proc/iomem) has to have the format "System RAM ($DRIVER)". **Return** 0 on success, negative error code on failure.h](jM)}(h**Parameters**h]j)}(hjªh]h Parameters}(hjĪhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMphjubj)}(hhh](j)}(h8``int nid`` NUMA node ID where the memory will be added h](j)}(h ``int nid``h]jS)}(hjh]hint nid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjߪubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMmhj۪ubj)}(hhh]jM)}(h+NUMA node ID where the memory will be addedh]h+NUMA node ID where the memory will be added}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMmhjubah}(h]h ]h"]h$]h&]uh1jhj۪ubeh}(h]h ]h"]h$]h&]uh1jhjhMmhjتubj)}(h9``u64 start`` Start physical address of the memory range h](j)}(h ``u64 start``h]jS)}(hjh]h u64 start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMnhjubj)}(hhh]jM)}(h*Start physical address of the memory rangeh]h*Start physical address of the memory range}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hMnhj0ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj/hMnhjتubj)}(h/``u64 size`` Size of the memory range in bytes h](j)}(h ``u64 size``h]jS)}(hjSh]hu64 size}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjQubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMohjMubj)}(hhh]jM)}(h!Size of the memory range in bytesh]h!Size of the memory range in bytes}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhMohjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjhhMohjتubj)}(hM``const char *resource_name`` Resource name in format "System RAM ($DRIVER)" h](j)}(h``const char *resource_name``h]jS)}(hjh]hconst char *resource_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMphjubj)}(hhh]jM)}(h.Resource name in format "System RAM ($DRIVER)"h]h2Resource name in format “System RAM ($DRIVER)”}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMphjتubj)}(h)``mhp_t mhp_flags`` Memory hotplug flags h](j)}(h``mhp_t mhp_flags``h]jS)}(hjūh]hmhp_t mhp_flags}(hjǫhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjëubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMqhjubj)}(hhh]jM)}(hMemory hotplug flagsh]hMemory hotplug flags}(hjޫhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjګhMqhj۫ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjګhMqhjتubj)}(hR``enum mmop online_type`` Auto-Online behavior (offline, online, kernel, movable) h](j)}(h``enum mmop online_type``h]jS)}(hjh]henum mmop online_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMrhjubj)}(hhh]jM)}(h7Auto-Online behavior (offline, online, kernel, movable)h]h7Auto-Online behavior (offline, online, kernel, movable)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMrhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMrhjتubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj9h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMthjubjM)}(hAdd special, driver-managed memory to the system as system RAM. Such memory is not exposed via the raw firmware-provided memmap as system RAM, instead, it is detected and added by a driver - during cold boot, after a reboot, and after kexec.h]hAdd special, driver-managed memory to the system as system RAM. Such memory is not exposed via the raw firmware-provided memmap as system RAM, instead, it is detected and added by a driver - during cold boot, after a reboot, and after kexec.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMshjubjM)}(hpReasons why this memory should not be used for the initial memmap of a kexec kernel or for placing kexec images:h]hpReasons why this memory should not be used for the initial memmap of a kexec kernel or for placing kexec images:}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMxhjubjaW)}(hhh](j/)}(hwThe booting kernel is in charge of determining how this memory will be used (e.g., use persistent memory as system RAM)h]jM)}(hwThe booting kernel is in charge of determining how this memory will be used (e.g., use persistent memory as system RAM)h]hwThe booting kernel is in charge of determining how this memory will be used (e.g., use persistent memory as system RAM)}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM{hjpubah}(h]h ]h"]h$]h&]uh1j/hjmubj/)}(hfCoordination with a hypervisor is required before this memory can be used (e.g., inaccessible parts). h]jM)}(heCoordination with a hypervisor is required before this memory can be used (e.g., inaccessible parts).h]heCoordination with a hypervisor is required before this memory can be used (e.g., inaccessible parts).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM}hjubah}(h]h ]h"]h$]h&]uh1j/hjmubeh}(h]h ]h"]h$]h&]jWjWuh1j`WhjhM{hjubjM)}(hXFor this memory, no entries in /sys/firmware/memmap ("raw firmware-provided memory map") are created. Also, the created memory resource is flagged with IORESOURCE_SYSRAM_DRIVER_MANAGED, so in-kernel users can special-case this memory as well (esp., not place kexec images onto it).h]hXFor this memory, no entries in /sys/firmware/memmap (“raw firmware-provided memory map”) are created. Also, the created memory resource is flagged with IORESOURCE_SYSRAM_DRIVER_MANAGED, so in-kernel users can special-case this memory as well (esp., not place kexec images onto it).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(hZThe resource_name (visible via /proc/iomem) has to have the format "System RAM ($DRIVER)".h]h^The resource_name (visible via /proc/iomem) has to have the format “System RAM ($DRIVER)”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(h **Return**h]j)}(hjȬh]hReturn}(hjʬhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƬubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(h-0 on success, negative error code on failure.h]h-0 on success, negative error code on failure.}(hjެhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&add_memory_driver_managed (C function)c.add_memory_driver_managedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hhint add_memory_driver_managed (int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags)h]h)}(hgint add_memory_driver_managed(int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMubh)}(hadd_memory_driver_managedh]j)}(hadd_memory_driver_managedh]hadd_memory_driver_managed}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj hhhjhMubj )}(hJ(int nid, u64 start, u64 size, const char *resource_name, mhp_t mhp_flags)h](j )}(hint nidh](j)}(hinth]hint}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hnidh]hnid}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjBubj )}(h u64 starth](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlj0sbc.add_memory_driver_managedasbuh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjBubj )}(hu64 sizeh](h)}(hhh]j)}(hu64h]hu64}(hj̭hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɭubah}(h]h ]h"]h$]h&] refdomainjAreftypejl1 reftargetjέmodnameN classnameNjpjs)}jv]jc.add_memory_driver_managedasbuh1hhjŭubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŭubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŭubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjBubj )}(hconst char *resource_nameh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj ubj)}(h h]h }(hjhhhNhNubah}(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 ubjF )}(hjI h]h*}(hjHhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj ubj)}(h resource_nameh]h resource_name}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjBubj )}(hmhp_t mhp_flagsh](h)}(hhh]j)}(hmhp_th]hmhp_t}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjsmodnameN classnameNjpjs)}jv]jc.add_memory_driver_managedasbuh1hhjjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(h mhp_flagsh]h mhp_flags}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjBubeh}(h]h ]h"]h$]h&]jjuh1j hj hhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hadd driver-managed memoryh]hadd driver-managed memory}(hjǮhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjĮhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj߮jHj߮jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``int nid`` NUMA node ID where the memory will be added ``u64 start`` Start physical address of the memory range ``u64 size`` Size of the memory range in bytes ``const char *resource_name`` Resource name in format "System RAM ($DRIVER)" ``mhp_t mhp_flags`` Memory hotplug flags **Description** Add driver-managed memory with the system default online type set by build config or kernel boot parameter. See __add_memory_driver_managed for more details. **Return** 0 on success, negative error code on failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubj)}(hhh](j)}(h8``int nid`` NUMA node ID where the memory will be added h](j)}(h ``int nid``h]jS)}(hjh]hint nid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubj)}(hhh]jM)}(h+NUMA node ID where the memory will be addedh]h+NUMA node ID where the memory will be added}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h9``u64 start`` Start physical address of the memory range h](j)}(h ``u64 start``h]jS)}(hjAh]h u64 start}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhj;ubj)}(hhh]jM)}(h*Start physical address of the memory rangeh]h*Start physical address of the memory range}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVhMhjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjubj)}(h/``u64 size`` Size of the memory range in bytes h](j)}(h ``u64 size``h]jS)}(hjzh]hu64 size}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjxubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjtubj)}(hhh]jM)}(h!Size of the memory range in bytesh]h!Size of the memory range in bytes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hM``const char *resource_name`` Resource name in format "System RAM ($DRIVER)" h](j)}(h``const char *resource_name``h]jS)}(hjh]hconst char *resource_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubj)}(hhh]jM)}(h.Resource name in format "System RAM ($DRIVER)"h]h2Resource name in format “System RAM ($DRIVER)”}(hj̯hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjȯhMhjɯubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjȯhMhjubj)}(h)``mhp_t mhp_flags`` Memory hotplug flags h](j)}(h``mhp_t mhp_flags``h]jS)}(hjh]hmhp_t mhp_flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubj)}(hhh]jM)}(hMemory hotplug flagsh]hMemory hotplug flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj'h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(hkAdd driver-managed memory with the system default online type set by build config or kernel boot parameter.h]hkAdd driver-managed memory with the system default online type set by build config or kernel boot parameter.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(h1See __add_memory_driver_managed for more details.h]h1See __add_memory_driver_managed for more details.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(h **Return**h]j)}(hj]h]hReturn}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubjM)}(h-0 on success, negative error code on failure.h]h-0 on success, negative error code on failure.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htry_offline_node (C function)c.try_offline_nodehNtauh1hhjhhhNhNubh)}(hhh](h)}(hvoid try_offline_node (int nid)h]h)}(hvoid try_offline_node(int nid)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(htry_offline_nodeh]j)}(htry_offline_nodeh]htry_offline_node}(hjðhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h (int nid)h]j )}(hint nidh](j)}(hinth]hint}(hj߰hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۰ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۰ubj)}(hnidh]hnid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۰ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjװubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]h}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj.jHj.jIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``int nid`` the node ID **Description** Offline a node if all memory sections and cpus of the node are removed. **NOTE** The caller must call lock_device_hotplug() to serialize hotplug and online/offline operations before this call.h](jM)}(h**Parameters**h]j)}(hj8h]h Parameters}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhj2ubj)}(hhh]j)}(h``int nid`` the node ID h](j)}(h ``int nid``h]jS)}(hjWh]hint nid}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjUubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhjQubj)}(hhh]jM)}(h the node IDh]h the node ID}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhMhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjNubah}(h]h ]h"]h$]h&]uh1jhj2ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhj2ubjM)}(hGOffline a node if all memory sections and cpus of the node are removed.h]hGOffline a node if all memory sections and cpus of the node are removed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhj2ubjM)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhj2ubjM)}(hoThe caller must call lock_device_hotplug() to serialize hotplug and online/offline operations before this call.h]hoThe caller must call lock_device_hotplug() to serialize hotplug and online/offline operations before this call.}(hjϱhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__remove_memory (C function)c.__remove_memoryhNtauh1hhjhhhNhNubh)}(hhh](h)}(h*void __remove_memory (u64 start, u64 size)h]h)}(h)void __remove_memory(u64 start, u64 size)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM) ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hM) ubh)}(h__remove_memoryh]j)}(h__remove_memoryh]h__remove_memory}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj hM) ubj )}(h(u64 start, u64 size)h](j )}(h u64 starth](h)}(hhh]j)}(hu64h]hu64}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj@modnameN classnameNjpjs)}jv]jy)}jlj!sbc.__remove_memoryasbuh1hhj7ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hstarth]hstart}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubj )}(hu64 sizeh](h)}(hhh]j)}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jZc.__remove_memoryasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hsizeh]hsize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj3ubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj hM) ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj hM) ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj hM) hjhhubj4)}(hhh]jM)}(h.Remove memory if every memory block is offlineh]h.Remove memory if every memory block is offline}(hj޲hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM) hj۲hhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj hM) ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``u64 start`` physical address of the region to remove ``u64 size`` size of the region to remove **NOTE** The caller must call lock_device_hotplug() to serialize hotplug and online/offline operations before this call, as required by try_offline_node().h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM- hjubj)}(hhh](j)}(h7``u64 start`` physical address of the region to remove h](j)}(h ``u64 start``h]jS)}(hjh]h u64 start}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM* hjubj)}(hhh]jM)}(h(physical address of the region to removeh]h(physical address of the region to remove}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj4hM* hj5ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4hM* hjubj)}(h*``u64 size`` size of the region to remove h](j)}(h ``u64 size``h]jS)}(hjXh]hu64 size}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjVubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM+ hjRubj)}(hhh]jM)}(hsize of the region to removeh]hsize of the region to remove}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjmhM+ hjnubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1jhjmhM+ hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**NOTE**h]j)}(hjh]hNOTE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM- hjubjM)}(hThe caller must call lock_device_hotplug() to serialize hotplug and online/offline operations before this call, as required by try_offline_node().h]hThe caller must call lock_device_hotplug() to serialize hotplug and online/offline operations before this call, as required by try_offline_node().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM- hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h-offline_and_remove_memory_ranges (C function)"c.offline_and_remove_memory_rangeshNtauh1hhjhhhNhNubh)}(hhh](h)}(hYint offline_and_remove_memory_ranges (const struct range *ranges, unsigned int nr_ranges)h]h)}(hXint offline_and_remove_memory_ranges(const struct range *ranges, unsigned int nr_ranges)h](j)}(hinth]hint}(hjسhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԳhhhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԳhhhjhM ubh)}(h offline_and_remove_memory_rangesh]j)}(h offline_and_remove_memory_rangesh]h offline_and_remove_memory_ranges}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjԳhhhjhM ubj )}(h4(const struct range *ranges, unsigned int nr_ranges)h](j )}(hconst struct range *rangesh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj5)}(hj8h]hstruct}(hj0hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hrangeh]hrange}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjPmodnameN classnameNjpjs)}jv]jy)}jljsb"c.offline_and_remove_memory_rangesasbuh1hhjubj)}(h h]h }(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj|hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hrangesh]hranges}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubj )}(hunsigned int nr_rangesh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj̴hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h nr_rangesh]h nr_ranges}(hjڴhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj ubeh}(h]h ]h"]h$]h&]jjuh1j hjԳhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjгhhhjhM ubah}(h]j˳ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjͳhhubj4)}(hhh]jM)}(h)offline and remove multiple memory rangesh]h)offline and remove multiple memory ranges}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjͳhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct range *ranges`` array of physical address ranges to offline and remove ``unsigned int nr_ranges`` number of entries in **ranges** **Description** Offline and remove several memory ranges as one operation, serialized against other hotplug operations by a single lock_device_hotplug(). This offlines all ranges before removing any of them. If offlining any range fails, the entire process is reverted and nothing is removed. This provides a fully atomic semantic for unplugging an entire device. Each range must be memory-block aligned in start and size. **Return** 0 on success, negative errno on failure (never positive). On failure no range has been removed.h](jM)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubj)}(hhh](j)}(hV``const struct range *ranges`` array of physical address ranges to offline and remove h](j)}(h``const struct range *ranges``h]jS)}(hjEh]hconst struct range *ranges}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjCubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj?ubj)}(hhh]jM)}(h6array of physical address ranges to offline and removeh]h6array of physical address ranges to offline and remove}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZhM hj[ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhM hj<ubj)}(h;``unsigned int nr_ranges`` number of entries in **ranges** h](j)}(h``unsigned int nr_ranges``h]jS)}(hj~h]hunsigned int nr_ranges}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj|ubah}(h]h ]h"]h$]h&]uh1jhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hjxubj)}(hhh]jM)}(hnumber of entries in **ranges**h](hnumber of entries in }(hjhhhNhNubj)}(h **ranges**h]hranges}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jhjhM hj<ubeh}(h]h ]h"]h$]h&]uh1jhj ubjM)}(h**Description**h]j)}(hjǵh]h Description}(hjɵhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŵubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubjM)}(hOffline and remove several memory ranges as one operation, serialized against other hotplug operations by a single lock_device_hotplug().h]hOffline and remove several memory ranges as one operation, serialized against other hotplug operations by a single lock_device_hotplug().}(hjݵhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubjM)}(hThis offlines all ranges before removing any of them. If offlining any range fails, the entire process is reverted and nothing is removed. This provides a fully atomic semantic for unplugging an entire device.h]hThis offlines all ranges before removing any of them. If offlining any range fails, the entire process is reverted and nothing is removed. This provides a fully atomic semantic for unplugging an entire device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubjM)}(h:Each range must be memory-block aligned in start and size.h]h:Each range must be memory-block aligned in start and size.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubjM)}(h **Return**h]j)}(hj h]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubjM)}(h`0 on success, negative errno on failure (never positive). On failure no range has been removed.h]h`0 on success, negative errno on failure (never positive). On failure no range has been removed.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhT/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:132: ./mm/memory_hotplug.chM hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$mmu_interval_read_begin (C function)c.mmu_interval_read_beginhNtauh1hhjhhhNhNubh)}(hhh](h)}(hRunsigned long mmu_interval_read_begin (struct mmu_interval_notifier *interval_sub)h]h)}(hQunsigned long mmu_interval_read_begin(struct mmu_interval_notifier *interval_sub)h](j)}(hunsignedh]hunsigned}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhj_hKubj)}(hlongh]hlong}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhj_hKubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMhhhj_hKubh)}(hmmu_interval_read_beginh]j)}(hmmu_interval_read_beginh]hmmu_interval_read_begin}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjMhhhj_hKubj )}(h,(struct mmu_interval_notifier *interval_sub)h]j )}(h*struct mmu_interval_notifier *interval_subh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hmmu_interval_notifierh]hmmu_interval_notifier}(hjȶhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjŶubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjʶmodnameN classnameNjpjs)}jv]jy)}jljsbc.mmu_interval_read_beginasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h interval_subh]h interval_sub}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjMhhhj_hKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjIhhhj_hKubah}(h]jDah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj_hKhjFhhubj4)}(hhh]jM)}(h5Begin a read side critical section against a VA rangeh]h5Begin a read side critical section against a VA range}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhj*hhubah}(h]h ]h"]h$]h&]uh1j3hjFhhhj_hKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjEjHjEjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mmu_interval_notifier *interval_sub`` The interval subscription **Description** mmu_iterval_read_begin()/mmu_iterval_read_retry() implement a collision-retry scheme similar to seqcount for the VA range under subscription. If the mm invokes invalidation during the critical section then mmu_interval_read_retry() will return true. This is useful to obtain shadow PTEs where teardown or setup of the SPTEs require a blocking context. The critical region formed by this can sleep, and the required 'user_lock' can also be a sleeping lock. The caller is required to provide a 'user_lock' to serialize both teardown and setup. The return value should be passed to mmu_interval_read_retry().h](jM)}(h**Parameters**h]j)}(hjOh]h Parameters}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjIubj)}(hhh]j)}(hI``struct mmu_interval_notifier *interval_sub`` The interval subscription h](j)}(h.``struct mmu_interval_notifier *interval_sub``h]jS)}(hjnh]h*struct mmu_interval_notifier *interval_sub}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjlubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjhubj)}(hhh]jM)}(hThe interval subscriptionh]hThe interval subscription}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhKhjeubah}(h]h ]h"]h$]h&]uh1jhjIubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjIubjM)}(hmmu_iterval_read_begin()/mmu_iterval_read_retry() implement a collision-retry scheme similar to seqcount for the VA range under subscription. If the mm invokes invalidation during the critical section then mmu_interval_read_retry() will return true.h]hmmu_iterval_read_begin()/mmu_iterval_read_retry() implement a collision-retry scheme similar to seqcount for the VA range under subscription. If the mm invokes invalidation during the critical section then mmu_interval_read_retry() will return true.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjIubjM)}(hThis is useful to obtain shadow PTEs where teardown or setup of the SPTEs require a blocking context. The critical region formed by this can sleep, and the required 'user_lock' can also be a sleeping lock.h]hThis is useful to obtain shadow PTEs where teardown or setup of the SPTEs require a blocking context. The critical region formed by this can sleep, and the required ‘user_lock’ can also be a sleeping lock.}(hjηhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjIubjM)}(hUThe caller is required to provide a 'user_lock' to serialize both teardown and setup.h]hYThe caller is required to provide a ‘user_lock’ to serialize both teardown and setup.}(hjݷhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjIubjM)}(h?The return value should be passed to mmu_interval_read_retry().h]h?The return value should be passed to mmu_interval_read_retry().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chKhjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"mmu_notifier_register (C function)c.mmu_notifier_registerhNtauh1hhjhhhNhNubh)}(hhh](h)}(hSint mmu_notifier_register (struct mmu_notifier *subscription, struct mm_struct *mm)h]h)}(hRint mmu_notifier_register(struct mmu_notifier *subscription, struct mm_struct *mm)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj)hMubh)}(hmmu_notifier_registerh]j)}(hmmu_notifier_registerh]hmmu_notifier_register}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj)hMubj )}(h9(struct mmu_notifier *subscription, struct mm_struct *mm)h](j )}(h!struct mmu_notifier *subscriptionh](j5)}(hj8h]hstruct}(hjXhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjTubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubh)}(hhh]j)}(h mmu_notifierh]h mmu_notifier}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjxmodnameN classnameNjpjs)}jv]jy)}jlj>sbc.mmu_notifier_registerasbuh1hhjTubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjTubj)}(h subscriptionh]h subscription}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubj )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjʸhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjƸubj)}(h h]h }(hj׸hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƸubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mmu_notifier_registerasbuh1hhjƸubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƸubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjƸubj)}(hmmh]hmm}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjƸubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjPubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj)hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj)hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj)hMhjhhubj4)}(hhh]jM)}(hRegister a notifier on a mmh]hRegister a notifier on a mm}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjHhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj)hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjcjHjcjIjJjKuh1hhhhjhNhNubj)}(hX7**Parameters** ``struct mmu_notifier *subscription`` The notifier to attach ``struct mm_struct *mm`` The mm to attach the notifier to **Description** Must not hold mmap_lock nor any other VM related lock when calling this registration function. Must also ensure mm_users can't go down to zero while this runs to avoid races with mmu_notifier_release, so mm has to be current->mm or the mm should be pinned safely such as with get_task_mm(). If the mm is not current->mm, the mm_users pin should be released by calling mmput after mmu_notifier_register returns. mmu_notifier_unregister() or mmu_notifier_put() must be always called to unregister the notifier. While the caller has a mmu_notifier get the subscription->mm pointer will remain valid, and can be converted to an active mm pointer via mmget_not_zero().h](jM)}(h**Parameters**h]j)}(hjmh]h Parameters}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjgubj)}(hhh](j)}(h=``struct mmu_notifier *subscription`` The notifier to attach h](j)}(h%``struct mmu_notifier *subscription``h]jS)}(hjh]h!struct mmu_notifier *subscription}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh]jM)}(hThe notifier to attachh]hThe notifier to attach}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h:``struct mm_struct *mm`` The mm to attach the notifier to h](j)}(h``struct mm_struct *mm``h]jS)}(hjŹh]hstruct mm_struct *mm}(hjǹhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjùubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh]jM)}(h The mm to attach the notifier toh]h The mm to attach the notifier to}(hj޹hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjڹhMhj۹ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjڹhMhjubeh}(h]h ]h"]h$]h&]uh1jhjgubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjgubjM)}(hXMust not hold mmap_lock nor any other VM related lock when calling this registration function. Must also ensure mm_users can't go down to zero while this runs to avoid races with mmu_notifier_release, so mm has to be current->mm or the mm should be pinned safely such as with get_task_mm(). If the mm is not current->mm, the mm_users pin should be released by calling mmput after mmu_notifier_register returns.h]hXMust not hold mmap_lock nor any other VM related lock when calling this registration function. Must also ensure mm_users can’t go down to zero while this runs to avoid races with mmu_notifier_release, so mm has to be current->mm or the mm should be pinned safely such as with get_task_mm(). If the mm is not current->mm, the mm_users pin should be released by calling mmput after mmu_notifier_register returns.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjgubjM)}(hammu_notifier_unregister() or mmu_notifier_put() must be always called to unregister the notifier.h]hammu_notifier_unregister() or mmu_notifier_put() must be always called to unregister the notifier.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjgubjM)}(hWhile the caller has a mmu_notifier get the subscription->mm pointer will remain valid, and can be converted to an active mm pointer via mmget_not_zero().h]hWhile the caller has a mmu_notifier get the subscription->mm pointer will remain valid, and can be converted to an active mm pointer via mmget_not_zero().}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjgubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$mmu_notifier_get_locked (C function)c.mmu_notifier_get_lockedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hhstruct mmu_notifier * mmu_notifier_get_locked (const struct mmu_notifier_ops *ops, struct mm_struct *mm)h]h)}(hfstruct mmu_notifier *mmu_notifier_get_locked(const struct mmu_notifier_ops *ops, struct mm_struct *mm)h](j5)}(hj8h]hstruct}(hjchhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj_hhhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chM ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjphM ubh)}(hhh]j)}(h mmu_notifierh]h mmu_notifier}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlmmu_notifier_get_lockedsbc.mmu_notifier_get_lockedasbuh1hhj_hhhjphM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjphM ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj_hhhjphM ubh)}(hmmu_notifier_get_lockedh]j)}(hjh]hmmu_notifier_get_locked}(hjºhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhj_hhhjphM ubj )}(h:(const struct mmu_notifier_ops *ops, struct mm_struct *mm)h](j )}(h"const struct mmu_notifier_ops *opsh](j5)}(hjh]hconst}(hjݺhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjٺubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٺubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjٺubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٺubh)}(hhh]j)}(hmmu_notifier_opsh]hmmu_notifier_ops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mmu_notifier_get_lockedasbuh1hhjٺubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٺubjF )}(hjI h]h*}(hjBhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjٺubj)}(hopsh]hops}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٺubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjպubj )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjhhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjdubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.mmu_notifier_get_lockedasbuh1hhjdubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjdubj)}(hmmh]hmm}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjպubeh}(h]h ]h"]h$]h&]jjuh1j hj_hhhjphM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj[hhhjphM ubah}(h]jVah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjphM hjXhhubj4)}(hhh]jM)}(h6Return the single struct mmu_notifier for the mm & opsh]h6Return the single struct mmu_notifier for the mm & ops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjXhhhjphM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``const struct mmu_notifier_ops *ops`` The operations struct being subscribe with ``struct mm_struct *mm`` The mm to attach notifiers too **Description** This function either allocates a new mmu_notifier via ops->alloc_notifier(), or returns an already existing notifier on the list. The value of the ops pointer is used to determine when two notifiers are the same. Each call to mmu_notifier_get() must be paired with a call to mmu_notifier_put(). The caller must hold the write side of mm->mmap_lock. While the caller has a mmu_notifier get the mm pointer will remain valid, and can be converted to an active mm pointer via mmget_not_zero().h](jM)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh](j)}(hR``const struct mmu_notifier_ops *ops`` The operations struct being subscribe with h](j)}(h&``const struct mmu_notifier_ops *ops``h]jS)}(hj*h]h"const struct mmu_notifier_ops *ops}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj(ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhj$ubj)}(hhh]jM)}(h*The operations struct being subscribe withh]h*The operations struct being subscribe with}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj?hMhj@ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj?hMhj!ubj)}(h8``struct mm_struct *mm`` The mm to attach notifiers too h](j)}(h``struct mm_struct *mm``h]jS)}(hjch]hstruct mm_struct *mm}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjaubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhj]ubj)}(hhh]jM)}(hThe mm to attach notifiers tooh]hThe mm to attach notifiers too}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjxhMhjyubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhjxhMhj!ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubjM)}(hThis function either allocates a new mmu_notifier via ops->alloc_notifier(), or returns an already existing notifier on the list. The value of the ops pointer is used to determine when two notifiers are the same.h]hThis function either allocates a new mmu_notifier via ops->alloc_notifier(), or returns an already existing notifier on the list. The value of the ops pointer is used to determine when two notifiers are the same.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubjM)}(hEach call to mmu_notifier_get() must be paired with a call to mmu_notifier_put(). The caller must hold the write side of mm->mmap_lock.h]hEach call to mmu_notifier_get() must be paired with a call to mmu_notifier_put(). The caller must hold the write side of mm->mmap_lock.}(hjühhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubjM)}(hWhile the caller has a mmu_notifier get the mm pointer will remain valid, and can be converted to an active mm pointer via mmget_not_zero().h]hWhile the caller has a mmu_notifier get the mm pointer will remain valid, and can be converted to an active mm pointer via mmget_not_zero().}(hjҼhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hmmu_notifier_put (C function)c.mmu_notifier_puthNtauh1hhjhhhNhNubh)}(hhh](h)}(h9void mmu_notifier_put (struct mmu_notifier *subscription)h]h)}(h8void mmu_notifier_put(struct mmu_notifier *subscription)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hmmu_notifier_puth]j)}(hmmu_notifier_puth]hmmu_notifier_put}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h#(struct mmu_notifier *subscription)h]j )}(h!struct mmu_notifier *subscriptionh](j5)}(hj8h]hstruct}(hj>hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj:ubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubh)}(hhh]j)}(h mmu_notifierh]h mmu_notifier}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj^modnameN classnameNjpjs)}jv]jy)}jlj$sbc.mmu_notifier_putasbuh1hhj:ubj)}(h h]h }(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj:ubj)}(h subscriptionh]h subscription}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hj6ubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h%Release the reference on the notifierh]h%Release the reference on the notifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjٽjHjٽjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct mmu_notifier *subscription`` The notifier to act on **Description** This function must be paired with each mmu_notifier_get(), it releases the reference obtained by the get. If this is the last reference then process to free the notifier will be run asynchronously. Unlike mmu_notifier_unregister() the get/put flow only calls ops->release when the mm_struct is destroyed. Instead free_notifier is always called to release any resources held by the user. As ops->release is not guaranteed to be called, the user must ensure that all sptes are dropped, and no new sptes can be established before mmu_notifier_put() is called. This function can be called from the ops->release callback, however the caller must still ensure it is called pairwise with mmu_notifier_get(). Modules calling this function must call mmu_notifier_synchronize() in their __exit functions to ensure the async work is completed.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubj)}(hhh]j)}(h=``struct mmu_notifier *subscription`` The notifier to act on h](j)}(h%``struct mmu_notifier *subscription``h]jS)}(hjh]h!struct mmu_notifier *subscription}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh]jM)}(hThe notifier to act onh]hThe notifier to act on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjݽubjM)}(h**Description**h]j)}(hj=h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubjM)}(hThis function must be paired with each mmu_notifier_get(), it releases the reference obtained by the get. If this is the last reference then process to free the notifier will be run asynchronously.h]hThis function must be paired with each mmu_notifier_get(), it releases the reference obtained by the get. If this is the last reference then process to free the notifier will be run asynchronously.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubjM)}(hUnlike mmu_notifier_unregister() the get/put flow only calls ops->release when the mm_struct is destroyed. Instead free_notifier is always called to release any resources held by the user.h]hUnlike mmu_notifier_unregister() the get/put flow only calls ops->release when the mm_struct is destroyed. Instead free_notifier is always called to release any resources held by the user.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubjM)}(hAs ops->release is not guaranteed to be called, the user must ensure that all sptes are dropped, and no new sptes can be established before mmu_notifier_put() is called.h]hAs ops->release is not guaranteed to be called, the user must ensure that all sptes are dropped, and no new sptes can be established before mmu_notifier_put() is called.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubjM)}(hThis function can be called from the ops->release callback, however the caller must still ensure it is called pairwise with mmu_notifier_get().h]hThis function can be called from the ops->release callback, however the caller must still ensure it is called pairwise with mmu_notifier_get().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubjM)}(hModules calling this function must call mmu_notifier_synchronize() in their __exit functions to ensure the async work is completed.h]hModules calling this function must call mmu_notifier_synchronize() in their __exit functions to ensure the async work is completed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjݽubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)mmu_interval_notifier_insert (C function)c.mmu_interval_notifier_inserthNtauh1hhjhhhNhNubh)}(hhh](h)}(hint mmu_interval_notifier_insert (struct mmu_interval_notifier *interval_sub, struct mm_struct *mm, unsigned long start, unsigned long length, const struct mmu_interval_notifier_ops *ops)h]h)}(hint mmu_interval_notifier_insert(struct mmu_interval_notifier *interval_sub, struct mm_struct *mm, unsigned long start, unsigned long length, const struct mmu_interval_notifier_ops *ops)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj̾hMubh)}(hmmu_interval_notifier_inserth]j)}(hmmu_interval_notifier_inserth]hmmu_interval_notifier_insert}(hj߾hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj۾ubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj̾hMubj )}(h(struct mmu_interval_notifier *interval_sub, struct mm_struct *mm, unsigned long start, unsigned long length, const struct mmu_interval_notifier_ops *ops)h](j )}(h*struct mmu_interval_notifier *interval_subh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hmmu_interval_notifierh]hmmu_interval_notifier}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.mmu_interval_notifier_insertasbuh1hhjubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjGhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h interval_subh]h interval_sub}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct mm_struct *mmh](j5)}(hj8h]hstruct}(hjmhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjiubj)}(h h]h }(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubh)}(hhh]j)}(h mm_structh]h mm_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j5c.mmu_interval_notifier_insertasbuh1hhjiubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjiubj)}(hmmh]hmm}(hjĿhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long starth](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}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٿubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٿubj)}(hstarth]hstart}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjٿubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long lengthh](j)}(hunsignedh]hunsigned}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hlongh]hlong}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(h h]h }(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hlengthh]hlength}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h+const struct mmu_interval_notifier_ops *opsh](j5)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubh)}(hhh]j)}(hmmu_interval_notifier_opsh]hmmu_interval_notifier_ops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j5c.mmu_interval_notifier_insertasbuh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj{ubj)}(hopsh]hops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj̾hMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj̾hMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj̾hMhjhhubj4)}(hhh]jM)}(hInsert an interval notifierh]hInsert an interval notifier}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhj̾hMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj3jHj3jIjJjKuh1hhhhjhNhNubj)}(hX,**Parameters** ``struct mmu_interval_notifier *interval_sub`` Interval subscription to register ``struct mm_struct *mm`` mm_struct to attach to ``unsigned long start`` Starting virtual address to monitor ``unsigned long length`` Length of the range to monitor ``const struct mmu_interval_notifier_ops *ops`` Interval notifier operations to be called on matching events **Description** This function subscribes the interval notifier for notifications from the mm. Upon return the ops related to mmu_interval_notifier will be called whenever an event that intersects with the given range occurs. Upon return the range_notifier may not be present in the interval tree yet. The caller must use the normal interval notifier read flow via mmu_interval_read_begin() to establish SPTEs for this range.h](jM)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jLhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhj7ubj)}(hhh](j)}(hQ``struct mmu_interval_notifier *interval_sub`` Interval subscription to register h](j)}(h.``struct mmu_interval_notifier *interval_sub``h]jS)}(hj\h]h*struct mmu_interval_notifier *interval_sub}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjZubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjVubj)}(hhh]jM)}(h!Interval subscription to registerh]h!Interval subscription to register}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjqhMhjrubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjqhMhjSubj)}(h0``struct mm_struct *mm`` mm_struct to attach to h](j)}(h``struct mm_struct *mm``h]jS)}(hjh]hstruct mm_struct *mm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh]jM)}(hmm_struct to attach toh]hmm_struct to attach to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjSubj)}(h<``unsigned long start`` Starting virtual address to monitor h](j)}(h``unsigned long start``h]jS)}(hjh]hunsigned long start}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh]jM)}(h#Starting virtual address to monitorh]h#Starting virtual address to monitor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjSubj)}(h8``unsigned long length`` Length of the range to monitor h](j)}(h``unsigned long length``h]jS)}(hjh]hunsigned long length}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhjubj)}(hhh]jM)}(hLength of the range to monitorh]hLength of the range to monitor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjSubj)}(hm``const struct mmu_interval_notifier_ops *ops`` Interval notifier operations to be called on matching events h](j)}(h/``const struct mmu_interval_notifier_ops *ops``h]jS)}(hj@h]h+const struct mmu_interval_notifier_ops *ops}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj>ubah}(h]h ]h"]h$]h&]uh1jhR/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:133: ./mm/mmu_notifier.chMhj:ubj)}(hhh]jM)}(hprivate assignment accordingly.h]h_insert a page into the balloon’s page list and make the page->private assignment accordingly.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct balloon_dev_info *balloon`` pointer to balloon device ``struct page *page`` page to be assigned as a 'balloon page' **Description** Caller must ensure the balloon_pages_lock is held.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh](j)}(h?``struct balloon_dev_info *balloon`` pointer to balloon device h](j)}(h$``struct balloon_dev_info *balloon``h]jS)}(hjh]h struct balloon_dev_info *balloon}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]jM)}(hpointer to balloon deviceh]hpointer to balloon device}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+hKhj,ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj+hKhj ubj)}(h>``struct page *page`` page to be assigned as a 'balloon page' h](j)}(h``struct page *page``h]jS)}(hjOh]hstruct page *page}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjMubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjIubj)}(hhh]jM)}(h'page to be assigned as a 'balloon page'h]h+page to be assigned as a ‘balloon page’}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdhKhjeubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjdhKhj ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(h2Caller must ensure the balloon_pages_lock is held.h]h2Caller must ensure the balloon_pages_lock is held.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"balloon_page_finalize (C function)c.balloon_page_finalizehNtauh1hhjhhhNhNubh)}(hhh](h)}(h.void balloon_page_finalize (struct page *page)h]h)}(h-void balloon_page_finalize(struct page *page)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chK(ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK(ubh)}(hballoon_page_finalizeh]j)}(hballoon_page_finalizeh]hballoon_page_finalize}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhK(ubj )}(h(struct page *page)h]j )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hj hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj,modnameN classnameNjpjs)}jv]jy)}jljsbc.balloon_page_finalizeasbuh1hhjubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjXhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhK(ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhK(ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhK(hjhhubj4)}(hhh]jM)}(h_prepare a balloon page that was removed from the balloon list for release to the page allocatorh]h_prepare a balloon page that was removed from the balloon list for release to the page allocator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chK(hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhK(ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct page *page`` page to be released to the page allocator **Description** Caller must ensure the balloon_pages_lock is held.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chK,hjubj)}(hhh]j)}(h@``struct page *page`` page to be released to the page allocator h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chK*hjubj)}(hhh]jM)}(h)page to be released to the page allocatorh]h)page to be released to the page allocator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhK*hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK*hjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chK,hjubjM)}(h2Caller must ensure the balloon_pages_lock is held.h]h2Caller must ensure the balloon_pages_lock is held.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chK+hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&balloon_page_list_enqueue (C function)c.balloon_page_list_enqueuehNtauh1hhjhhhNhNubh)}(hhh](h)}(h_size_t balloon_page_list_enqueue (struct balloon_dev_info *b_dev_info, struct list_head *pages)h]h)}(h^size_t balloon_page_list_enqueue(struct balloon_dev_info *b_dev_info, struct list_head *pages)h](h)}(hhh]j)}(hsize_th]hsize_t}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjUmodnameN classnameNjpjs)}jv]jy)}jlballoon_page_list_enqueuesbc.balloon_page_list_enqueueasbuh1hhjLhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKAubj)}(h h]h }(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhjthKAubh)}(hballoon_page_list_enqueueh]j)}(hjqh]hballoon_page_list_enqueue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjLhhhjthKAubj )}(h>(struct balloon_dev_info *b_dev_info, struct list_head *pages)h](j )}(h#struct balloon_dev_info *b_dev_infoh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hballoon_dev_infoh]hballoon_dev_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]joc.balloon_page_list_enqueueasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h b_dev_infoh]h b_dev_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct list_head *pagesh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h list_headh]h list_head}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj2modnameN classnameNjpjs)}jv]joc.balloon_page_list_enqueueasbuh1hhjubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj\hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpagesh]hpages}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjLhhhjthKAubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjHhhhjthKAubah}(h]jCah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjthKAhjEhhubj4)}(hhh]jM)}(h3inserts a list of pages into the balloon page list.h]h3inserts a list of pages into the balloon page list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKAhjhhubah}(h]h ]h"]h$]h&]uh1j3hjEhhhjthKAubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct balloon_dev_info *b_dev_info`` balloon device descriptor where we will insert a new page to ``struct list_head *pages`` pages to enqueue - allocated using balloon_page_alloc. **Description** Driver must call this function to properly enqueue balloon pages before definitively removing them from the guest system. **Return** number of pages that were enqueued.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKEhjubj)}(hhh](j)}(he``struct balloon_dev_info *b_dev_info`` balloon device descriptor where we will insert a new page to h](j)}(h'``struct balloon_dev_info *b_dev_info``h]jS)}(hjh]h#struct balloon_dev_info *b_dev_info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKChjubj)}(hhh]jM)}(hallocates a new page for insertion into the balloon page list.h]h>allocates a new page for insertion into the balloon page list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX3**Parameters** ``void`` no arguments **Description** Driver must call this function to properly allocate a new balloon page. Driver must call balloon_page_enqueue before definitively removing the page from the guest system. **Return** struct page for the allocated page or NULL on allocation failure.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]j)}(h``void`` no arguments h](j)}(h``void``h]jS)}(hjh]hvoid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]jM)}(h no argumentsh]h no arguments}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hDriver must call this function to properly allocate a new balloon page. Driver must call balloon_page_enqueue before definitively removing the page from the guest system.h]hDriver must call this function to properly allocate a new balloon page. Driver must call balloon_page_enqueue before definitively removing the page from the guest system.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(h **Return**h]j)}(hj%h]hReturn}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hAstruct page for the allocated page or NULL on allocation failure.h]hAstruct page for the allocated page or NULL on allocation failure.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!balloon_page_enqueue (C function)c.balloon_page_enqueuehNtauh1hhjhhhNhNubh)}(hhh](h)}(hRvoid balloon_page_enqueue (struct balloon_dev_info *b_dev_info, struct page *page)h]h)}(hQvoid balloon_page_enqueue(struct balloon_dev_info *b_dev_info, struct page *page)h](j)}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKubj)}(h h]h }(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjfhhhjxhKubh)}(hballoon_page_enqueueh]j)}(hballoon_page_enqueueh]hballoon_page_enqueue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjfhhhjxhKubj )}(h8(struct balloon_dev_info *b_dev_info, struct page *page)h](j )}(h#struct balloon_dev_info *b_dev_infoh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hballoon_dev_infoh]hballoon_dev_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.balloon_page_enqueueasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h b_dev_infoh]h b_dev_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *pageh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj9modnameN classnameNjpjs)}jv]jc.balloon_page_enqueueasbuh1hhjubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjchhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpageh]hpage}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjfhhhjxhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjbhhhjxhKubah}(h]j]ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjxhKhj_hhubj4)}(hhh]jM)}(h.inserts a new page into the balloon page list.h]h.inserts a new page into the balloon page list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hj_hhhjxhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct balloon_dev_info *b_dev_info`` balloon device descriptor where we will insert a new page ``struct page *page`` new page to enqueue - allocated using balloon_page_alloc. **Description** Drivers must call this function to properly enqueue a new allocated balloon page before definitively removing the page from the guest system. Drivers must not enqueue pages while page->lru is still in use, and must not use page->lru until a page was unqueued again.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh](j)}(hb``struct balloon_dev_info *b_dev_info`` balloon device descriptor where we will insert a new page h](j)}(h'``struct balloon_dev_info *b_dev_info``h]jS)}(hjh]h#struct balloon_dev_info *b_dev_info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]jM)}(h9balloon device descriptor where we will insert a new pageh]h9balloon device descriptor where we will insert a new page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hP``struct page *page`` new page to enqueue - allocated using balloon_page_alloc. h](j)}(h``struct page *page``h]jS)}(hjh]hstruct page *page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]jM)}(h9new page to enqueue - allocated using balloon_page_alloc.h]h9new page to enqueue - allocated using balloon_page_alloc.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)hKhj*ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj)hKhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjOh]h Description}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hDrivers must call this function to properly enqueue a new allocated balloon page before definitively removing the page from the guest system.h]hDrivers must call this function to properly enqueue a new allocated balloon page before definitively removing the page from the guest system.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(h{Drivers must not enqueue pages while page->lru is still in use, and must not use page->lru until a page was unqueued again.h]h{Drivers must not enqueue pages while page->lru is still in use, and must not use page->lru until a page was unqueued again.}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!balloon_page_dequeue (C function)c.balloon_page_dequeuehNtauh1hhjhhhNhNubh)}(hhh](h)}(hHstruct page * balloon_page_dequeue (struct balloon_dev_info *b_dev_info)h]h)}(hFstruct page *balloon_page_dequeue(struct balloon_dev_info *b_dev_info)h](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjhhhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlballoon_page_dequeuesbc.balloon_page_dequeueasbuh1hhjhhhjhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjhhhjhKubh)}(hballoon_page_dequeueh]j)}(hjh]hballoon_page_dequeue}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhKubj )}(h%(struct balloon_dev_info *b_dev_info)h]j )}(h#struct balloon_dev_info *b_dev_infoh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hballoon_dev_infoh]hballoon_dev_info}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj=modnameN classnameNjpjs)}jv]jc.balloon_page_dequeueasbuh1hhjubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjghhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(h b_dev_infoh]h b_dev_info}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjhhhjhKubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhKubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhKhjhhubj4)}(hhh]jM)}(hhremoves a page from balloon's page list and returns its address to allow the driver to release the page.h]hjremoves a page from balloon’s page list and returns its address to allow the driver to release the page.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhKubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct balloon_dev_info *b_dev_info`` balloon device descriptor where we will grab a page from. **Description** Driver must call this function to properly dequeue a previously enqueued page before definitively releasing it back to the guest system. Caller must perform its own accounting to ensure that this function is called only if some pages are actually enqueued. Note that this function may fail to dequeue some pages even if there are some enqueued pages - since the page list can be temporarily empty due to the compaction of isolated pages. TODO: remove the caller accounting requirements, and allow caller to wait until all pages can be dequeued. **Return** struct page for the dequeued page, or NULL if no page was dequeued.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]j)}(hb``struct balloon_dev_info *b_dev_info`` balloon device descriptor where we will grab a page from. h](j)}(h'``struct balloon_dev_info *b_dev_info``h]jS)}(hjh]h#struct balloon_dev_info *b_dev_info}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubj)}(hhh]jM)}(h9balloon device descriptor where we will grab a page from.h]h9balloon device descriptor where we will grab a page from.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hDriver must call this function to properly dequeue a previously enqueued page before definitively releasing it back to the guest system.h]hDriver must call this function to properly dequeue a previously enqueued page before definitively releasing it back to the guest system.}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hwCaller must perform its own accounting to ensure that this function is called only if some pages are actually enqueued.h]hwCaller must perform its own accounting to ensure that this function is called only if some pages are actually enqueued.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hNote that this function may fail to dequeue some pages even if there are some enqueued pages - since the page list can be temporarily empty due to the compaction of isolated pages.h]hNote that this function may fail to dequeue some pages even if there are some enqueued pages - since the page list can be temporarily empty due to the compaction of isolated pages.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hjTODO: remove the caller accounting requirements, and allow caller to wait until all pages can be dequeued.h]hjTODO: remove the caller accounting requirements, and allow caller to wait until all pages can be dequeued.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(h **Return**h]j)}(hjnh]hReturn}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubjM)}(hCstruct page for the dequeued page, or NULL if no page was dequeued.h]hCstruct page for the dequeued page, or NULL if no page was dequeued.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhM/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:134: ./mm/balloon.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmf_insert_pfn_pmd (C function)c.vmf_insert_pfn_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(hSvm_fault_t vmf_insert_pfn_pmd (struct vm_fault *vmf, unsigned long pfn, bool write)h]h)}(hRvm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, unsigned long pfn, bool write)h](h)}(hhh]j)}(h vm_fault_th]h vm_fault_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvmf_insert_pfn_pmdsbc.vmf_insert_pfn_pmdasbuh1hhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hvmf_insert_pfn_pmdh]j)}(hjh]hvmf_insert_pfn_pmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h5(struct vm_fault *vmf, unsigned long pfn, bool write)h](j )}(hstruct vm_fault *vmfh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_faulth]hvm_fault}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj%modnameN classnameNjpjs)}jv]jc.vmf_insert_pfn_pmdasbuh1hhjubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjOhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmfh]hvmf}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj)}(hpfnh]hpfn}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h bool writeh](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwriteh]hwrite}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(hinsert a pmd size pfnh]hinsert a pmd size pfn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGj#jHj#jIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_fault *vmf`` Structure describing the fault ``unsigned long pfn`` pfn to insert ``bool write`` whether it's a write fault **Description** Insert a pmd size pfn. See vmf_insert_pfn() for additional info. **Return** vm_fault_t value.h](jM)}(h**Parameters**h]j)}(hj-h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj'ubj)}(hhh](j)}(h8``struct vm_fault *vmf`` Structure describing the fault h](j)}(h``struct vm_fault *vmf``h]jS)}(hjLh]hstruct vm_fault *vmf}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjJubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjFubj)}(hhh]jM)}(hStructure describing the faulth]hStructure describing the fault}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjahMhjbubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjahMhjCubj)}(h$``unsigned long pfn`` pfn to insert h](j)}(h``unsigned long pfn``h]jS)}(hjh]hunsigned long pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(h pfn to inserth]h pfn to insert}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjCubj)}(h*``bool write`` whether it's a write fault h](j)}(h``bool write``h]jS)}(hjh]h bool write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(hwhether it's a write faulth]hwhether it’s a write fault}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjCubeh}(h]h ]h"]h$]h&]uh1jhj'ubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj'ubjM)}(h@Insert a pmd size pfn. See vmf_insert_pfn() for additional info.h]h@Insert a pmd size pfn. See vmf_insert_pfn() for additional info.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj'ubjM)}(h **Return**h]j)}(hj h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj'ubjM)}(hvm_fault_t value.h]hvm_fault_t value.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hvmf_insert_pfn_pud (C function)c.vmf_insert_pfn_pudhNtauh1hhjhhhNhNubh)}(hhh](h)}(hSvm_fault_t vmf_insert_pfn_pud (struct vm_fault *vmf, unsigned long pfn, bool write)h]h)}(hRvm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, unsigned long pfn, bool write)h](h)}(hhh]j)}(h vm_fault_th]h vm_fault_t}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]jy)}jlvmf_insert_pfn_pudsbc.vmf_insert_pfn_pudasbuh1hhjahhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjhMubh)}(hvmf_insert_pfn_pudh]j)}(hjh]hvmf_insert_pfn_pud}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjahhhjhMubj )}(h5(struct vm_fault *vmf, unsigned long pfn, bool write)h](j )}(hstruct vm_fault *vmfh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_faulth]hvm_fault}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.vmf_insert_pfn_pudasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmfh]hvmf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long pfnh](j)}(hunsignedh]hunsigned}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hlongh]hlong}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hpfnh]hpfn}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h bool writeh](j)}(hj-h]hbool}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hwriteh]hwrite}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjahhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj]hhhjhMubah}(h]jXah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjZhhubj4)}(hhh]jM)}(hinsert a pud size pfnh]hinsert a pud size pfn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjZhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_fault *vmf`` Structure describing the fault ``unsigned long pfn`` pfn to insert ``bool write`` whether it's a write fault **Description** Insert a pud size pfn. See vmf_insert_pfn() for additional info. **Return** vm_fault_t value.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh](j)}(h8``struct vm_fault *vmf`` Structure describing the fault h](j)}(h``struct vm_fault *vmf``h]jS)}(hjh]hstruct vm_fault *vmf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(hStructure describing the faulth]hStructure describing the fault}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h$``unsigned long pfn`` pfn to insert h](j)}(h``unsigned long pfn``h]jS)}(hj7h]hunsigned long pfn}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj5ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj1ubj)}(hhh]jM)}(h pfn to inserth]h pfn to insert}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjubj)}(h*``bool write`` whether it's a write fault h](j)}(h``bool write``h]jS)}(hjph]h bool write}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjnubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjjubj)}(hhh]jM)}(hwhether it's a write faulth]hwhether it’s a write fault}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(h@Insert a pud size pfn. See vmf_insert_pfn() for additional info.h]h@Insert a pud size pfn. See vmf_insert_pfn() for additional info.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(hvm_fault_t value.h]hvm_fault_t value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!vmf_insert_folio_pud (C function)c.vmf_insert_folio_pudhNtauh1hhjhhhNhNubh)}(hhh](h)}(hWvm_fault_t vmf_insert_folio_pud (struct vm_fault *vmf, struct folio *folio, bool write)h]h)}(hVvm_fault_t vmf_insert_folio_pud(struct vm_fault *vmf, struct folio *folio, bool write)h](h)}(hhh]j)}(h vm_fault_th]h vm_fault_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jlvmf_insert_folio_pudsbc.vmf_insert_folio_pudasbuh1hhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM3ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj;hM3ubh)}(hvmf_insert_folio_pudh]j)}(hj8h]hvmf_insert_folio_pud}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhj;hM3ubj )}(h7(struct vm_fault *vmf, struct folio *folio, bool write)h](j )}(hstruct vm_fault *vmfh](j5)}(hj8h]hstruct}(hjihhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjeubj)}(h h]h }(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubh)}(hhh]j)}(hvm_faulth]hvm_fault}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j6c.vmf_insert_folio_pudasbuh1hhjeubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjeubj)}(hvmfh]hvmf}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubj )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j6c.vmf_insert_folio_pudasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj#hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubj )}(h bool writeh](j)}(hj-h]hbool}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hwriteh]hwrite}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjaubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhj;hM3ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhj;hM3ubah}(h]j ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhj;hM3hj hhubj4)}(hhh]jM)}(h-insert a pud size folio mapped by a pud entryh]h-insert a pud size folio mapped by a pud entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM3hjhhubah}(h]h ]h"]h$]h&]uh1j3hj hhhj;hM3ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(h**Parameters** ``struct vm_fault *vmf`` Structure describing the fault ``struct folio *folio`` folio to insert ``bool write`` whether it's a write fault **Return** vm_fault_t value.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM7hjubj)}(hhh](j)}(h8``struct vm_fault *vmf`` Structure describing the fault h](j)}(h``struct vm_fault *vmf``h]jS)}(hjh]hstruct vm_fault *vmf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM4hjubj)}(hhh]jM)}(hStructure describing the faulth]hStructure describing the fault}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM4hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM4hjubj)}(h(``struct folio *folio`` folio to insert h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM5hjubj)}(hhh]jM)}(hfolio to inserth]hfolio to insert}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM5hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM5hjubj)}(h*``bool write`` whether it's a write fault h](j)}(h``bool write``h]jS)}(hjAh]h bool write}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj?ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM6hj;ubj)}(hhh]jM)}(hwhether it's a write faulth]hwhether it’s a write fault}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVhM6hjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhM6hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hj|h]hReturn}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM8hjubjM)}(hvm_fault_t value.h]hvm_fault_t value.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM8hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htouch_pmd (C function) c.touch_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(hWbool touch_pmd (struct vm_area_struct *vma, unsigned long addr, pmd_t *pmd, bool write)h]h)}(hVbool touch_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmd, bool write)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMMubh)}(h touch_pmdh]j)}(h touch_pmdh]h touch_pmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMMubj )}(hH(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmd, bool write)h](j )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsb c.touch_pmdasbuh1hhjubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjIhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pmd_t *pmdh](h)}(hhh]j)}(hpmd_th]hpmd_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j7 c.touch_pmdasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpmdh]hpmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h bool writeh](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hwriteh]hwrite}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMMhjhhubj4)}(hhh]jM)}(h;Mark page table pmd entry as accessed and dirty (for write)h]h;Mark page table pmd entry as accessed and dirty (for write)}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMMhjWhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjrjHjrjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct vm_area_struct *vma`` The VMA covering **addr** ``unsigned long addr`` The virtual address ``pmd_t *pmd`` pmd pointer into the page table mapping **addr** ``bool write`` Whether it's a write access **Return** whether the pmd entry is changedh](jM)}(h**Parameters**h]j)}(hj|h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMQhjvubj)}(hhh](j)}(h9``struct vm_area_struct *vma`` The VMA covering **addr** h](j)}(h``struct vm_area_struct *vma``h]jS)}(hjh]hstruct vm_area_struct *vma}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMNhjubj)}(hhh]jM)}(hThe VMA covering **addr**h](hThe VMA covering }(hjhhhNhNubj)}(h**addr**h]haddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jLhjhMNhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMNhjubj)}(h+``unsigned long addr`` The virtual address h](j)}(h``unsigned long addr``h]jS)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMOhjubj)}(hhh]jM)}(hThe virtual addressh]hThe virtual address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMOhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMOhjubj)}(h@``pmd_t *pmd`` pmd pointer into the page table mapping **addr** h](j)}(h``pmd_t *pmd``h]jS)}(hjh]h pmd_t *pmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMPhjubj)}(hhh]jM)}(h0pmd pointer into the page table mapping **addr**h](h(pmd pointer into the page table mapping }(hj4hhhNhNubj)}(h**addr**h]haddr}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jLhj0hMPhj1ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj0hMPhjubj)}(h+``bool write`` Whether it's a write access h](j)}(h``bool write``h]jS)}(hjbh]h bool write}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj`ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMQhj\ubj)}(hhh]jM)}(hWhether it's a write accessh]hWhether it’s a write access}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjwhMQhjxubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhjwhMQhjubeh}(h]h ]h"]h$]h&]uh1jhjvubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMShjvubjM)}(h whether the pmd entry is changedh]h whether the pmd entry is changed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMShjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hzap_huge_pmd (C function)c.zap_huge_pmdhNtauh1hhjhhhNhNubh)}(hhh](h)}(hfbool zap_huge_pmd (struct mmu_gather *tlb, struct vm_area_struct *vma, pmd_t *pmd, unsigned long addr)h]h)}(hebool zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma, pmd_t *pmd, unsigned long addr)h](j)}(hj-h]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM ubh)}(h zap_huge_pmdh]j)}(h zap_huge_pmdh]h zap_huge_pmd}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhM ubj )}(hT(struct mmu_gather *tlb, struct vm_area_struct *vma, pmd_t *pmd, unsigned long addr)h](j )}(hstruct mmu_gather *tlbh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h mmu_gatherh]h mmu_gather}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj>modnameN classnameNjpjs)}jv]jy)}jljsbc.zap_huge_pmdasbuh1hhjubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(htlbh]htlb}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct vm_area_struct *vmah](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hvm_area_structh]hvm_area_struct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jXc.zap_huge_pmdasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hvmah]hvma}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(h pmd_t *pmdh](h)}(hhh]j)}(hpmd_th]hpmd_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jXc.zap_huge_pmdasbuh1hhjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj/hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hpmdh]hpmd}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned long addrh](j)}(hunsignedh]hunsigned}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(hlongh]hlong}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhM ubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhM ubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhM hjhhubj4)}(hhh]jM)}(h$Zap a huge THP which is of PMD size.h]h$Zap a huge THP which is of PMD size.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhM ubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXY**Parameters** ``struct mmu_gather *tlb`` The MMU gather TLB state associated with the operation. ``struct vm_area_struct *vma`` The VMA containing the range to zap. ``pmd_t *pmd`` A pointer to the leaf PMD entry. ``unsigned long addr`` The virtual address for the range to zap. **Return** ``true`` on success, ``false`` otherwise.h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjubj)}(hhh](j)}(hS``struct mmu_gather *tlb`` The MMU gather TLB state associated with the operation. h](j)}(h``struct mmu_gather *tlb``h]jS)}(hjh]hstruct mmu_gather *tlb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjubj)}(hhh]jM)}(h7The MMU gather TLB state associated with the operation.h]h7The MMU gather TLB state associated with the operation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj hM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hM hjubj)}(hD``struct vm_area_struct *vma`` The VMA containing the range to zap. h](j)}(h``struct vm_area_struct *vma``h]jS)}(hj1h]hstruct vm_area_struct *vma}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj/ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hj+ubj)}(hhh]jM)}(h$The VMA containing the range to zap.h]h$The VMA containing the range to zap.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjFhM hjGubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhjFhM hjubj)}(h0``pmd_t *pmd`` A pointer to the leaf PMD entry. h](j)}(h``pmd_t *pmd``h]jS)}(hjjh]h pmd_t *pmd}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjhubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjdubj)}(hhh]jM)}(h A pointer to the leaf PMD entry.h]h A pointer to the leaf PMD entry.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(hA``unsigned long addr`` The virtual address for the range to zap. h](j)}(h``unsigned long addr``h]jS)}(hjh]hunsigned long addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjubj)}(hhh]jM)}(h)The virtual address for the range to zap.h]h)The virtual address for the range to zap.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjubjM)}(h)``true`` on success, ``false`` otherwise.h](jS)}(h``true``h]htrue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh on success, }(hjhhhNhNubjS)}(h ``false``h]hfalse}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubh otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#__split_unmapped_folio (C function)c.__split_unmapped_foliohNtauh1hhjhhhNhNubh)}(hhh](h)}(hint __split_unmapped_folio (struct folio *folio, int new_order, struct page *split_at, struct xa_state *xas, struct address_space *mapping, enum split_type split_type)h]h)}(hint __split_unmapped_folio(struct folio *folio, int new_order, struct page *split_at, struct xa_state *xas, struct address_space *mapping, enum split_type split_type)h](j)}(hinth]hint}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhjQhMubh)}(h__split_unmapped_folioh]j)}(h__split_unmapped_folioh]h__split_unmapped_folio}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubah}(h]h ](jjeh"]h$]h&]jjuh1hhj?hhhjQhMubj )}(h(struct folio *folio, int new_order, struct page *split_at, struct xa_state *xas, struct address_space *mapping, enum split_type split_type)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj|ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljfsbc.__split_unmapped_folioasbuh1hhj|ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj|ubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj )}(h int new_orderh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_orderh]h new_order}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj )}(hstruct page *split_ath](j5)}(hj8h]hstruct}(hj'hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj#ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(hpageh]hpage}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjGmodnameN classnameNjpjs)}jv]jc.__split_unmapped_folioasbuh1hhj#ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj#ubj)}(hsplit_ath]hsplit_at}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj )}(hstruct xa_state *xash](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hxa_stateh]hxa_state}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__split_unmapped_folioasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hxash]hxas}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj )}(hstruct address_space *mappingh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h address_spaceh]h address_space}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj'modnameN classnameNjpjs)}jv]jc.__split_unmapped_folioasbuh1hhjubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjQhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hmappingh]hmapping}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubj )}(henum split_type split_typeh](j5)}(hjh]henum}(hjwhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubh)}(hhh]j)}(h split_typeh]h split_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__split_unmapped_folioasbuh1hhjsubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubj)}(h split_typeh]h split_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjxubeh}(h]h ]h"]h$]h&]jjuh1j hj?hhhjQhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hj;hhhjQhMubah}(h]j6ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjQhMhj8hhubj4)}(hhh]jM)}(hcsplits an unmapped **folio** to lower order folios in two ways: uniform split or non-uniform split.h](hsplits an unmapped }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhG to lower order folios in two ways: uniform split or non-uniform split.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hj8hhhjQhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` the to-be-split folio ``int new_order`` the smallest order of the after split folios (since buddy allocator like split generates folios with orders from **folio**'s order - 1 to new_order). ``struct page *split_at`` in buddy allocator like split, the folio containing **split_at** will be split until its order becomes **new_order**. ``struct xa_state *xas`` xa_state pointing to folio->mapping->i_pages and locked by caller ``struct address_space *mapping`` **folio->mapping** ``enum split_type split_type`` if the split is uniform or not (buddy allocator like split) **Description** 1. uniform split: the given **folio** into multiple **new_order** small folios, where all small folios have the same order. This is done when split_type is SPLIT_TYPE_UNIFORM. 2. buddy allocator like (non-uniform) split: the given **folio** is split into half and one of the half (containing the given page) is split into half until the given **folio**'s order becomes **new_order**. This is done when split_type is SPLIT_TYPE_NON_UNIFORM. The high level flow for these two methods are: 1. uniform split: **xas** is split with no expectation of failure and a single __split_folio_to_order() is called to split the **folio** into **new_order** along with stats update. 2. non-uniform split: folio_order - **new_order** calls to __split_folio_to_order() are expected to be made in a for loop to split the **folio** to one lower order at a time. The folio containing **split_at** is split in each iteration. **xas** is split into half in each iteration and can fail. A failed **xas** split leaves split folios as is without merging them back. After splitting, the caller's folio reference will be transferred to the folio containing **split_at**. The caller needs to unlock and/or free after-split folios if necessary. **Return** 0 - successful, <0 - failed (if -ENOMEM is returned, **folio** might be split but not to **new_order**, the caller needs to check)h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh](j)}(h.``struct folio *folio`` the to-be-split folio h](j)}(h``struct folio *folio``h]jS)}(hj>h]hstruct folio *folio}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj<ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj8ubj)}(hhh]jM)}(hthe to-be-split folioh]hthe to-be-split folio}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjShMhjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjShMhj5ubj)}(h``int new_order`` the smallest order of the after split folios (since buddy allocator like split generates folios with orders from **folio**'s order - 1 to new_order). h](j)}(h``int new_order``h]jS)}(hjwh]h int new_order}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjuubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjqubj)}(hhh]jM)}(hthe smallest order of the after split folios (since buddy allocator like split generates folios with orders from **folio**'s order - 1 to new_order).h](hqthe smallest order of the after split folios (since buddy allocator like split generates folios with orders from }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s order - 1 to new_order).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjhMhj5ubj)}(h``struct page *split_at`` in buddy allocator like split, the folio containing **split_at** will be split until its order becomes **new_order**. h](j)}(h``struct page *split_at``h]jS)}(hjh]hstruct page *split_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(huin buddy allocator like split, the folio containing **split_at** will be split until its order becomes **new_order**.h](h4in buddy allocator like split, the folio containing }(hjhhhNhNubj)}(h **split_at**h]hsplit_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh' will be split until its order becomes }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj5ubj)}(h[``struct xa_state *xas`` xa_state pointing to folio->mapping->i_pages and locked by caller h](j)}(h``struct xa_state *xas``h]jS)}(hj!h]hstruct xa_state *xas}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(hAxa_state pointing to folio->mapping->i_pages and locked by callerh]hAxa_state pointing to folio->mapping->i_pages and locked by caller}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj6hMhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMhj5ubj)}(h5``struct address_space *mapping`` **folio->mapping** h](j)}(h!``struct address_space *mapping``h]jS)}(hjZh]hstruct address_space *mapping}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjXubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjTubj)}(hhh]jM)}(h**folio->mapping**h]j)}(hjuh]hfolio->mapping}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jLhjohMhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohMhj5ubj)}(h[``enum split_type split_type`` if the split is uniform or not (buddy allocator like split) h](j)}(h``enum split_type split_type``h]jS)}(hjh]henum split_type split_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(h;if the split is uniform or not (buddy allocator like split)h]h;if the split is uniform or not (buddy allocator like split)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj5ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj/)}(hhh](j/)}(huniform split: the given **folio** into multiple **new_order** small folios, where all small folios have the same order. This is done when split_type is SPLIT_TYPE_UNIFORM.h]jM)}(huniform split: the given **folio** into multiple **new_order** small folios, where all small folios have the same order. This is done when split_type is SPLIT_TYPE_UNIFORM.h](huniform split: the given }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh into multiple }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhn small folios, where all small folios have the same order. This is done when split_type is SPLIT_TYPE_UNIFORM.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hXbuddy allocator like (non-uniform) split: the given **folio** is split into half and one of the half (containing the given page) is split into half until the given **folio**'s order becomes **new_order**. This is done when split_type is SPLIT_TYPE_NON_UNIFORM. h]jM)}(hXbuddy allocator like (non-uniform) split: the given **folio** is split into half and one of the half (containing the given page) is split into half until the given **folio**'s order becomes **new_order**. This is done when split_type is SPLIT_TYPE_NON_UNIFORM.h](h4buddy allocator like (non-uniform) split: the given }(hj1hhhNhNubj)}(h **folio**h]hfolio}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubhg is split into half and one of the half (containing the given page) is split into half until the given }(hj1hhhNhNubj)}(h **folio**h]hfolio}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh’s order becomes }(hj1hhhNhNubj)}(h **new_order**h]h new_order}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh9. This is done when split_type is SPLIT_TYPE_NON_UNIFORM.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj-ubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]j>0j?0j@0hjA0jB0uh1j/hjubjM)}(h.The high level flow for these two methods are:h]h.The high level flow for these two methods are:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj/)}(hhh](j/)}(huniform split: **xas** is split with no expectation of failure and a single __split_folio_to_order() is called to split the **folio** into **new_order** along with stats update.h]jM)}(huniform split: **xas** is split with no expectation of failure and a single __split_folio_to_order() is called to split the **folio** into **new_order** along with stats update.h](huniform split: }(hjhhhNhNubj)}(h**xas**h]hxas}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhf is split with no expectation of failure and a single __split_folio_to_order() is called to split the }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh into }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh along with stats update.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubah}(h]h ]h"]h$]h&]uh1j/hjubj/)}(hXqnon-uniform split: folio_order - **new_order** calls to __split_folio_to_order() are expected to be made in a for loop to split the **folio** to one lower order at a time. The folio containing **split_at** is split in each iteration. **xas** is split into half in each iteration and can fail. A failed **xas** split leaves split folios as is without merging them back. h]jM)}(hXpnon-uniform split: folio_order - **new_order** calls to __split_folio_to_order() are expected to be made in a for loop to split the **folio** to one lower order at a time. The folio containing **split_at** is split in each iteration. **xas** is split into half in each iteration and can fail. A failed **xas** split leaves split folios as is without merging them back.h](h!non-uniform split: folio_order - }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhV calls to __split_folio_to_order() are expected to be made in a for loop to split the }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh4 to one lower order at a time. The folio containing }(hjhhhNhNubj)}(h **split_at**h]hsplit_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is split in each iteration. }(hjhhhNhNubj)}(h**xas**h]hxas}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh= is split into half in each iteration and can fail. A failed }(hjhhhNhNubj)}(h**xas**h]hxas}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; split leaves split folios as is without merging them back.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubah}(h]h ]h"]h$]h&]uh1j/hjubeh}(h]h ]h"]h$]h&]j>0j?0j@0hjA0jB0uh1j/hjubjM)}(hAfter splitting, the caller's folio reference will be transferred to the folio containing **split_at**. The caller needs to unlock and/or free after-split folios if necessary.h](h\After splitting, the caller’s folio reference will be transferred to the folio containing }(hj\hhhNhNubj)}(h **split_at**h]hsplit_at}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubhI. The caller needs to unlock and/or free after-split folios if necessary.}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(h0 - successful, <0 - failed (if -ENOMEM is returned, **folio** might be split but not to **new_order**, the caller needs to check)h](h50 - successful, <0 - failed (if -ENOMEM is returned, }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh might be split but not to }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, the caller needs to check)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#folio_check_splittable (C function)c.folio_check_splittablehNtauh1hhjhhhNhNubh)}(hhh](h)}(hdint folio_check_splittable (struct folio *folio, unsigned int new_order, enum split_type split_type)h]h)}(hcint folio_check_splittable(struct folio *folio, unsigned int new_order, enum split_type split_type)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMCubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMCubh)}(hfolio_check_splittableh]j)}(hfolio_check_splittableh]hfolio_check_splittable}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMCubj )}(hI(struct folio *folio, unsigned int new_order, enum split_type split_type)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj%hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj!ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubh)}(hhh]j)}(hfolioh]hfolio}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jy)}jlj sbc.folio_check_splittableasbuh1hhj!ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj!ubj)}(hfolioh]hfolio}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int new_orderh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_orderh]h new_order}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum split_type split_typeh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h split_typeh]h split_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j_c.folio_check_splittableasbuh1hhjubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h split_typeh]h split_type}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMCubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMCubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMChjhhubj4)}(hhh]jM)}(h.check if a folio can be split to a given orderh] h.check if a folio can be split to a given order}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMChjYhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMCubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjtjHjtjIjJjKuh1hhhhjhNhNubj)}(hX\**Parameters** ``struct folio *folio`` folio to be split ``unsigned int new_order`` the smallest order of the after split folios (since buddy allocator like split generates folios with orders from **folio**'s order - 1 to new_order). ``enum split_type split_type`` uniform or non-uniform split **Description** folio_check_splittable() checks if **folio** can be split to **new_order** using **split_type** method. The truncated folio check must come first. **Context** folio must be locked. **Return** 0 - **folio** can be split to **new_order**, otherwise an error number is returned.h](jM)}(h**Parameters**h]j)}(hj~h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMGhjxubj)}(hhh](j)}(h*``struct folio *folio`` folio to be split h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMDhjubj)}(hhh]jM)}(hfolio to be splith]hfolio to be split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMDhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMDhjubj)}(h``unsigned int new_order`` the smallest order of the after split folios (since buddy allocator like split generates folios with orders from **folio**'s order - 1 to new_order). h](j)}(h``unsigned int new_order``h]jS)}(hjh]hunsigned int new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMGhjubj)}(hhh]jM)}(hthe smallest order of the after split folios (since buddy allocator like split generates folios with orders from **folio**'s order - 1 to new_order).h](hqthe smallest order of the after split folios (since buddy allocator like split generates folios with orders from }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh’s order - 1 to new_order).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMEhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMGhjubj)}(h<``enum split_type split_type`` uniform or non-uniform split h](j)}(h``enum split_type split_type``h]jS)}(hj"h]henum split_type split_type}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMHhjubj)}(hhh]jM)}(huniform or non-uniform splith]huniform or non-uniform split}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj7hMHhj8ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj7hMHhjubeh}(h]h ]h"]h$]h&]uh1jhjxubjM)}(h**Description**h]j)}(hj]h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMJhjxubjM)}(hfolio_check_splittable() checks if **folio** can be split to **new_order** using **split_type** method. The truncated folio check must come first.h](h#folio_check_splittable() checks if }(hjshhhNhNubj)}(h **folio**h]hfolio}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh can be split to }(hjshhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh using }(hjshhhNhNubj)}(h**split_type**h]h split_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubh3 method. The truncated folio check must come first.}(hjshhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMIhjxubjM)}(h **Context**h]j)}(hjh]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMLhjxubjM)}(hfolio must be locked.h]hfolio must be locked.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMMhjxubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMOhjxubjM)}(hS0 - **folio** can be split to **new_order**, otherwise an error number is returned.h](h0 - }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh can be split to }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh(, otherwise an error number is returned.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMOhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h__folio_split (C function)c.__folio_splithNtauh1hhjhhhNhNubh)}(hhh](h)}(hint __folio_split (struct folio *folio, unsigned int new_order, struct page *split_at, struct page *lock_at, struct list_head *list, enum split_type split_type)h]h)}(hint __folio_split(struct folio *folio, unsigned int new_order, struct page *split_at, struct page *lock_at, struct list_head *list, enum split_type split_type)h](j)}(hinth]hint}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFhhhjXhMubh)}(h __folio_splith]j)}(h __folio_splith]h __folio_split}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubah}(h]h ](jjeh"]h$]h&]jjuh1hhjFhhhjXhMubj )}(h(struct folio *folio, unsigned int new_order, struct page *split_at, struct page *lock_at, struct list_head *list, enum split_type split_type)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljmsbc.__folio_splitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int new_orderh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_orderh]h new_order}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *split_ath](j5)}(hj8h]hstruct}(hjJhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjFubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(hpageh]hpage}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjjmodnameN classnameNjpjs)}jv]jc.__folio_splitasbuh1hhjFubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjFubj)}(hsplit_ath]hsplit_at}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *lock_ath](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hpageh]hpage}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__folio_splitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hlock_ath]hlock_at}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct list_head *listh](j5)}(hj8h]hstruct}(hj*hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj&ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j)}(h list_headh]h list_head}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjJmodnameN classnameNjpjs)}jv]jc.__folio_splitasbuh1hhj&ubj)}(h h]h }(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjF )}(hjI h]h*}(hjthhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj&ubj)}(hlisth]hlist}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(henum split_type split_typeh](j5)}(hjh]henum}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h split_typeh]h split_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jc.__folio_splitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h split_typeh]h split_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjFhhhjXhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjBhhhjXhMubah}(h]j=ah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjXhMhj?hhubj4)}(hhh]jM)}(h6split a folio at **split_at** to a **new_order** folioh](hsplit a folio at }(hjhhhNhNubj)}(h **split_at**h]hsplit_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to a }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh folio}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj hhubah}(h]h ]h"]h$]h&]uh1j3hj?hhhjXhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjJjHjJjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` folio to split ``unsigned int new_order`` the order of the new folio ``struct page *split_at`` a page within the new folio ``struct page *lock_at`` a page within **folio** to be left locked to caller ``struct list_head *list`` after-split folios will be put on it if non NULL ``enum split_type split_type`` perform uniform split or not (non-uniform split) **Description** It calls __split_unmapped_folio() to perform uniform and non-uniform split. It is in charge of checking whether the split is supported or not and preparing **folio** for __split_unmapped_folio(). After splitting, the after-split folio containing **lock_at** remains locked and others are unlocked: 1. for uniform split, **lock_at** points to one of **folio**'s subpages; 2. for buddy allocator like (non-uniform) split, **lock_at** points to **folio**. **Return** 0 - successful, <0 - failed (if -ENOMEM is returned, **folio** might be split but not to **new_order**, the caller needs to check)h](jM)}(h**Parameters**h]j)}(hjTh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM!hjNubj)}(hhh](j)}(h'``struct folio *folio`` folio to split h](j)}(h``struct folio *folio``h]jS)}(hjsh]hstruct folio *folio}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjqubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjmubj)}(hhh]jM)}(hfolio to splith]hfolio to split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhMhjjubj)}(h6``unsigned int new_order`` the order of the new folio h](j)}(h``unsigned int new_order``h]jS)}(hjh]hunsigned int new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh]jM)}(hthe order of the new folioh]hthe order of the new folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjjubj)}(h6``struct page *split_at`` a page within the new folio h](j)}(h``struct page *split_at``h]jS)}(hjh]hstruct page *split_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM hjubj)}(hhh]jM)}(ha page within the new folioh]ha page within the new folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjjubj)}(hM``struct page *lock_at`` a page within **folio** to be left locked to caller h](j)}(h``struct page *lock_at``h]jS)}(hjh]hstruct page *lock_at}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM!hjubj)}(hhh]jM)}(h3a page within **folio** to be left locked to callerh](ha page within }(hj7hhhNhNubj)}(h **folio**h]hfolio}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh to be left locked to caller}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhj3hM!hj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hM!hjjubj)}(hL``struct list_head *list`` after-split folios will be put on it if non NULL h](j)}(h``struct list_head *list``h]jS)}(hjih]hstruct list_head *list}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjgubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM"hjcubj)}(hhh]jM)}(h0after-split folios will be put on it if non NULLh]h0after-split folios will be put on it if non NULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~hM"hjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhj~hM"hjjubj)}(hP``enum split_type split_type`` perform uniform split or not (non-uniform split) h](j)}(h``enum split_type split_type``h]jS)}(hjh]henum split_type split_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM#hjubj)}(hhh]jM)}(h0perform uniform split or not (non-uniform split)h]h0perform uniform split or not (non-uniform split)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhM#hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM#hjjubeh}(h]h ]h"]h$]h&]uh1jhjNubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM%hjNubjM)}(hIt calls __split_unmapped_folio() to perform uniform and non-uniform split. It is in charge of checking whether the split is supported or not and preparing **folio** for __split_unmapped_folio().h](hIt calls __split_unmapped_folio() to perform uniform and non-uniform split. It is in charge of checking whether the split is supported or not and preparing }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh for __split_unmapped_folio().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM$hjNubjM)}(hXAfter splitting, the after-split folio containing **lock_at** remains locked and others are unlocked: 1. for uniform split, **lock_at** points to one of **folio**'s subpages; 2. for buddy allocator like (non-uniform) split, **lock_at** points to **folio**.h](h2After splitting, the after-split folio containing }(hjhhhNhNubj)}(h **lock_at**h]hlock_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh? remains locked and others are unlocked: 1. for uniform split, }(hjhhhNhNubj)}(h **lock_at**h]hlock_at}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh points to one of }(hjhhhNhNubj)}(h **folio**h]hfolio}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@’s subpages; 2. for buddy allocator like (non-uniform) split, }(hjhhhNhNubj)}(h **lock_at**h]hlock_at}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh points to }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM(hjNubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM-hjNubjM)}(h0 - successful, <0 - failed (if -ENOMEM is returned, **folio** might be split but not to **new_order**, the caller needs to check)h](h50 - successful, <0 - failed (if -ENOMEM is returned, }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh might be split but not to }(hjhhhNhNubj)}(h **new_order**h]h new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, the caller needs to check)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM.hjNubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!folio_split_unmapped (C function)c.folio_split_unmappedhNtauh1hhjhhhNhNubh)}(hhh](h)}(hFint folio_split_unmapped (struct folio *folio, unsigned int new_order)h]h)}(hEint folio_split_unmapped(struct folio *folio, unsigned int new_order)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hfolio_split_unmappedh]j)}(hfolio_split_unmappedh]hfolio_split_unmapped}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjhhhjhMubj )}(h-(struct folio *folio, unsigned int new_order)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hj%hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hj!ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubh)}(hhh]j)}(hfolioh]hfolio}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjEmodnameN classnameNjpjs)}jv]jy)}jlj sbc.folio_split_unmappedasbuh1hhj!ubj)}(h h]h }(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF )}(hjI h]h*}(hjqhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hj!ubj)}(hfolioh]hfolio}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int new_orderh](j)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_orderh]h new_order}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjhhhjhMubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjhhhjhMubah}(h]jah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMhjhhubj4)}(hhh]jM)}(h1split a large anon folio that is already unmappedh]h1split a large anon folio that is already unmapped}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjhhubah}(h]h ]h"]h$]h&]uh1j3hjhhhjhMubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX**Parameters** ``struct folio *folio`` folio to split ``unsigned int new_order`` the order of folios after split **Description** This function is a helper for splitting folios that have already been unmapped. The use case is that the device or the CPU can refuse to migrate THP pages in the middle of migration, due to allocation issues on either side. anon_vma_lock is not required to be held, mmap_read_lock() or mmap_write_lock() should be held. **folio** is expected to be locked by the caller. device-private and non device-private folios are supported along with folios that are in the swapcache. **folio** should also be unmapped and isolated from LRU (if applicable) Upon return, the folio is not remapped, split folios are not added to LRU, free_folio_and_swap_cache() is not called, and new folios remain locked. **Return** 0 on success, -EAGAIN if the folio cannot be split (e.g., due to insufficient reference count or extra pins).h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubj)}(hhh](j)}(h'``struct folio *folio`` folio to split h](j)}(h``struct folio *folio``h]jS)}(hj:h]hstruct folio *folio}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj8ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhj4ubj)}(hhh]jM)}(hfolio to splith]hfolio to split}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjOhMhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhMhj1ubj)}(h;``unsigned int new_order`` the order of folios after split h](j)}(h``unsigned int new_order``h]jS)}(hjsh]hunsigned int new_order}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjqubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjmubj)}(hhh]jM)}(hthe order of folios after splith]hthe order of folios after split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhMhj1ubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(hThis function is a helper for splitting folios that have already been unmapped. The use case is that the device or the CPU can refuse to migrate THP pages in the middle of migration, due to allocation issues on either side.h]hThis function is a helper for splitting folios that have already been unmapped. The use case is that the device or the CPU can refuse to migrate THP pages in the middle of migration, due to allocation issues on either side.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(hXAanon_vma_lock is not required to be held, mmap_read_lock() or mmap_write_lock() should be held. **folio** is expected to be locked by the caller. device-private and non device-private folios are supported along with folios that are in the swapcache. **folio** should also be unmapped and isolated from LRU (if applicable)h](h`anon_vma_lock is not required to be held, mmap_read_lock() or mmap_write_lock() should be held. }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is expected to be locked by the caller. device-private and non device-private folios are supported along with folios that are in the swapcache. }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh> should also be unmapped and isolated from LRU (if applicable)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(hUpon return, the folio is not remapped, split folios are not added to LRU, free_folio_and_swap_cache() is not called, and new folios remain locked.h]hUpon return, the folio is not remapped, split folios are not added to LRU, free_folio_and_swap_cache() is not called, and new folios remain locked.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubjM)}(hm0 on success, -EAGAIN if the folio cannot be split (e.g., due to insufficient reference count or extra pins).h]hm0 on success, -EAGAIN if the folio cannot be split (e.g., due to insufficient reference count or extra pins).}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hfolio_split (C function) c.folio_splithNtauh1hhjhhhNhNubh)}(hhh](h)}(hlint folio_split (struct folio *folio, unsigned int new_order, struct page *split_at, struct list_head *list)h]h)}(hkint folio_split(struct folio *folio, unsigned int new_order, struct page *split_at, struct list_head *list)h](j)}(hinth]hint}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMXubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXhhhjjhMXubh)}(h folio_splith]j)}(h folio_splith]h folio_split}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ](jjeh"]h$]h&]jjuh1hhjXhhhjjhMXubj )}(h\(struct folio *folio, unsigned int new_order, struct page *split_at, struct list_head *list)h](j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsb c.folio_splitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hunsigned int new_orderh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinth]hint}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h new_orderh]h new_order}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct page *split_ath](j5)}(hj8h]hstruct}(hj\hhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjXubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubh)}(hhh]j)}(hpageh]hpage}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetj|modnameN classnameNjpjs)}jv]j c.folio_splitasbuh1hhjXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjXubj)}(hsplit_ath]hsplit_at}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubj )}(hstruct list_head *listh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h list_headh]h list_head}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]j c.folio_splitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hjhhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hlisth]hlist}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubeh}(h]h ]h"]h$]h&]jjuh1j hjXhhhjjhMXubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjThhhjjhMXubah}(h]jOah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjjhMXhjQhhubj4)}(hhh]jM)}(h6split a folio at **split_at** to a **new_order** folioh](hsplit a folio at }(hjMhhhNhNubj)}(h **split_at**h]hsplit_at}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh to a }(hjMhhhNhNubj)}(h **new_order**h]h new_order}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh folio}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMXhjJhhubah}(h]h ]h"]h$]h&]uh1j3hjQhhhjjhMXubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hX&**Parameters** ``struct folio *folio`` folio to split ``unsigned int new_order`` the order of the new folio ``struct page *split_at`` a page within the new folio ``struct list_head *list`` after-split folios are added to **list** if not null, otherwise to LRU list **Description** It has the same prerequisites and returns as split_huge_page_to_list_to_order(). Split a folio at **split_at** to a new_order folio, leave the remaining subpages of the original folio as large as possible. For example, in the case of splitting an order-9 folio at its third order-3 subpages to an order-3 folio, there are 2^(9-3)=64 order-3 subpages in the order-9 folio. After the split, there will be a group of folios with different orders and the new folio containing **split_at** is marked in bracket: [order-4, {order-3}, order-3, order-5, order-6, order-7, order-8]. After split, folio is left locked for caller. **Return** 0 - successful, <0 - failed (if -ENOMEM is returned, **folio** might be split but not to **new_order**, the caller needs to check)h](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM\hjubj)}(hhh](j)}(h'``struct folio *folio`` folio to split h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMYhjubj)}(hhh]jM)}(hfolio to splith]hfolio to split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjubj)}(h6``unsigned int new_order`` the order of the new folio h](j)}(h``unsigned int new_order``h]jS)}(hjh]hunsigned int new_order}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMZhjubj)}(hhh]jM)}(hthe order of the new folioh]hthe order of the new folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMZhjubj)}(h6``struct page *split_at`` a page within the new folio h](j)}(h``struct page *split_at``h]jS)}(hj$h]hstruct page *split_at}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj"ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM[hjubj)}(hhh]jM)}(ha page within the new folioh]ha page within the new folio}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj9hM[hj:ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj9hM[hjubj)}(hg``struct list_head *list`` after-split folios are added to **list** if not null, otherwise to LRU list h](j)}(h``struct list_head *list``h]jS)}(hj]h]hstruct list_head *list}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jRhj[ubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM]hjWubj)}(hhh]jM)}(hKafter-split folios are added to **list** if not null, otherwise to LRU listh](h after-split folios are added to }(hjvhhhNhNubj)}(h**list**h]hlist}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh# if not null, otherwise to LRU list}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM\hjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjrhM]hjubeh}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM_hjubjM)}(hPIt has the same prerequisites and returns as split_huge_page_to_list_to_order().h]hPIt has the same prerequisites and returns as split_huge_page_to_list_to_order().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM^hjubjM)}(hXSplit a folio at **split_at** to a new_order folio, leave the remaining subpages of the original folio as large as possible. For example, in the case of splitting an order-9 folio at its third order-3 subpages to an order-3 folio, there are 2^(9-3)=64 order-3 subpages in the order-9 folio. After the split, there will be a group of folios with different orders and the new folio containing **split_at** is marked in bracket: [order-4, {order-3}, order-3, order-5, order-6, order-7, order-8].h](hSplit a folio at }(hjhhhNhNubj)}(h **split_at**h]hsplit_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhXj to a new_order folio, leave the remaining subpages of the original folio as large as possible. For example, in the case of splitting an order-9 folio at its third order-3 subpages to an order-3 folio, there are 2^(9-3)=64 order-3 subpages in the order-9 folio. After the split, there will be a group of folios with different orders and the new folio containing }(hjhhhNhNubj)}(h **split_at**h]hsplit_at}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhY is marked in bracket: [order-4, {order-3}, order-3, order-5, order-6, order-7, order-8].}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMahjubjM)}(h-After split, folio is left locked for caller.h]h-After split, folio is left locked for caller.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMihjubjM)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMkhjubjM)}(h0 - successful, <0 - failed (if -ENOMEM is returned, **folio** might be split but not to **new_order**, the caller needs to check)h](h50 - successful, <0 - failed (if -ENOMEM is returned, }(hj*hhhNhNubj)}(h **folio**h]hfolio}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh might be split but not to }(hj*hhhNhNubj)}(h **new_order**h]h new_order}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh, the caller needs to check)}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMlhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h min_order_for_split (C function)c.min_order_for_splithNtauh1hhjhhhNhNubh)}(hhh](h)}(h6unsigned int min_order_for_split (struct folio *folio)h]h)}(h5unsigned int min_order_for_split(struct folio *folio)h](j)}(hunsignedh]hunsigned}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMwubj)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMwubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMwubh)}(hmin_order_for_splith]j)}(hmin_order_for_splith]hmin_order_for_split}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1hhjyhhhjhMwubj )}(h(struct folio *folio)h]j )}(hstruct folio *folioh](j5)}(hj8h]hstruct}(hjhhhNhNubah}(h]h ]jAah"]h$]h&]uh1j4hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hfolioh]hfolio}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjAreftypejl reftargetjmodnameN classnameNjpjs)}jv]jy)}jljsbc.min_order_for_splitasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF )}(hjI h]h*}(hj"hhhNhNubah}(h]h ]jR ah"]h$]h&]uh1jE hjubj)}(hfolioh]hfolio}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j hjubah}(h]h ]h"]h$]h&]jjuh1j hjyhhhjhMwubeh}(h]h ]h"]h$]h&]jjj%uh1hj&j'hjuhhhjhMwubah}(h]jpah ](j+j,eh"]h$]h&]j0j1)j2huh1hhjhMwhjrhhubj4)}(hhh]jM)}(h/get the minimum order **folio** can be split toh](hget the minimum order }(hjYhhhNhNubj)}(h **folio**h]hfolio}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubh can be split to}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMwhjVhhubah}(h]h ]h"]h$]h&]uh1j3hjrhhhjhMwubeh}(h]h ](jAfunctioneh"]h$]h&]jFjAjGjjHjjIjJjKuh1hhhhjhNhNubj)}(hXF**Parameters** ``struct folio *folio`` folio to split **Description** min_order_for_split() tells the minimum order **folio** can be split to. If a file-backed folio is truncated, 0 will be returned. Any subsequent split attempt should get -EBUSY from split checking code. **Return** **folio**'s minimum order for splith](jM)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM{hjubj)}(hhh]j)}(h'``struct folio *folio`` folio to split h](j)}(h``struct folio *folio``h]jS)}(hjh]hstruct folio *folio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jRhjubah}(h]h ]h"]h$]h&]uh1jhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMxhjubj)}(hhh]jM)}(hfolio to splith]hfolio to split}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhMxhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMxhjubah}(h]h ]h"]h$]h&]uh1jhjubjM)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMzhjubjM)}(hmin_order_for_split() tells the minimum order **folio** can be split to. If a file-backed folio is truncated, 0 will be returned. Any subsequent split attempt should get -EBUSY from split checking code.h](h.min_order_for_split() tells the minimum order }(hjhhhNhNubj)}(h **folio**h]hfolio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh can be split to. If a file-backed folio is truncated, 0 will be returned. Any subsequent split attempt should get -EBUSY from split checking code.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chMyhjubjM)}(h **Return**h]j)}(hj h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM}hjubjM)}(h#**folio**'s minimum order for splith](j)}(h **folio**h]hfolio}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh’s minimum order for split}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1jLhQ/var/lib/git/docbuild/linux/Documentation/core-api/mm-api:135: ./mm/huge_memory.chM~hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] more-memory-management-functionsah ]h"] more memory management functionsah$]h&]uh1hhhhhhhhK`ubeh}(h]memory-management-apisah ]h"]memory management apisah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehʌ _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}j@]j5asnameids}(jgjdjFjCjEj@jDjAj-j*jjj(j%j<j9jrjrjjjjjjjjj#j#jjjjj_j\u nametypes}(jgjFjEjDj-jj(j<jrjjjjj#jjj_uh}(jdhjChhhjjjjjjjjj j j j j@jIjAjIj*jZjj0j%jj9j+jrjLjijnjPjUjjjMjRjjj jj$j$jG'jL'j+j+j-j-j}0j0j`5je5j7j7j9j9j1<j6<j=j=j?j?j@jAj@CjECj@FjEFjGjGjWIj\IjLjLjFPjKPjQjQjTjTjVjVjcXjhXjYjYjt[jy[j\j\j^j^jbjbj?gjDgjhkjmkjmj#mjnjnjpjpjjrj7rjujCuj xjxjyjyjo{jt{j j%jˁjЁjDžj̅jjjIjNjjjjjjjjjjjQjVjjjjjjjݜjjjj\jajjjۦjjjj&j+j߮jjjjajfjDjIj,j1jejjj jj"j'jjj3j8jj jjjUjZjjjjjZj_jjjjj-j2jjjmjrjjj(j-j@jEjjjjjj!jjjijnjjjjj5j:jjj#jjjjbjgjjju jz j j jjjjjIjNjjjZj_jjjjj8 j= j"j "jj#j#j#jl&jq&j)j!)jW+j\+j,j,j/j/jx2j}2j 4j%4j16j66jT8jY8j:j:ji=jn=jg?jl?jxAj}Aj CjCjDjDjFjFjFHjKHjvJj{Jj8Lj=LjNjNjOjOjQjQjSjSjUjUjWjWjBYjGYj\j\js_jx_j"bj'bjdjdj,gj1gjijij2mj7mj~ojoj-qj2qjrjrj@ujEujwjwjDzjIzj{j{j~j~jjjjƄjjjFjKjjjj‹jjj8j=jjjj!jjjjj#j(jjj>jCjǡj̡j:j?jjj%j*jڨjߨjjj<jAj}jjjjշjڷjtjyj;j@jjj\jjjjjj=jBjbjgjjjjjjjjjjjvj{jfjkjhjmjjjj!jjjjjhjmj*j/jjjjj^jcjjjjjjjQjVj j j j jjjZj_j.j3jjj9j>jXj]jjjjjjj!j!jD$jI$j'j'j+j+j-j-j/j/j1j1j3j3j>6jC6j8j9j<j<jC@jH@jBjBjEjEjGjHjrJjwJj Mj&MjPNjUNj*Wj/Wj\j\jF]jK]j ajajejejgjgjhjhjjjjjmj mjonjtnjojojrjrjsjsj9uj>ujvjwjxjxjAzjFzj|j|j[}j`}j~j~jȀj̀jjj(j-jjjjj*j/jNJj̊jHjMjjjj jjj&j+jjjjjnjsjśjʛjj!jsjxjVj[jjjjjhjmjjjjjjj;j@jXj]jjjnjsjjjpjuj jjPjUjѽjֽj)j.jpjujjjjjjjjjjjjjjjjjjj jjzjj jj(j-jjjjjjjjj4j9jjjjjjjjjj"j jjjjkjpjQjVjjjjjqjvj j jLjQj(j-jjjjjjjrjwj"j"j&j&j*j*j`-je-jB0jG0j$3j)3jt6jy6jV9j[9j8<j=<j|>j>j@j@jDjDjIjIjKjKj0Mj5MjAPjFPjSjSjyWj~Wj![j&[jbjbjtejyejgjgj%kj*kjLnjQnjpjpjsjsjujujwjwjxjxjzj#zj{j{j}j}j~j~jjjjjjjJjOjjjfjkjxj}jjj jjjjjjjjjj jjIjNjjjjjjj jjjjjjtjyjMjRjjj jjjjjjѹjֹjjj̼jѼjRjWjVj[jjjjjjjjj jjjjj j`jejjjjj]jbj&j+j6j;jjjujzjjjjjj$jjjjjjjjjjjQjVjjjjjjjjjWj\j j j j jjjjjOjTjjjjj jj,j1jE jJ j"j"jT$jY$j%j%j(j(j*j*j<,jA,j_/jd/jw1j|1j4j4j`7je7j,=j1=j'?j,?jAjAj DjDj`GjeGjIjIjKj KjAMjFMjOjOjQjQjlSjqSjUjUj5Xj:Xj3[j8[j7^j<^jajajcjcjfjfjhjhjkjkjljlj!pj&pjqjqjrjrj;tj@tjujujXwj]wj"yj'yj{j{jO}jT}j~j~j8j=jQjVjjjjjjj@jEjjjjjj#jjj.j3jjj`jejjjjjvj{jjjjjjj˳jгjDjIjjjVj[jjjjjjjRjWjjjjjCjHjjjjj]jbjjjjjXj]j jjjjjj6j;jjj=jBjjjOjTjpjuu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages]hsystem_message)}(hhh]jM)}(hhh]h6Hyperlink target "mm-api-gfp-flags" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehʌlineKuh1juba transformerN include_log] decorationNhhub.